为什么Knockout.js的默认相等比较器将非原始类型视为不相等?

Dav*_*vy8 11 knockout.js

从Knockout v2.1.0调试源代码:

ko.observable['fn'] = {
    "equalityComparer": function valuesArePrimitiveAndEqual(a, b) {
        var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes);
        return oldValueIsPrimitive ? (a === b) : false;
    }
};
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不直观,但必须有一些理由让史蒂夫桑德森不顾一切地定义这个.为什么会这样呢?它似乎不必要地触发更改通知.

RP *_*yer 4

这样做是因为如果您有一个包含对象的可观察对象,Knockout 不知道子属性是否已更改。

此时,我们会在对象的某个属性发生更改时触发通知。

  • 对我来说,这似乎是一个非常有限的用例,对我来说,这是意想不到的行为,我必须查看源代码才能理解。这是使用 KO 时经常出现的问题吗?似乎正常的相等性检查只会给那些不了解对象相等性如何工作的人带来问题。 (3认同)