toString
今天遇到一个有趣的事情,当以 1.toString
的方式调用 toString
方法时,会遇到一个语法错误:
1 | Uncaught SyntaxError: Invalid or unexpected token |
这是因为 JavaScript 解析器会将数字后面的点视为小数点的一部分,而不是属性访问符。因此,它尝试将 1.
解析为一个浮点数,接着遇到了 toString
,这并不符合语法规则,从而导致错误。
为了正确地调用数字字面量的方法,可以使用以下几种方式:
使用两个点
..
,第一个点被视为小数点,第二个点被解析为属性访问符。这样,解析器能够正确地识别出你是想访问数字的方法。1
1..toString(); // 正确
将数字放在括号中,这样JavaScript解析器会将其视为一个表达式,从而可以直接访问其方法。
1
(1).toString(); // 正确
使用数字对象的构造函数
Number
。1
Number(1).toString(); // 正确
使用
[]
1
1['toString']() // 正确
以上方法都可以避免初始的语法错误,能够正确地调用数字的 toString
方法。
装箱(Boxing)
为什么看似原始数据类型,也能够调用方法呢?
在 JavaScript 中,原始数据类型(如数字、字符串、布尔值)虽然不是对象,但它们在访问方法或属性时会被临时包装成相应的对象类型,这个过程称为装箱(Boxing)。这就是为什么可以在原始数据类型上调用 .toString
方法或其他方法的原因。
当执行 1['toString']
时,JavaScript 引擎会临时将数字 1
转换为 Number
对象,然后在这个临时创建的 Number
对象上调用 toString
方法。完成调用后,这个临时对象就会被丢弃。这个过程是自动发生的,对开发者来说是透明的。
这种行为不仅适用于数字,还适用于其他原始数据类型。例如,字符串会被临时转换为 String
对象,布尔值会被转换为 Boolean
对象,从而允许在这些原始数据类型上访问方法和属性。