所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象

  1. var v1 = new Number(123);
  2. var v2 = new String('abc');
  3. var v3 = new Boolean(true);
  4. typeof v1 // "object"
  5. typeof v2 // "object"
  6. typeof v3 // "object"
  7. v1 === 123 // false
  8. v2 === 'abc' // false
  9. v3 === true // false

Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值
Number(123) // 123 String('abc') // "abc" Boolean(true) // true

这三个对象作为构造函数使用(带有new)时,可以将原始类型的值转为对象;作为普通函数使用时(不带有new),可以将任意类型的值,转为原始类型的值

javascript开辟了临时变量,定义原始值的时候,系统调用了new String(),new Number(),new Boolean(),这句话结束,临时变量就被销毁了,再次调用属性,就会出现问题,

  1. var str = 'abc'
  2. str.name = 'bcd'
  3. console.log(str.name) //undefined
  4. var str = 'abcd'
  5. str.length = 2
  6. //new String('abcd').length = 2 delete
  7. console.log(str) //abcd

实例方法

valueOf() toString()

valueOf方法返回包装对象实例对应的原始类型的值。
toString方法返回对应的字符串形式

  1. new Number(123).valueOf() // 123
  2. new String('abc').valueOf() // "abc"
  3. new Boolean(true).valueOf() // true
  4. new Number(123).toString() // "123"
  5. new String('abc').toString() // "abc"
  6. new Boolean(true).toString() // "true"

原始类型与实例对象的自动转换

原始类型的值,可以自动当作包装对象调用,即调用包装对象的属性和方法。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例
var str = 'abc'; str.length // 3

自动转换生成的包装对象是只读的,无法修改。所以,字符串无法添加新属性。
调用结束后,包装对象实例会自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。如果要为字符串添加属性,只有在它的原型对象String.prototype上定义

  1. var arr = '123'
  2. arr.p='234'
  3. console.log(arr.p)
  4. //undefined
  5. var arr = '123'
  6. var obj = new String(arr)
  7. obj.p='234'
  8. console.log(obj.p)
  9. //234

自定义方法

除了原生的实例方法,包装对象还可以自定义方法和属性,供原始类型的值直接调用

  1. String.prototype.double = function () {
  2. return this.valueOf() + this.valueOf();
  3. };
  4. 'abc'.double()
  5. // abcabc
  6. Number.prototype.double = function () {
  7. return this.valueOf() + this.valueOf();
  8. };
  9. (123).double()
  10. // 246