Javascript 为什么两个数组是;“相等”;对于getter,当它们具有相同的值时?
我想为我的对象提供一个定制的getter和setter方法,它包装Javascript 为什么两个数组是;“相等”;对于getter,当它们具有相同的值时?,javascript,Javascript,我想为我的对象提供一个定制的getter和setter方法,它包装Map。 不知何故,当我使用数组作为键getter时,当它们具有相同的值时,它们的行为是相等的。尽管它们是两个不同的参考。(在FF和铬中测试) 正如你所看到的,如果你传递给getter的是我所期望的相同的引用,这并不重要。它只检查它是否有相同的值,这对我来说有点奇怪。你能解释一下它为什么会这样吗 提前谢谢 编辑 当您直接访问映射时,它将返回预期结果。JavaScript对象上的属性名称是字符串,当您使用字符串以外的名称时,它首先
Map
。
不知何故,当我使用数组作为键getter
时,当它们具有相同的值时,它们的行为是相等的。尽管它们是两个不同的参考。(在FF和铬中测试)
正如你所看到的,如果你传递给getter的是我所期望的相同的引用,这并不重要。它只检查它是否有相同的值,这对我来说有点奇怪。你能解释一下它为什么会这样吗
提前谢谢
编辑
当您直接访问映射时,它将返回预期结果。JavaScript对象上的属性名称是字符串,当您使用字符串以外的名称时,它首先转换为字符串
arr1
和arr2
都是包含[1]
内容的数组,当您toString()
这样做时,您将得到“1”
arr3
中的数组同样会得到“2”
。因此,arr1
和arr2
映射到同一个属性,名称为“1”
,而arr3
映射到另一个属性。JavaScript对象上的属性名称是字符串,当您使用字符串以外的名称作为名称时,它首先转换为字符串
arr1
和arr2
都是包含[1]
内容的数组,当您toString()
这样做时,您将得到“1”
arr3
中的数组同样会得到“2”
。因此,arr1
和arr2
映射到相同的属性,名称为“1”
,而arr3
映射到不同的属性。对象属性名称只能是字符串值。调用Object.defineProperty()
时,它会将prop
值强制为字符串(在这种情况下,arr1
和arr2
都强制为相同的值
当您尝试使用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);
对象属性名称只能是字符串值。当调用
Object.defineProperty()
时,它会将prop
值强制为字符串(在这种情况下,arr1
和arr2
都强制为相同的值
当您尝试使用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);
它可能会将键转换为字符串并使用
'1'
。它可能会将键转换为字符串并使用'1'
。这就是原因。奇怪的是,当getter中的Iconsole.log(prop)
显示数组时会发生这种情况,但在这种情况下它应该记录字符串。这并不奇怪。您的console.log()
行正在访问get
和set
闭包范围内的实际prop
值,该闭包最初被传递到initialiseGetterAndSetter()
。是的,这就是原因。奇怪的部分发生在Iconsole.log(prop)中
在getter中,它显示数组,但在这种情况下它应该记录字符串。这并不奇怪。您的console.log()
行正在访问实际的prop
值,该值位于get
和set
闭包的范围内,该闭包最初被传递到initialiseGetterAndSetter()
中。