原始类型的办法
JavaScript 容许咱们像应用对象一样应用原始类型(字符串,数字等)。JavaScript 还提供了这样的调用办法。咱们很快就会学习它们,然而首先咱们将理解它的工作原理,毕竟原始类型不是对象(在这里咱们会剖析地更加分明)。
咱们来看看原始类型和对象之间的要害区别。
一个原始值:
- 是原始类型中的一种值。
- 在 JavaScript 中有 7 种原始类型:
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 创建者面临的悖论:
- 人们可能想对诸如字符串或数字之类的原始类型执行很多操作。最好将它们作为办法来拜访。
- 原始类型必须尽可能的简略轻量。
而解决方案看起来多少有点难堪,如下:
- 原始类型依然是原始的。与预期雷同,提供单个值
- JavaScript 容许拜访字符串,数字,布尔值和 symbol 的办法和属性。
- 为了使它们起作用,创立了提供额定性能的非凡“对象包装器”,应用后即被销毁。
“对象包装器”对于每种原始类型都是不同的,它们被称为 String
、Number
、Boolean
和 Symbol
。因而,它们提供了不同的办法。
例如,字符串办法 str.toUpperCase() 返回一个大写化解决的字符串。
用法演示如下:
let str = "Hello";
alert(str.toUpperCase() ); // HELLO
很简略,对吧?以下是 str.toUpperCase()
中理论产生的状况:
- 字符串
str
是一个原始值。因而,在拜访其属性时,会创立一个蕴含字符串字面值的非凡对象,并且具备有用的办法,例如toUpperCase()
。 - 该办法运行并返回一个新的字符串(由
alert
显示)。 - 非凡对象被销毁,只留下原始值
str
。
所以原始类型能够提供办法,但它们仍然是轻量级的。
JavaScript 引擎高度优化了这个过程。它甚至可能跳过创立额定的对象。然而它依然必须恪守标准,并且体现得如同它创立了一样。
数字有其本人的办法,例如,toFixed(n) 将数字舍入到给定的精度:
let n = 1.23456;
alert(n.toFixed(2) ); // 1.23
咱们将在前面 Number 类型 和 字符串 章节中看到更多具体的办法。
结构器 String/Number/Boolean 仅供外部应用
像 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 没有任何办法
非凡的原始类型 null
和 undefined
是例外。它们没有对应的“对象包装器”,也没有提供任何办法。从某种意义上说,它们是“最原始的”。
尝试拜访这种值的属性会导致谬误:
alert(null.test); // error
总结
- 除
null
和undefined
以外的原始类型都提供了许多有用的办法。咱们前面的章节中学习这些内容。 - 从模式上讲,这些办法通过长期对象工作,但 JavaScript 引擎能够很好地调整,以在外部对其进行优化,因而调用它们并不需要太高的老本。
作业题
先本人做题目再看答案。
我能为字符串增加一个属性吗?
重要水平:⭐️⭐️⭐️⭐️⭐️
思考上面的代码:
let str = "Hello";
str.test = 5;
alert(str.test);
你怎么想的呢,它会工作吗?会失去什么样的后果?
答案:
在微信公众号「技术漫谈」后盾回复 10501
获取作业答案。
古代 JavaScript 教程:开源的古代 JavaScript 从入门到进阶的优质教程。React 官网文档举荐,与 MDN 并列的 JavaScript 学习教程。
在线收费浏览:https://zh.javascript.info
微信扫描下方二维码,关注公众号「技术漫谈」,订阅更多精彩内容。