在 JavaScript 中,原始类型(primitive types)包括 number, string, boolean, null, undefined 和 symbol(ES6 引入)。
对于这些类型,JavaScript 提供了两种主要的方式来创建或初始化值:字面量形式和 new 形式。
字面量形式
字面量形式是最直接的初始化方式,它直接给出值本身。例如:
- 字符串:‘hello’
- 数字:42
- 布尔值:true
优点:
- 更简单、更直观。
- 性能更好,因为不需要额外的对象创建开销。
示例:
let str = 'hello';
let num = 42;
let bool = true;
new 形式
使用 new 关键字可以创建一个包装对象,这些包装对象分别是 String, Number, 和 Boolean 类型。例如:
- 字符串:new String(‘hello’)
- 数字:new Number(42)
- 布尔值:new Boolean(true)
优点:
- 创建的是一个对象,而不是原始类型。
- 包装对象具有额外的方法和属性,可以通过原型链访问。
- 可能会导致意料之外的行为,尤其是在进行比较操作时。
示例:
let strObj = new String('hello');
let numObj = new Number(42);
let boolObj = new Boolean(true);
主要差异
- 类型:
- 字面量是原始类型。
- new 形式的包装对象是引用类型。
- 内存分配:
- 原始类型值存储在栈内存中。
- 对象存储在堆内存中,并且变量持有指向该对象的引用。
- 行为:
- 原始类型在赋值时传递的是值本身。
- 对象在赋值时传递的是指向对象的引用。
- 性能:
- 字面量形式通常更快,因为它不涉及对象创建过程。
- 方法和属性:
- 原始类型没有额外的方法和属性。
- 包装对象提供了更多的方法和属性。
- 相等性检查:
- 使用 == 比较时,包装对象会被自动转换成原始类型。
- 使用 === 比较时,原始类型和包装对象被认为是不同的。
注意事项
在大多数情况下,建议使用字面量形式来处理原始数据类型,以避免不必要的复杂性和潜在的错误。
使用 new 形式创建的包装对象通常只在需要利用某些内置对象方法时才使用,或者在旧的 API 中要求传入对象参数而非原始值的情况下使用。