var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
输出是456。
为什么输出的不是123?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
输出是456。
为什么输出的不是123?
b、c单独做键回调用toString得到[object Object],a[b]、a{c]都等价为a["[object Object]"],就相当于更新了[object Object]这个键的值,所以咯,你可以试试把赋值反过来,看看是不是更新成123
自信跟你说下
问题出在a[b]和a[c]这里 这里面的b c 都是键名,但是键名不能是对象(你前面声明变量b c是对象)
所以b c作为键名就调用了toString方法变成了[object Object]
那么你的代码就变成了
a["[object Object]"]=123;
a["[object Object]"]=456;
//没有a[b]也没有a[c] 他们都变成了a["[object Object]"]
之后无论你打印a[b] 还是 a[c]都是打印a["[object Object]"]
a["[object Object]"] 你最后赋值为456 当然就打印456了
13 回答13.1k 阅读
7 回答2.3k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
a 是一个 json 对象,a[b] 赋值的方式相当于 {b:},json的key只能是字符串,所以 a[b] 时会将 b转为字符串,而对象转为字符串是
[object Object]
所以 a[b] 和 a[c] 其实都是同一个属性 ,a 就是{'[object Object]': XX}
设置值时后设置的会覆盖之前设置的值,所以会输出 456