为什么在js中的原始值,可以调用方法,比如说:
let str
= 'I love China!';
console
.log(str
.slice(0,6));
但是却不能给原始值添加属性
str
.age
= 18;
console
.log(str
.age
);
这一切都和原始值包装类型及其声明周期有关:每当用到某个原始值的属性或者方法使,javascript总会在后台创建一个原始值包装类型的对象,从而暴露出操作原始值的各种方法。
在以读模式访问字符串的方法或者属性时,总会在后台执行以下三步: (1)创建一个原始值类型的实例 (2)调用这个实例上的方法(或读取这个实例上的属性) (3)销毁这个实例 用代码表示出来则为:
let str
= new String('I love China!');
console
.log(str
.slice(0,6));
str
= null;
所以在非严格模式下,当我们尝试给原始值赋值时str.age=18,其实是生成了一个原始值包装类型的,也是给它赋了值的,但是,这句话执行完之后,这个原始值包装类型就被销毁了。而在下一次再次读取这个属性时console.log(str.age),其实又再次创建了一个原始值包装类型对象,这个对象和之前那个不是一个对象,所以str.age为undefined