JS 的转换分显式与隐式两种。显式转换是主动调用 API:Number('42')、String(x)、Boolean(obj),其中 Boolean 结果由真假值表决定(0、''、null、undefined、NaN、false 之外全真)。隐式强制则是引擎在运算时偷偷干活:+ 两边有字符串就拼接、没有就走数字相加,比较运算符 == 会先把两边转成同类型。
著名的面试题 [] == ![] 结果 true,就是因为 ![] 先转成 false,空数组再被 ToPrimitive 转成空字符串、最后转成数字 0 与 false 的 0 相等。工程上推荐:永远用 === 严格相等避开隐式坑;数字转换用 Number(str) 而非 +str,解析含单位字符串用 parseInt 并带上进制参数。implicitly 的坑不是用来背的,是用来避免的。
// 显式转换 console.log(Number('42')); // 42 console.log(Number('42px')); // NaN console.log(parseInt('42px')); // 42 console.log(String(true)); // 'true' console.log(Boolean(0)); // false(假值) // 隐式强制的经典现场 console.log(1 + '2'); // '12'(字符串拼接) console.log(1 - '2'); // -1(减法没有字符串语义) console.log('3' * '4'); // 12 console.log([] == ![]); // true(面试名场面) console.log(null == undefined); // true console.log(null === undefined); // false // 对象转原始值 const obj = { valueOf() { return 42; } }; console.log(obj + 1); // 43 console.log(String({})); // '[object Object]