为什么两个数组相等"对于具有相同值的吸气剂?

时间:2016-09-07 16:03:00

标签: javascript

我想为我的对象设置一个自定义的getter和setter方法,它包装Map。 不知何故,当我使用数组作为键getter时,它们具有相同的值时表现相同。即使它们是两个不同的参考。 (在FF和Chrome中测试过)。

JSFIDDLE

var Cons = function (){
  this.data = new Map();
};

Cons.prototype.initialiseGetterAndSetter = function initialiseGetterAndSetter(prop){
  Object.defineProperty(this, prop, {
    get: function(){
      return this.data.get(prop);
    },
    set: function(val){
      this.data.set(prop, val);
    }
  });
};

var obj = new Cons();

var arr1 = [1];
var arr2 = [1];
var arr3 = [2];

obj.initialiseGetterAndSetter(arr1);

obj[arr1] = 1;

document.getElementById('box1').innerText = obj[arr1]; // 1 as expected
document.getElementById('box2').innerText = obj[arr2]; // expected undefined but got 1
document.getElementById('box3').innerText = obj[arr3]; // undefined as expected

正如你所看到的,如果你把它传递给吸气剂并不重要,那就和我期待的相同。它只检查它是否具有相同的值,这对我来说很奇怪。你能解释一下为什么它会这样吗?

提前致谢!

修改 当您直接访问地图时,它会返回预期的结果。

2 个答案:

答案 0 :(得分:2)

JavaScript对象上的属性名称是字符串,当您使用字符串以外的名称作为名称时,它首先被转换为字符串。

arr1arr2都是内容为[1]的数组,当您toString()时,您获得"1"

arr3中的数组同样会为您提供"2"。因此arr1arr2映射到同一属性,名称为"1",而arr3则为另一个属性。

答案 1 :(得分:1)

对象属性名称只能是字符串值。当您致电Object.defineProperty()时,它会将您的prop值强制转换为字符串(在这种情况下,arr1arr2都会被强制转换为相同的值。

当您尝试使用obj[arr1]obj[arr2]访问对象属性时会发生同样的情况。

如果您希望对象公开地图,请为其提供访问该地图的成员。对象属性不会像您尝试使用它们那样工作:

var Cons = function (){
  this.data = new Map();

  this.get = function (key) { return this.data.get(key); };
  this.set = function (key, value) { this.data.set(key, value); };
};


// further down...

obj.set(arr1, 1);