为了方便操作原始值,ECMAScript提供了三种特殊的引用类型:Boolean、Number、String。
每种类型都有各自的行为(API),每当用到某个原始值的方法或者属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法。
实例:
let str1 = "abcdef" let str2 = str1.substring(2) console.log(str2) // cdef
说明:
- 原始值本身不是对象,因此逻辑上不应该有方法。而这里却是可以运行的。
- 这是因为后台进行了很多处理,从而实现上述操作。具体来说,当第二行访问str1时,是以读模式访问的,也就是要从内存中读取变量保存的值。在以读模式访问字符串值的任何时候,后台都会执行以下三步:
- 创建一个String类型的实例
- 调用实例上的特定方法
- 销毁实例
- 可以想象成:
-
let str1 = new String("abcdef") let str2 = s1.substring(2) str1 = =null
-
- 这样可以让原始值拥有对象的行为
- Boolean和Number同理,只不过使用的是Boolean和Number的包装类型罢了
引用类型和原始包装类型的主要区别在于对象的生命周期
- 在通过new实例化引用类型后,得到的实例会在离开作用域时被销毁
- 而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。意味着不饿能在运行时给原始值添加属性和方法
-
let s1 = "abcdef" s1.name = "xlx" console.log(s1) // undefined
说明:
- 执行第二行代码时临时创建了一个String对象,当第三行代码执行时,第二行执行时创建的对象已经被销毁了。此时打印的是第三行代码执行时临时创建的新对象,但是这个对象没有name属性,因此是undefined