4.1 值类型转换
将值从一种类型转换为另一种类型通常称为类型转换 (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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论