本文已参与「新人创作礼」活动,一起开启掘金创作之路
首先看看有点小坑的面试题。
// example 1
var a={}, b='123', c=123;
a[b]='b';
a[c]='c';
console.log(a[b]); // c
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');
a[b]='b';
a[c]='c';
console.log(a[b]); // b
// example 3
var a={}, b={key:'123'}, c={key:'456'};
a[b]='b';
a[c]='c';
console.log(a[b]); // c
example 1 是 string 和 number 作为对象的 key 值,当使用 obj[expression] 时,首先算出 expression 的值,然后调用它的toString()方法,所以,a[c]='c' 相当于 a['123'] = 'c',重写了 a[b]='b';
example 2 以Symbol作为key值,Symbol的每个实例都是一个唯一的值,b=Symbol('123') 这里的'123'是描述的文字,不影响输出。并且作为对象的key时跟string类型一样不会调用toString(),所以 example 2 中 a[b] 和 a[c]是不同的属性。
example 3 以对象作为key值,对象调用toString()变成'[object Object]',a[b] 和 a[c] 都是 a['[object Object]'],所以后面的赋值重写了前面的赋值。