为什么Knockout.js';s的默认相等比较器是否将非基元类型视为不相等?

为什么Knockout.js';s的默认相等比较器是否将非基元类型视为不相等?,knockout.js,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

从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;
    }
};

这对我来说似乎不太直观,但一定有某种原因史蒂夫·桑德森特意去定义这一点。为什么会这样?它似乎不必要地触发了更改通知。

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


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

如果您有一个可观察对象,它持有一个对象,您可以创建一个自定义equalityComparer,根据需要返回equality。只需在要自定义的可观察实例上设置属性。签名为:

myObservable["equalityComparer"] = function(a, b){ 
  return a===b;// Or any arbitrary comparison
};

现在,当函数返回false时,您的可观察对象只会引发更改事件。

这是否只会在可观察对象再次设置为相同值的情况下有所帮助?例如,如果你有
var obj={name:'David'};var x=可观测的ko(obj)obj.name='Bob'只有在调用
x(obj)时才会触发通知之后它是否会通知更改正确?对,这是正确的。您还可以调用
x.valueHasMutated()
,这对我来说似乎是一个非常有限的用例,对我来说,这是一个意外的行为,我必须查看源代码才能理解。这是一个在使用KO时经常出现的问题吗?正常的相等性检查似乎只会给那些不了解对象相等性如何工作的人带来问题。它只是表明Knockout无法判断对象自上次绑定以来是否发生了更改,最好通知订阅者。在一个复杂的应用程序中,甚至可能存在间接寻址的情况,在这种情况下,您甚至没有意识到/关心您实际上是在为同一个对象设置一个可观察对象。好问题!也许我只是不太理解KO,但是,上面的代码是如何触发更改通知的?