包装类
原始值是不能有属性和方法的,但是数字可以分为原始值数字和数字对象,var num = new Number(123)
则是一个数字对象,此时可以往该对象中添加属性或方法,并且可以像原始值一样参与运算,但是运算完成后又会变回原始值。
new Number(), new String(), new Boolean()可以将对应类型的原始值转化为对象。
//包装类
var num = 3;
num.len = 4; //1. new Number(3).len = 4; 2. delete num.len;
console.log(num.len); //1. new Number(3).len; 2. 对象没有的属性返回undefined
同样,对于string和boolean类型的值,也有类似的性质。
var str = 'abcd';
str.length = 2; //1. new String('abcd').length = 2; 2. delete str.length;
console.log(str); //abcd
console.log(str.length); //new String('abcd').length 而.length属性对象字符串本身就有 因此该值为4
上例如果对于数组,就会有截断效果,但是对于原始值是做不到的。
在调用length的时候, JS引擎会先对原始类型数据进行包装 new String(“abcd”)
然后对其方法进行调用 new String(“abcd”).length
对于数字类型和布尔类型的原始值,进行包装产生的对象仅有[[Prototype]]和[[PrimitiveValue]]两个属性。
但是对于字符串类型
例如
var str = 'abcd';
new String(str);
产生对象
str{
0: "a"
1: "b"
2: "c"
3: "d"
length: 4
[[Prototype]]: String
[[PrimitiveValue]]: "abcd"
}