原始值包装类型

boolean、number、string是三种特殊的引用类型

包含这三种原始值的变量并不是对象,但是它们却可以调用相应的方法,这是因为后台做了一些处理

  1. let s1 = "some text";
  2. let s2 = s1.substring(2); //原始值却调用了方法

以上代码,当第二行访问s1时,是以读模式访问的,也就是从内存中读取变量保存的值。
此时后台会执行以下3步骤:

  1. 创建一个string类型的实例
  2. 调用实例上的特定方法
  3. 摧毁实例

可以想象为一下的代码:

  1. let s1 = new String("some text");
  2. let s2 = s1.substring(2);
  3. s1 = null;

引用类型与原始值包装类型的主要区别在于对象的生命周期
自动创建的原始值包装对象则只存在于访问它的那行代码执行期间
这意味着不能在运行时给原始值添加属性和方法

  1. let s1 = "some text";
  2. s1.color = "red";
  3. console.log(s1.color); // undefined
  4. 代码执行到第二行时临时创建了一个string对象,但是到第三行的时候这个对象就被销毁了
  5. 第三行的代码创建了自己的临时对象,这与第二行的临时对象完全不同,所以没有color属性

global

大多数ECMAScirpt中无法直接访问,但是浏览器将其实现为window对象。
所有全局变量和函数都是global对象的属性。