以下是在Firebug中完成的:
>>> [1, 2] == [1, 2]
false
>>> ({a : 1}) == ({a : 1})
false
我认为Javscript有一些规则说,如果一个Object或Array对相同的元素有相同的引用,那么它们是相同的吗?
但即使我说
>>> foo = {a : 1}
Object { a=1}
>>> [foo] == [foo]
false
>>> ({a: foo}) == ({a: foo})
false
有没有办法让它可以进行元素比较并返回true
?
答案 0 :(得分:6)
{ }
和[ ]
与new Object
和new Array
new Object != new Object
(与Array
同上),因为它们是新的和不同的对象。
如果你想知道两个仲裁对象的内容对于某个值是否相同,那么快速(但很慢)的修复是
JSON.parse(o) === JSON.parse(o)
更优雅的解决方案是定义一个相等的功能(未经测试)
var equal = function _equal(a, b) {
// if `===` or `==` pass then short-circuit
if (a === b || a == b) {
return true;
}
// get own properties and prototypes
var protoA = Object.getPrototypeOf(a),
protoB = Object.getPrototypeOf(b),
keysA = Object.keys(a),
keysB = Object.keys(b);
// if protos not same or number of properties not same then false
if (keysA.length !== keysB.length || protoA !== protoB) {
return false;
}
// recurse equal check on all values for properties of objects
return keysA.every(function (key) {
return _equal(a[key], b[key]);
});
};
警告:编写一个对所有输入“有效”的相等函数很难,一些常见的问题是(null == undefined) === true
和(NaN === NaN) === false
我在我的函数中都没有找到它。
我没有处理任何跨浏览器问题,我只是假设ES5存在。
答案 1 :(得分:2)
要查看您正在讨论的深度平等所需的代码类型,请查看Underscore.js's _.isEqual
function或QUnit's deepEqual
implementation。
答案 2 :(得分:0)
因为javascript对象文字不共享相同的指针。而是为每个指针创建一个新指针。请考虑以下示例:
>>> ({a : 1}) == ({a : 1})
false
......但......
>>> obj = ({a : 1});
Object
>>> obj == obj
true
obj
是指向对象{ a : 1 }
的指针。所以这可行,因为比较它们时指针是相同的
答案 3 :(得分:0)
您正在比较不同的对象。
>>> var a = [1,2] var b = [1,2]
>>> a == b
false
>>> a == a
true
如果要测试数组相等性,可能需要使用某个库,或者自己编写测试。