今天在一个技术交流群里面看到这样一个问题:
var a={},
b={key:‘b’},
c={key:‘c’};
a[b]=123;
a[c]=456;
console.log(a[b]);//为什么是456?
我也不懂什么原理,打印确实是456,那么一起来搞搞,看他为什么是456吧。
- 开始猜测是属性值的覆盖,因为我也打印a[c]了,结果也是456,在查阅文档之后发现我是瞎猫碰上死耗子,a[b]的值为456是因为b跟c都是对象,而普通对象的属性名如果是对象的话要先转为字符串,那这样下来的话,就是用b或者c作为属性名的话,每次都是 object object了,只是给他两次赋值而已,话不多说,上分析代码:
var a = {};
var b = { key: "a" };
var c = { key: "c" };
//b要作为属性名先转为字符串,相当于:a[object Object]:="123"
a[b] = "123";
//打印一下a,此时a只有一个属性名为object Object,属性值为123的键值对
console.log(a) //{[object Object]: "123"}
//同上,c要作为属性名先转为字符串,相当于:a[object Object]:="456"
a[c] = "456";
//再打印一下a,此时a还是只有一个属性名为object Object,属性值为456的键值对
console.log(a) //{[object Object]: "456"}
//上面的a[c] = "456"只是给a[object Object]重新赋值而已。
//打印a[b]其实就是在打印a[object Object],由于他的最一次的赋值为456。
//故:
console.log(a[b]);//456
可能有点繁琐,看张图好理解一些
以上就是我的分析了,看完文档再理解是不是很简单