这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
对象里面的属性
看一个某大厂的经典面试题,问最后的结果是什么?
var a = {},
b = { key: 'b' },
c = { key: 'c' }
a[b] = 123
a[c] = 456
console.log(a[b]);
分析这道题之前我们要弄懂一个问题
我们要知道 a[b] 代表什么意思。 比如
var a = {}
var b = 'abc'
a[b] = '123'
console.log(a[b]);
这个东西指的就是以b的值>也就是'abc'作为属性的名字存在一个变量a中
也就是说a[b]等同于:
a.abc = '123'
console.log(a['abc']); //123
验证一下:
var a = {}
var b = 'abc'
a[b] = '123'
console.log(a.abc); //123
//你也可以:
console.log(a['abc']); //123
这个了解之后再来看这个:
var a = {},
b = { key: 'b' }
a[b] = 123
console.log(a[b]);
b的值是一个对象,那对象能作为属性的名字吗?
其实在js中对象的名字类型只有两种String,和Symbol 。
Symbol是es6新增的一个类型,作用是生成一个全局唯一的值(和这道题没什么关系,感兴趣的小伙伴可以自己查阅),
如果没有这两种属性,js会自动把它变为String,比如:
var arr = []
arr[1] = 1
arr['1'] = 2
console.log(arr[1]);
看样子好像输出的是1,好像arr[1] 和 arr['1'] 并没有什么关系,但其实他俩一样,因为js会把属性名自动改为String类型。
验证一下:
console.log(arr[1] === arr['1']); //true
// 所以
console.log(arr[1]); // 2
// 因为arr[1] 和 arr['1'] 一样
这个懂了之后再看下一个
var a = {},
b = { key: 'b' }
a[b] = 123
console.log(a[b]);
b是一个对象,他会成为字符串作为a对象属性的名字,但是{ key: 'b' }转为字符串为变成什么呢?
var obj1 = { a1: '1', a2: '11' }
var obj2 = { a2: '2', a2: '22' }
console.log(obj1.toString()); // [object Object]
console.log(obj2.toString()); // [object Object]
会发现 obj1 和 obj2的值完全一样。
我们再回头来看这道题
var a = {},
b = { key: 'b' },
c = { key: 'c' }
a[b] = 123
a[c] = 456
console.log(a[b]);
完全等价于:
var a = {},
b = { key: 'b' },
c = { key: 'c' }
a['object Object'] = 123
a['object Object'] = 456
console.log(a['object Object']);
同一个属性先赋值123,在赋值456,那最后的结果就是456啦。