直接访问1.b会报错,但是为什么let a = 1;a.b不会报错呢?

catchonme
  • 144

使用1.b 的时候,因为number 会有小数点与属性两个重合,JS会优先认定为是小数点导致报错,但是为什么在使用变量的时候,却不会报错呢?

有相关的规范或者文档可以参考下吗?

回复
阅读 1.5k
5 个回答

这很直观了呀。
就对于解释器而言 1.b 中的点只会认为是小数点,而不认为是属性值
let a=1;a.b中的点必然是取属性,a此时会被转换为Number对象,对对象取属性。

标识符是指用来识别各种值的合法名称。
标识符的命名规则是第一个字符不能是数字,此处的1.b中的1不是标识符,只能是数字字面量,如果整数字后面紧跟一个点,则该点被解释为小数点,小数点后面跟一个非数字,会报错。除非换成[]方式,才能是属性访问器,1[b]也不会报错,是undefined

a.b中 a 是标识符,此时的.是属性访问器,a会被转换成 Number 对象

参考链接;
1.https://wangdoc.com/javascrip...
2.https://wangdoc.com/javascrip...
3.https://developer.mozilla.org...

数字如果要直接使用方法。请使用..或[]

    1..b
    1['b']

`

let a = 1;
等价于
let a = Number(1);
而
Number是继承Function的原型
所以
a.constructor === Number.prototype.constructor;
a.__proto__ === new Number();
so
a.b 其实是在原型链上搜索属性
而
1.b 解释器只是想把它当作一个浮点型数据来匹配。

`

是由于js语法导致的,1.会被认为是一个小数,这个时候在后面加上a会产生语法错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏