一、转换为布尔值
False值
false:布尔值false0、-0:正负零0n:BigInt零"":空字符串null:空值undefined:未定义NaN:非数字
虽然[].toString() === ""且""是falsy,但Boolean([])===true,因为对象直接转布尔值不经过toString
二、转为字符串
undefined→ "undefined"null→ "null"true→ "true",false→ "false"42→ "42"- 对象:
{}.toString()→ [object Object]") - 数组:
[1,2].toString()→ "1,2"(不返回"[object Array]")因为在Array中重写了toString方法不使用Object.prototype.toString方法
三、转为数字(ToNumber)
基本类型
undefined→ NaNnull→ 0true→ 1,false→ 0- 字符串:解析数值或NaN,空串为0
对象转数字
- 先尝试
valueOf() - 如返回的仍是对象,再调用
toString() - 再将得到的原始值转为数字
-
常见结果:
Number([])→ 0([]→""→ 0)Number([1])→ 1([1]→"1"→ 1)Number([1,2])→ NaN([1,2]→"1,2"→ NaN)Number({})→ NaN({}→"[object Object]"→ NaN)
四、运算符中的类型转换
算术运算符
-
一元+ :强制转为数字(
+"42"→ 42) -
二元+ :特殊行为
- 有字符串则进行字符串连接
- 否则转为数字后相加
-
其他算术运算符(-,*,/,%):操作数都转为数字
比较运算符
-
严格相等===:不进行类型转换
-
松散相等==:
null == undefined为 true(特例)- NaN于其余任何类型判断都为false
- 对象与原始值比较:对象先转为原始值
- 不同类型原始值:尝试转为相同类型(通常是数字)
-
大小比较:
- 字符串比较:按字典顺序
- 其他情况:转为数字后比较