js 对象的key值

380 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

首先看看有点小坑的面试题。

// 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]'],所以后面的赋值重写了前面的赋值。