js 你不知道的那些东西(叁)——对象中的属性

76 阅读2分钟

这是我参与「掘金日新计划 · 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啦。