为什么const number = 0; number.foo返回undefined,而0.foo报语法错误?
语法差异的原因
- 词法解析优先级问题:JS解析数字字面量时,
.会优先被识别为浮点数的小数点。0.foo中解析器会把0.判定为浮点数的开头,后续的foo不属于数字的合法组成部分,因此直接抛出语法错误。 - 当你使用
(0).foo或者给变量赋值为0再访问属性时,解析器会先把0完整识别为数字字面量,后续的.才会被判定为属性访问运算符,因此不会触发语法错误。
原始类型属性访问与赋值的规则
你观察到的「可以访问属性但赋值不生效」是JS的**装箱(Boxing)**机制导致的:
- JS中的
number属于原始类型,本身不是对象,没有自带的自定义属性存储空间。 - 当你对原始类型值执行属性访问/方法调用时,JS会临时创建一个对应的内置包装类实例(数字对应
Number对象,字符串对应String对象),属性操作会在这个临时对象上执行。 - 操作完成后,这个临时对象会被立刻销毁。因此你给临时对象赋值的属性,下次访问时已经是新的临时对象,自然拿不到之前的赋值结果,返回
undefined。
规则查阅途径
你可以从两个官方渠道查询对应的规则:
- ECMAScript语言规范:可查看数字字面量语法、属性访问表达式、原始类型包装对象的相关章节
- MDN JavaScript参考文档:可查看原始类型、包装对象、数字字面量的相关说明
内容的提问来源于stack exchange,提问作者sandre89
相关产品推荐
相关产品推荐

