使用1.b
的时候,因为number
会有小数点与属性两个重合,JS会优先认定为是小数点导致报错,但是为什么在使用变量的时候,却不会报错呢?
有相关的规范或者文档可以参考下吗?
使用1.b
的时候,因为number
会有小数点与属性两个重合,JS会优先认定为是小数点导致报错,但是为什么在使用变量的时候,却不会报错呢?
有相关的规范或者文档可以参考下吗?
标识符是指用来识别各种值的合法名称。
标识符的命名规则是第一个字符不能是数字,此处的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...
`
let a = 1;
等价于
let a = Number(1);
而
Number是继承Function的原型
所以
a.constructor === Number.prototype.constructor;
a.__proto__ === new Number();
so
a.b 其实是在原型链上搜索属性
而
1.b 解释器只是想把它当作一个浮点型数据来匹配。
`
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.3k 阅读✓ 已解决
4 回答4.6k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
4 回答2.1k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
这很直观了呀。
就对于解释器而言 1.b 中的点只会认为是小数点,而不认为是属性值
let a=1;a.b中的点必然是取属性,a此时会被转换为Number对象,对对象取属性。