为何直接写console.log(5.constructor.name)会触发SyntaxError?
为什么
5.constructor.name报错,其他写法却正常? 这本质是JavaScript解析器对数字字面量的语法解析规则导致的:
整数字面量后的点会被优先解析为浮点数的小数点
当你写5.constructor.name时,解析器首先会把5.当成浮点数的开头(等价于5.0),但后面的constructor并不是合法的浮点数后缀,直接触发语法错误——因为浮点数小数点后面必须跟数字,不能跟标识符。变量形式无歧义
当你把5赋值给变量num后,num是一个明确的标识符,解析器会把num.constructor直接识别为对象属性访问操作,自然不会有语法问题,能正常拿到Number构造函数的名称。0.5的情况:浮点数字面量已完整
0.5是一个完整的浮点数字面量,解析器处理完0.5后,后面的点会被明确识别为属性访问符,所以0.5.constructor.name能正常解析,访问这个浮点数对应的包装对象的constructor属性。
让5.constructor.name合法的两种写法
如果想直接用整数字面量访问属性,可以用这两种方式规避解析歧义:
- 用括号包裹整数,强制解析器把
5当作表达式:
console.log((5).constructor.name); // Number
- 用两个点,第一个点作为浮点数的小数点,第二个点作为属性访问符:
console.log(5..constructor.name); // Number
内容的提问来源于stack exchange,提问作者Shylov Ihor
相关产品推荐
相关产品推荐

