今天在看面试题目,突发奇想,对象的键是不是没有什么要求,好像一般随便写什么都不会报错。顺着这个思路往下研究了一下,发现不少有趣的东西。
先说结论
对象的键可以是任何数据类型,数组 对象 数字 null undefined 等都可以,但是最终都会转换成字符串。所以 '1' 与 1 都是一个相同的键,{ 1: 'a', '1': 'b' } 代码实际运行之后 就会变成 {1:'b'} , 因为都是1的键,所以后面的值覆盖了前端的值。 并 null undefined 都会被转成字符串的键。
- 有趣点1
数组 会通过 toString方法转化成字符串, 那么空数组就是 '' ,得的结果就是 {'': 'aa'} , 也可以通过 obj[''] 取到数据。
`const obj = {}
obj[[]] = 'aa'
console.log(obj[''],obj) // 结果是 aa ,{‘’: 'aa'} , 数组会转成空字符串`
- 有趣点2
当不是空数组时,通过toString去转换数组,也能得到对象,可以通过 obj['1,2,3'] 也可以通过 obj[[1,2,3]] 都可以取到值。道理都是一样的,取值时也会转换成字符串。
`const obj = {}
obj[[1,2,3]] = 'aa'
console.log(obj) // 'aa' {1,2,3: 'aa'}`
- 有趣点3
当对象作为键时,不论空对象还是有值的对象,都会被转成 {[object Object]: 'aa'} , 是因为对象经过toString就会得到 [object Object]。 此时取只能通过 obj['[object Object]'] 取到数据了。
`const obj = {}
obj[{}] = 'aa'
console.log(obj, obj) // {[object Object]: 'aa'}
const obj = {}
obj[{qq: 1}] = 'aa'
console.log(obj['[object Object]'], obj) // {[object Object]: 'aa'}`
最后总结下来就是一句话:对象的键 ,无论什么类型都是会先经过toString方法处理的,最终得到的字符串就是键。
看到这里,是不是有人要开喷了,这么低级的知识也能水一篇文章,哈哈哈,此时你再看看文章标题呢,贩一下剑,皮一下真的很开心,哈哈哈哈哈哈哈哈哈哈哈......