能否请您解释一下下面的代码中发生了什么?为什么两个表达式都具有相同的值?
let a = {};
let b = {
value: 'b'
};
let c = {
value: 'c'
};
a[b]=123;
a[c]=456;
console.log(a[b], a[c]); // ==> 456 456
欢迎访问学习材料的任何链接
答案 0 :(得分:3)
对象键只能是字符串。将 object 放在计算属性中时,它将被字符串化为a[b]
,因此a[c]
与a['[object Object]']
:let a = {};
let b = {
value: 'b'
};
let c = {
value: 'c'
};
a[b]=123;
a[c]=456;
console.log(a);
相同。
[object Object]
因此,对const a = new Map();
let b = {
value: 'b'
};
let c = {
value: 'c'
};
a.set(b, 123);
a.set(c, 456);
console.log(a.get(b));
console.log(a.get(c));
键的最后分配456将覆盖先前的123分配(并且结果对象仅具有一个键)。
如果您想安全地将对象用作“键”,请改用Map,其键可以是任何类型,而不仅仅是字符串:
Event
答案 1 :(得分:0)
非常简单:
完成时
a
您将对象设置为属性名称toString()
。
问题是,属性名称是一个字符串,因此在b
和c
(它们是对象)上调用let a = {};
let b = {
value: 'b'
};
let c = {
value: 'c'
};
a[b]=123;
a[c]=456;
console.log(a[b], a[c]); // ==> 456 456
console.log(a);
,它们的值相同。你明白了吗?
{{1}}
答案 2 :(得分:0)
在a[b] = //...
表达式中,b
被强制转换为字符串-转换的结果是字符串"[object Object]"
。它与c
的值相同。
let a = {};
let b = {
value: 'b'
};
let c = {
value: 'c'
};
a[b]=123;
a[c]=456;
console.log(b.toString());
console.log(c.toString());
console.log(a);
答案 3 :(得分:0)
因为对象的键可以是字符串,并且您试图将一个对象分配为键,所以js将对象类型转换为字符串,并且键对于这两个对象都成为[对象对象]。这就是为什么针对同一键更新值的原因。