JavaScript中autoboxing(自动装箱)是否仅在使用.运算符时触发?
自动装箱触发场景解答
自动装箱并不只在使用.运算符的场景下触发,JavaScript中还有不少其他场景也会触发原始类型的自动装箱,常见场景如下:
- 对原始类型使用中括号
[]访问属性/方法时,和.运算符逻辑一致,也会触发装箱,比如"test"['length']同样会临时创建String包装对象完成属性读取。 - 原始类型作为
instanceof运算符的左操作数时,会先自动装箱再判断类型,比如"hello" instanceof String返回true,就是因为字符串原始值先被包装为String对象再参与类型判断。 - 部分内置方法接收原始类型参数时也会自动装箱,比如调用
Object.prototype.toString.call(123)时,数值原始值会先被包装为Number对象,才能返回对应的[object Number]类型标签。 - 尝试给原始类型赋值自定义属性、或者使用
delete运算符删除原始类型上的属性时,也会先触发自动装箱生成临时包装对象,再执行对应操作。由于包装对象是临时的,操作完成后会立即销毁,所以赋值和删除操作都不会对原始变量产生持久影响。
// 非.运算符触发装箱的示例 // 1. 中括号访问触发 console.log("abc"['length']); // 输出 3 // 2. instanceof触发 console.log(123 instanceof Number); // 输出 true // 3. 自定义属性赋值触发 let num = 456; num.customProp = "测试属性"; // 触发装箱生成临时Number对象,赋值后对象销毁 console.log(num.customProp); // 输出 undefined,临时对象已销毁,原始值上不存在该属性
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

