繁体   English   中英

当两个数组具有相同的值时,为什么它们对吸气剂“相等”?

[英]Why two arrays are “equal” for getter when they have the same values?

我想为包装Map对象提供一个自定义的getter和setter方法。 当我使用数组作为键的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

如您所见,传递给getter的内容是否与我期望的相同并不重要。 它只检查它是否具有相同的值,这对我来说有点奇怪。 您能解释一下为什么会这样吗?

提前致谢!

编辑当您直接访问地图时,它将返回预期结果。

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

arr1arr2都是具有[1]内容的数组,当您toString() this时,将得到"1"

arr3中的arr3将类似地使您获得"2" 因此, arr1arr2映射到名称为"1"的同一个属性,而arr3则指向另一个属性。

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

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

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM