在JavaScript中,包装类型是一种特殊的对象类型,用于将原始数据类型(像字符串String、数字Number和布尔值Boolean)转换为对象。
为什么要用它,因为基本类型是没有属性和方法的,为了便于操作基本类型的值,在调用基本类型的属性或方法时JavaScript会在后台隐式地将基本类型值转换为对象,这种转换是临时的。以下是关于JavaScript中包装类型的详细解释:
1. 包装类型的定义
- 包装类型允许在基本数据类型上执行对象操作,因为它们提供了一组方法和属性,以便更轻松地操作基本数据类型的值。
- 在调用基本类型的属性或方法时,JavaScript会在后台隐式地将基本类型的值转换为对象。
2. JavaScript中的三种主要包装类型
- String包装类型:用于字符串的包装类型是
String
。可以在字符串上调用各种方法,如length
、charAt()
、substring()
等。let str = "abc"; // 自动包装成String对象 console.log(str.length); // 输出:3 console.log(str.charAt(0)); // 输出:A console.log(str.toUpperCase()); // 输出:"ABC"
- Number包装类型:用于数字的包装类型是
Number
。可以在数字上调用各种方法,如toFixed()
、toPrecision()
等。let num = 123.456; // 自动包装成Number对象 console.log(num.toFixed(2)); // 输出:"123.46" // 显式创建Number对象(通常不推荐这样做) let numObj = new Number(123.456); console.log(numObj.toFixed(2)); // 输出:"123.46"
- Boolean包装类型:用于布尔值的包装类型是
Boolean
。可以在布尔值上调用方法,如toString()
等。let bool = true; console.log(bool.toString()); // 输出:"true" // 显式创建Boolean对象(几乎不用这样做) let boolObj = new Boolean(bool); console.log(boolObj.toString()); // 输出:"true"
3. 包装类型的自动创建和销毁
- 通常情况下,JavaScript会在需要时自动创建和销毁这些包装对象,以便可以直接操作基本数据类型,而不需要显式创建包装对象。
- 例如,当尝试访问字符串
'abc'.length
时,JavaScript会将'abc'
在后台转换成String('abc')
对象,然后再访问其length
属性。
4. 显式创建包装类型对象
- 尽管JavaScript在大多数情况下会自动创建包装对象,但也可以显式地创建它们。例如,可以使用
new String(str)
、new Number(num)
和new Boolean(bool)
来创建包装对象。 - 通常不建议显式创建包装对象,因为它们可能会导致一些不期望的行为,如比较运算符的意外结果等。如下:
let bool = true; console.log(bool.toString()); // 输出:"true" // 显式创建Boolean对象(几乎不用这样做) let boolObj = new Boolean(bool); console.log(boolObj.toString()); // 输出:"true" // 注意:直接比较基本类型和包装对象可能会产生不期望的结果 console.log(bool === boolObj); // 输出:false,因为一个是基本类型,一个是对象
5.valueOf()将包装类型转化为基本类型
//例子
var a = new Boolean( false );
if( !a ){
console.log( "123" )
}
// 结果不会打印出东西
原因:
因为 a
是一个存在的对象(即使它包装了一个布尔值 false
),逻辑非运算符 !
会将其估为 false
(因为对象总是“真值”的,除非它们是 null
或 undefined
)。因此,if(!a)
的条件不会为真,所以 console.log("123")
这行代码不会被执行。
可以使用valueOf()将包装类型转化为基本类型
var a = new Boolean(false);
if (!a.valueOf()) {
console.log("123");
}
// 由于 a.valueOf() 是 false,上面的条件为真,所以 "123" 会被打印出来
注意:避免使用Boolean
、Number
和String
的构造函数来创建包装对象,直接使用原始值(如true
、false
、数字字面量、字符串字面量等)是更好的选择。
总结
JavaScript中的包装类型是一种将原始数据类型转换为对象的机制,它允许你在原始数据类型上执行类似对象的操作,而无需显式地创建对象。