⏺ JavaScript 原始类型的方法
JavaScript 允许像使用对象一样使用原始类型(字符串,数字等),并且提供调用方法。⚠️ 但原始类型并不是对象!
# 原始类型与对象之间的区别
- 原始值:
- 是原始类型中的一种值。
- 在 JavaScript 中有 7 种原始类型:
string
,number
,bigint
,boolean
,symbol
,null
和undefined
。(相对于 ES6 以后的 JavaScript)
- 对象:
- 能够存储多个值作为属性。
- 可以使用大括号
{}
创建对象,例如:{name: "John", age: 30}
。JavaScript 中还有其他种类的对象,例如函数就是对象。 - JavaScript 还有内建对象,处理日期、错误、HTML 元素等的内建对象。它们具有不同的属性和方法。
- 对象比原始类型更加「厚重」,需要额外资源支持运作。
# 为原始类型提供「对象包装器」
为了保持原始数据类型简单轻量,又想完成对字符串或者数字等原始类型执行操作。
原始类型仍然是原始的,提供单个值。
JavaScript 允许访问字符串,数字,布尔值和 symbol 的方法和属性。
JavaScript 创建了提供额外功能的特殊「对象包装器」,使用后即被销毁。
「对象包装器」对于每种原始类型都是不同的,分别被称为 String
、 Number
、 Boolean
、 Symbol
和 BigInt
。因此,它们提供了不同的方法。
🌰 例子 / 字符串方法 str.toUpperCase()
字母大写化处理:
let str = "Hello";
console.log( str.toUpperCase() );
2
在
str.toUpperCase()
实际发生的事情:
- 访问字符串
str
时会创建一个包含字符串字面值的「特殊对象」,并且具有有用的方法,例如toUpperCase()
。- 该方法运行并返回一个新的字符串。
- 「特殊对象」被销毁。
🌰 例子 / 数字方法 toFixed
将数字舍入到给定的精度:
let n = 1.23456;
console.log( n.toFixed(2) ); // 1.23
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
2let 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"); // 将字符串转成数字
提示
对于 null/undefined
类型,没有任何数据类型的方法:它们没有对应的「对象包装器」,也没有提供任何方法,它们是「最原始的」数据类型。
尝试访问这种值的属性会导致错误:
alert(null.test)
# 原始类型总结
- JavaScript 中基本类型不是对象,基本类型不能存储数据;所有的属性 / 方法操作都是在临时对象的帮助下执行的。
- JavaScript 为原始类型提供了许多有用的方法(* 除了
null/undefined
)