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

nop*_*ole 6 javascript

以下是在Firebug中完成的:

>>> [1, 2] == [1, 2]
false

>>> ({a : 1}) == ({a : 1})
false
Run Code Online (Sandbox Code Playgroud)

我认为Javscript有一些规则说,如果一个Object或Array对相同的元素具有相同的引用,那么它们是相等的吗?

但即使我说

>>> foo = {a : 1}
Object { a=1}

>>> [foo] == [foo]
false

>>> ({a: foo}) == ({a: foo})
false
Run Code Online (Sandbox Code Playgroud)

有没有办法使它能够进行元素比较并返回true

Ray*_*nos 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]);
  });
};
Run Code Online (Sandbox Code Playgroud)

equals

警告:写一个平等的功能"作品"上的所有投入是很难的,一些常见的问题(null == undefined) === true(NaN === NaN) === false这两者都不我在功能gaurd的.

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