[英]Why two arrays are “equal” for getter when they have the same values?
我想为包装Map
对象提供一个自定义的getter和setter方法。 当我使用数组作为键的getter
时,以某种方式在它们具有相同值时表现为相等。 即使它们是两个不同的引用。 (在FF和Chrome中测试)。
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对象上的属性名称是字符串,当您使用字符串以外的名称作为名称时,会首先将其转换为字符串。
arr1
和arr2
都是具有[1]
内容的数组,当您toString()
this时,将得到"1"
。
arr3
中的arr3
将类似地使您获得"2"
。 因此, arr1
和arr2
映射到名称为"1"
的同一个属性,而arr3
则指向另一个属性。
对象属性名称只能是字符串值。 当您调用Object.defineProperty()
,它将把您的prop
值强制转换为字符串(在这种情况下, arr1
和arr2
都被强制转换为相同的值。
当您尝试使用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.