目录

⏺ JavaScript 原始类型的方法

JavaScript 允许像使用对象一样使用原始类型(字符串,数字等),并且提供调用方法。⚠️ 但原始类型并不是对象!

# 原始类型与对象之间的区别

  • 原始值
    • 是原始类型中的一种值。
    • 在 JavaScript 中有 7 种原始类型: stringnumberbigintbooleansymbolnullundefined 。(相对于 ES6 以后的 JavaScript)
  • 对象
    • 能够存储多个值作为属性。
    • 可以使用大括号 {} 创建对象,例如: {name: "John", age: 30} 。JavaScript 中还有其他种类的对象,例如函数就是对象。
    • JavaScript 还有内建对象,处理日期、错误、HTML 元素等的内建对象。它们具有不同的属性和方法。
  • 对象比原始类型更加「厚重」,需要额外资源支持运作。

# 为原始类型提供「对象包装器」

为了保持原始数据类型简单轻量,又想完成对字符串或者数字等原始类型执行操作。

  • 原始类型仍然是原始的,提供单个值。

  • JavaScript 允许访问字符串,数字,布尔值和 symbol 的方法和属性。

  • JavaScript 创建了提供额外功能的特殊「对象包装器」,使用后即被销毁。

「对象包装器」对于每种原始类型都是不同的,分别被称为 StringNumberBooleanSymbolBigInt 。因此,它们提供了不同的方法。

🌰 例子 / 字符串方法 str.toUpperCase() 字母大写化处理:

let str = "Hello";
console.log( str.toUpperCase() );
1
2

str.toUpperCase() 实际发生的事情:

  • 访问字符串 str 时会创建一个包含字符串字面值的「特殊对象」,并且具有有用的方法,例如 toUpperCase()
  • 该方法运行并返回一个新的字符串。
  • 「特殊对象」被销毁。

🌰 例子 / 数字方法 toFixed 将数字舍入到给定的精度:

let n = 1.23456;
console.log( n.toFixed(2) ); // 1.23
1
2

所以原始类型可以提供方法,但它们依然是轻量级的。

JavaScript 引擎高度优化了这个过程。它甚至可能跳过创建额外的对象。但是它仍然必须遵守规范,并且表现得好像它创建了一样。

注意

构造器 String/Number/Boolean 仅供内部使用。(在 Java 中也许可以 new Number(1)new Boolean(false) ,但是 JavaScript 极不推荐这样使用)

  • new …() JavaScript 的使用会引起问题:

    console.log( typeof 0 ); // "number"
    console.log( typeof new Number(0) ); // "object"!
    
    1
    2
    let zero = new Number(0);
    if (zero) { // zero 为 true,因为它是一个对象
      console.log( "zero is truthy?!?" );
    }
    
    1
    2
    3
    4

    ? 返回的对象始终为 true

另一方面,JavaScript 可以调用不带 new (关键字)的 String/Number/Boolean 函数(类型转换),将一个值转换为相应的类型:转成字符串、数字或布尔值(原始类型)。

🌰 例子:

let num = Number("123"); // 将字符串转成数字
1

提示

对于 null/undefined 类型,没有任何数据类型的方法:它们没有对应的「对象包装器」,也没有提供任何方法,它们是「最原始的」数据类型。

尝试访问这种值的属性会导致错误:

alert(null.test)
1

# 原始类型总结

  • JavaScript 中基本类型不是对象,基本类型不能存储数据;所有的属性 / 方法操作都是在临时对象的帮助下执行的。
  • JavaScript 为原始类型提供了许多有用的方法(* 除了 null/undefined
📢 上次更新: 2022/09/02, 10:18:16