在Javascript中,为什么[1,2] == [1,2]或({a:1})==({a:1})为假?

时间:2011-10-10 13:51:21

标签: javascript

以下是在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

4 个答案:

答案 0 :(得分:6)

{ }[ ]new Objectnew 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]);
  });
};

equals example

警告:编写一个对所有输入“有效”的相等函数很难,一些常见的问题是(null == undefined) === true(NaN === NaN) === false我在我的函数中都没有找到它。

我没有处理任何跨浏览器问题,我只是假设ES5存在。

答案 1 :(得分:2)

要查看您正在讨论的深度平等所需的代码类型,请查看Underscore.js's _.isEqual functionQUnit'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

如果要测试数组相等性,可能需要使用某个库,或者自己编写测试。