返回介绍

第一部分 类型和语法

第二部分 异步和性能

4.1 值类型转换

发布于 2023-05-24 16:38:21 字数 1543 浏览 0 评论 0 收藏 0

将值从一种类型转换为另一种类型通常称为类型转换 (type casting),这是显式的情况;隐式的情况称为强制类型转换 (coercion)。

JavaScript 中的强制类型转换总是返回标量基本类型值(参见第 2 章),如字符串、数字和布尔值,不会返回对象和函数。在第 3 章中,我们介绍过“封装”,就是为标量基本类型值封装一个相应类型的对象,但这并非严格意义上的强制类型转换。

也可以这样来区分:类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。

然而在 JavaScript 中通常将它们统称为强制类型转换 ,我个人则倾向于用“隐式强制类型转换”(implicit coercion)和“显式强制类型转换”(explicit coercion)来区分。

二者的区别显而易见:我们能够从代码中看出哪些地方是显式强制类型转换,而隐式强制类型转换则不那么明显,通常是某些操作产生的副作用。

例如:

var a = 42;

var b = a + "";     // 隐式强制类型转换

var c = String( a );  // 显式强制类型转换

对变量 b 而言,强制类型转换是隐式的;由于 + 运算符的其中一个操作数是字符串,所以是字符串拼接操作,结果是数字 42 被强制类型转换为相应的字符串 "42" 。

而 String(..) 则是将 a 显式强制类型转换为字符串。

两者都是将数字 42 转换为字符串 "42" 。然而它们各自不同的处理方式成为了争论的焦点。

从技术角度来说,除了字面上的差别以外,二者在行为特征上也有一些细微的差别。我们将在 4.4.2 节详细介绍。

这里的“显式”和“隐式”以及“明显的副作用”和“隐藏的副作用”,都是相对而言的。

要是你明白 a + "" 是怎么回事,它对你来说就是“显式”的。相反,如果你不知道 String(..) 可以用来做字符串强制类型转换,它对你来说可能就是“隐式”的。

我们在这里以普遍通行的标准来讨论“显式”和“隐式”,而非 JavaScript 专家和规范的标准。如果你的理解与此有出入,请参照我们的标准。

要知道我们编写的代码大都是给别人看的。即便是 JavaScript 高手也需要顾及其他不同水平的开发人员,要考虑他们是否能读懂自己的代码,以及他们对于“显式”和“隐式”的理解是否和自己一致。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文