前端每日一练<属性名的类型>

7 篇文章 0 订阅

题目:

var a = {};
var b = {key:'b'};
var c = {key:'c'};

a[b] = 123;
a[c] = 456;
console.log(a[b]);

上面代码会输出什么?

答案是:456

为什么?

这里牵扯到这几个知识点:

  • 对象的属性名类型
  • a.key和a[key]的区别
  • [对象].toString()的结果

对象的属性名类型

对象的属性名类型只能有两种,分别是String和Symbol,如果新增的属性的类型不是两种中的任意一种,那么就会调用toString()方法将其转换成string类型

[对象].toString()的结果

设有一个对象obj,obj.toString()的结果是[object,object]

image-20220614175647886

a.key和a[key]的区别

假设有一个对象a

let a = {key:'a'}

执行a.key实际上会获取a中属性名为key的属性,这里的key是一个字符串,实际上就是获取a[‘key’]

而执行a[key],会去寻找名为key的变量,所以a[key] !== a[‘key’]

let a  = {key:'a'};

console.log(a.key);//'a'
console.log(a['key']);//'a'
console.log(a[key]);//error

弄懂了这几个知识点了,我们就可以知道刚刚代码的结果了

image-20220614180318663

  • 由于b和c都是对象,所以调用a[b]或a[c]都会将执行对象的toString方法,a[b]等价于a[‘[object,object]’],a[c]等价于a[‘[object,object]’]

    所以上方代码都是对a[‘[object,object]’]进行重新赋值

    最终会输出456

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值