JavaScript隐式转换按Symbol.toPrimitive→valueOf→toString顺序执行,hint决定优先级:+运算符用"default"(数组转""、对象转"[object Object]"),==转数字比较,逻辑运算只判真值;应优先使用===、Number()、String()等显式转换避免陷阱。
JavaScript 的类型转换分显式和隐式两种。隐式转换发生在运算、比较、逻辑操作等场景中,由引擎自动触发,规则看似随意,实则有明确优先级和步骤。掌握这些规则,能避免“{} + [] === 0”这类迷惑结果。
隐式转换本质是调用对象的 toString() 或 valueOf() 方法,按固定顺序尝试获取原始值。具体流程如下:
Symbol.toPrimitive 方法,优先调用它,并传入 hint("string"、"number" 或 "default")toString(),失败再调 valueOf()
valueOf(),失败再调 toString()
+ 运算符、== 比较):多数情况按 "number" 处理,但 Date 对象例外,按 "string"不同运算符会暗示不同的 hint,从而影响转换路径:
+(非数字相加):hint 是 "default",但数组 [] → valueOf() 返回自身(非原始值),再调 toString() 得空字符串;空对象 {} → toString() 返回 "[object Object]";所以 {} + [] 实际是 "[object Object]" + "" === "[object Object]"(注意:在语句上下文中 {} 可能被解析为代码块,真正执行时需括号包裹,如 ({}) + [])==:若类型不同,会尝试转为数字比较(null == undefined 是唯一例外,直接为 true);"0" == false → 0 == 0 → true;[] == ![] → [] == false → "" == 0 → 0 == 0 → true&&、||、!:只进行 真值/假值判断,不转成布尔类型,而是返回原值。例如 0 || "hello" 返回 "hello",![] 先将 [] 转为 true,再取反得 falseJavaScript 有 6 个“falsy 值”: false、0、-0、0n(BigInt 零
)、""(空字符串)、null、undefined。其余均为 truthy(包括 {}、[]、new Boolean(false))。注意:Boolean([]) 或 !![] 返回 true,这不是隐式转换的结果,而是显式或逻辑操作中的强制布尔判断。
实际开发中应主动控制类型,减少依赖隐式行为:
=== 替代 ==,禁止类型转换比较Number(x)、parseInt(x, 10) 或一元加号 +x 显式转数字String(x) 或模板字面量 `${x}`
if (arr),而用 Array.isArray(arr) && arr.length > 0 或 Object.keys(obj).length > 0