将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况;隐式的情况称为强制类型转换(coercion)。
js 中的强制类型转换总是返回标量基本类型值,如字 符串、数字和布尔值,不会返回对象和函数。
区分:类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。
js中通常统称为强制类型转换,作者倾向于用“隐式强制类型转换”(implicit coercion)和“显式强制类型转换”(explicit coercion)来区分。
显式强制类型转换是能够从代码中看出来的,隐式强制类型转换是那些不明显的,通常是某些操作产生的副作用。如:
var a = 42;
var b = a + ""; // 隐式强制类型转换
var c = String( a ); // 显式强制类型转换
对变量 b 而言,强制类型转换是隐式的;由于 + 运算符的其中一个操作数是字符串,所以是字符串拼接操作,结果是数字 42 被强制类型转换为相应的字符串 “42”。而 String(..)
则是将 a 显式强制类型转换为字符串。
“显式”和“隐式”以及“明显的副作用”和“隐藏的副作用”,都是相对而言的。
如果明白a + “”是怎么回事,那么对你来说就是“显式”的。相反,如果你不知道String(..)
可以用来做字符串强制类型转换,它对你来说可能就是“隐式”的。