一、核心转换规则
-
转数字(Number):
-
null→0 -
undefined→NaN -
true→1,false→0 -
字符串:空串
""→0,非数字字符串(如"abc")→NaN -
对象:先调用
valueOf()或toString()得到原始值,再转换
-
-
转字符串(String):
-
数组 → 逗号分隔的字符串(如
[1,2]→"1,2") -
对象 →
"[object Object]" -
null→"null",undefined→"undefined"
-
-
转布尔值(Boolean):
-
Falsy 值(自动转
false):0、""、null、undefined、NaN、false -
Truthy 值(自动转
true):其他所有值(包括[]、{}、"0")
-
二、常见隐式转换场景
1. 算术运算符(+ - * /)
-
+运算符:-
若任一操作数为字符串,执行字符串拼接:
javascript
"3" + 4; // "34"(数字转字符串) [] + {}; // "[object Object]"([] 转 "",{} 转 "[object Object]") -
否则尝试转数字:
javascript
true + 1; // 2(true → 1) null + 1; // 1(null → 0)
-
-
其他算术运算符(
-*/):强制转数字:javascript
"5" - 2; // 3 "10" / "2"; // 5 "abc" - 1; // NaN
2. 比较运算符(== != > <)
-
==的宽松相等(按优先级转换类型):javascript
1 == "1"; // true(字符串转数字) true == 1; // true(布尔转数字) [] == 0; // true([] → "" → 0) [null] == 0; // true([null] → "" → 0) {} == "[object Object]"; // true(对象转字符串)特殊规则:
-
null == undefined为true(不转换) -
NaN与任何值(包括自身)比较均为false
-
-
><比较:优先转数字:javascript
"10" > 2; // true("10" → 10) "abc" > 1; // false("abc" → NaN,比较返回 false)
3. 逻辑运算符(if && ||)
-
条件判断:自动转布尔值:
javascript
if ("hello") { ... } // true(非空字符串) if (0) { ... } // false -
||和&&:返回原值(非布尔值):javascript
"foo" || "bar"; // "foo"(truthy 返回第一个值) 0 || "default"; // "default"(falsy 返回第二个值)
4. 对象参与的转换
-
对象先调用
valueOf()(默认返回对象自身),再调用toString():javascript
[] + 1; // "1"([] → "" → 字符串拼接) {} + []; // 0({} 被解析为空代码块,实际计算 +[] → 0)
三、避免陷阱的实践建议
-
使用
===和!==:严格相等避免隐式转换:javascript
"1" === 1; // false undefined === null; // false
-
显式转换:主动控制类型:
javascript
Number("123"); // 123(显式转数字) String(123); // "123"(显式转字符串) Boolean([]); // true -
注意特殊值:
javascript
isNaN(+"abc"); // true(检测 NaN) Object.is(NaN, NaN); // true(ES6 精准比较)
经典面试题
javascript
console.log([] == ![]); // true
// 解析:
// 1. ![] → false([] 是 truthy,取反为 false)
// 2. [] == false → [] == 0 → "" == 0 → 0 == 0 → true
console.log({} + []); // "[object Object]"
// 解析:{} 和 [] 均转字符串后拼接

如何是 a==1 && a==2 &&a==3为true
let a = {
i:1,
// valueOf:function(){
// return this.i++;
// }
toString:function(){
return this.i++;
}
}
if(a ==1 && a == 2 && a == 3){
console.log('您好!');
}
以下写法会报错
let obj = {
name:"Rahul",
valueOf:function(){
return this;
},
toString:function(){
return this;
}
}
console.log(1 + obj);
1171

被折叠的 条评论
为什么被折叠?



