题目:
var a = {};
var b = {key:'b'};
var c = {key:'c'};
a[b] = 123;
a[c] = 456;
console.log(a[b]);
上面代码会输出什么?
答案是:456
为什么?
这里牵扯到这几个知识点:
- 对象的属性名类型
- a.key和a[key]的区别
- [对象].toString()的结果
对象的属性名类型
对象的属性名类型只能有两种,分别是String和Symbol,如果新增的属性的类型不是两种中的任意一种,那么就会调用toString()方法将其转换成string类型
[对象].toString()的结果
设有一个对象obj,obj.toString()的结果是[object,object]
a.key和a[key]的区别
假设有一个对象a
let a = {key:'a'}
执行a.key实际上会获取a中属性名为key
的属性,这里的key
是一个字符串,实际上就是获取a[‘key’]
而执行a[key],会去寻找名为key
的变量,所以a[key] !== a[‘key’]
let a = {key:'a'};
console.log(a.key);//'a'
console.log(a['key']);//'a'
console.log(a[key]);//error
弄懂了这几个知识点了,我们就可以知道刚刚代码的结果了
-
由于b和c都是对象,所以调用a[b]或a[c]都会将执行对象的toString方法,a[b]等价于a[‘[object,object]’],a[c]等价于a[‘[object,object]’]
所以上方代码都是对a[‘[object,object]’]进行重新赋值
最终会输出456