JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等)。JavaScript 还提供了这样的调用方法。我们很快就会学习它们,但是首先我们将了解它的工作原理,毕竟原始类型不是对象(在这里我们会分析地更加清楚)。
我们来看看原始类型和对象之间的关键区别。
一个原始值:
string
,number
,bigint
,boolean
,symbol
,null
和 undefined
。一个对象:
{}
创建对象,例如:{name: "John", age: 30}
。JavaScript 中还有其他种类的对象,例如函数就是对象。关于对象的最好的事儿之一是,我们可以把一个函数作为对象的属性存储到对象中。
let john = {
name: "John",
sayHi: function() {
alert("Hi buddy!");
}
};
john.sayHi(); // Hi buddy!
所以我们在这里创建了一个包含 sayHi
方法的对象 john
。
许多内建对象已经存在,例如那些处理日期、错误、HTML 元素等的内建对象。它们具有不同的属性和方法。
但是,这些特性(feature)都是有成本的!
对象比原始类型“更重”。它们需要额外的资源来支持运作。
以下是 JavaScript 创建者面临的悖论:
而解决方案看起来多少有点尴尬,如下:
“对象包装器”对于每种原始类型都是不同的,它们被称为 String
、Number
、Boolean
和 Symbol
。因此,它们提供了不同的方法。
例如,字符串方法 str.toUpperCase()[1] 返回一个大写化处理的字符串。
用法演示如下:
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
很简单,对吧?以下是 str.toUpperCase()
中实际发生的情况:
str
是一个原始值。因此,在访问其属性时,会创建一个包含字符串字面值的特殊对象,并且具有有用的方法,例如 toUpperCase()
。alert
显示)。str
。所以原始类型可以提供方法,但它们依然是轻量级的。
JavaScript 引擎高度优化了这个过程。它甚至可能跳过创建额外的对象。但是它仍然必须遵守规范,并且表现得好像它创建了一样。
数字有其自己的方法,例如,toFixed(n)[2] 将数字舍入到给定的精度:
let n = 1.23456;
alert( n.toFixed(2) ); // 1.23
我们将在后面 Number 类型[3] 和 字符串[4] 章节中看到更多具体的方法。
像 Java 这样的一些语言允许我们使用 new Number(1)
或 new Boolean(false)
等语法,明确地为原始类型创建“对象包装器”。
在 JavaScript 中,由于历史原因,这也是可以的,但极其 不推荐。因为这样会出问题。
例如:
alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
对象在 if
中始终为真,因此此处的 alert 将显示:
let zero = new Number(0);
if (zero) { // zero 为 true,因为它是一个对象
alert( "zero is truthy?!?" );
}
另一方面,调用不带 new
(关键字)的 String/Number/Boolean
函数是完全理智和有用的。它们将一个值转换为相应的类型:转成字符串、数字或布尔值(原始类型)。
例如,下面完全是有效的:
let num = Number("123"); // 将字符串转成数字
特殊的原始类型 null
和 undefined
是例外。它们没有对应的“对象包装器”,也没有提供任何方法。从某种意义上说,它们是“最原始的”。
尝试访问这种值的属性会导致错误:
alert(null.test); // error
null
和 undefined
以外的原始类型都提供了许多有用的方法。我们后面的章节中学习这些内容。先自己做题目再看答案。
重要程度:⭐️⭐️⭐️⭐️⭐️
思考下面的代码:
let str = "Hello";
str.test = 5;
alert(str.test);
你怎么想的呢,它会工作吗?会得到什么样的结果?
[1]str.toUpperCase(): https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase
[2]toFixed(n): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
[3]Number 类型: https://zh.javascript.info/number
[4]字符串: https://zh.javascript.info/string
[5]React 官方文档推荐,与 MDN 并列的 JavaScript 学习教程: https://zh-hans.reactjs.org/docs/getting-started.html#javascript-resources
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8