这些物体是否相等?

时间:2011-10-11 18:33:41

标签: javascript mootools

var Widget = new Class({
    Implements: Options,
    options: {
        color: '#fff',
        size: {
            width: 100,
            height: 100
        }
    },
    initialize: function(options){
        this.setOptions(options);
    }
});

var myWidget = new Widget({
    color: '#f00',
    size: {
        width: 200
    }
});

//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}

// Deep copy example
var mySize = {
    width: 50,
    height: 50
};

var myWidget = new Widget({
    size: mySize
});

(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.

来自here

myWidget.options.size也应该是

 {
        width: 50,
        height: 50
    };

为什么(mySize == myWidget.options.size)// false! ?

4 个答案:

答案 0 :(得分:2)

不明显,但您从示例中复制的注释会告诉您原因。

// false! mySize was copied in the setOptions call.

对象的等于是实例。 setOptions复制mySize。它在初始化时运行。

initialize: function(options){
    this.setOptions(options);
}

除非你提出一个我错过的更复杂的问题。

答案 1 :(得分:1)

这样的东西不起作用,因为它不会检查对象的值,而是检查对象的身份:

({width:1, height:1}) == ({width:1, height:1})

因此,如果你想比较两个对象,你必须写出类似的东西

obj1.width == obj2.width && obj1.height == obj2.height;

答案 2 :(得分:0)

比较2个对象是没有意义的,如@styrr所述,但你可以比较对象的序列化表示:

console.log(JSON.encode(mySize) === JSON.encode(myWidget.options.size)); // true 

虽然你最好比较个别价值,但它更便宜。

另外,请查看Object.clone()取消引用。默认情况下,对象通过引用传递,但在选项的情况下,它们被解除引用。 I.E.如果您更改mySize.width,则不会更改instance.options.size.width,这是您可以正常获得的。

答案 3 :(得分:0)

使用underscorejs.js isEqual来比较JSON对象http://underscorejs.org/#isEqual