JS 中的隐式转换
JavaScript中的隐式类型转换遵循一些规律和规则,这些规则在不同的运算和上下文中有所不同。了解这些规律有助于预测和控制代码的行为。以下是一些主要的隐式类型转换规律:
1. 字符串转换(String Conversion)
- 任何对象(包括数组和函数)通过
String
方法或在字符串上下文中被转换为字符串时,都会调用该对象的toString()
方法。 null
和undefined
在字符串上下文中被转换为空字符串""
。Boolean
对象在字符串上下文中被转换为"true"
或"false"
。Number
对象被转换为其对应的字符串表示。
数字转字符串:
javascript5 + "test" // "5test",数字 5 被转换成字符串 "5"
布尔值转字符串:
javascriptfalse + "true" // "falsetrue",布尔值 false 被转换成字符串 "false"
null转字符串:
javascriptnull + "null" // "nullnull",null 被转换成字符串 "null"
undefined转字符串:
javascriptundefined + "undefined" // "undefinedundefined",undefined 被转换成字符串 "undefined"
对象转字符串:
javascript({}) + "object" // "[object Object]object",对象被转换成字符串 "[object Object]"
2. 数字转换(Number Conversion)
- 字符串在数字上下文中被转换为数字时,会移除空白字符,然后解析剩余部分。如果字符串以合法的数字开始,则转换为该数字;否则,转换为
NaN
。 null
在数字上下文中被转换为0
。undefined
在数字上下文中被转换为NaN
。Boolean
对象在数字上下文中被转换为1
(true
)或0
(false
)。Number
对象保持不变。Symbol
对象在数字上下文中被转换为NaN
。
字符串转数字:
javascript"42" + 5 // "425",字符串 "42" 被转换成数字 42 "3.14" - 1 // 2.14,字符串 "3.14" 被转换成数字 3.14 "0" === false // true,字符串 "0" 被转换成数字 0,然后与 false(转换为 0)比较
布尔值转数字:
javascripttrue + 5 // 6,布尔值 true 被转换成数字 1 false - 7 // -7,布尔值 false 被转换成数字 0
null转数字:
javascriptnull + 10 // 10,null 被转换成数字 0
undefined转数字:
javascriptundefined + 20 // NaN,undefined 被转换成 NaN
对象转数字:
javascript({ value: 10 }) + 5 // 15,对象被转换成字符串,然后 "[value: 10]" 被转换成数字 NaN,但在这个例子中,我们通常使用 Object 的 valueOf 或 toString 方法来获取值
3. 布尔转换(Boolean Conversion)
- 字符串在布尔上下文中被转换为
false
,除非字符串是非空的,此时转换为true
。 null
和undefined
在布尔上下文中被转换为false
。Number
对象被转换为false
,除非该数字是0
、NaN
或-0
,这些被转换为false
,其他数字被转换为true
。Boolean
对象保持不变。Symbol
对象在布尔上下文中被转换为true
。
字符串转布尔值:
javascript"" ? false : true // false,空字符串转换成布尔值 false "non-empty" ? false : true // true,非空字符串转换成布尔值 true
数字转布尔值:
javascript0 ? false : true // false,数字 0 转换成布尔值 false 1 ? false : true // true,数字 1 转换成布尔值 true
null转布尔值:
javascriptnull ? false : true // false,null 转换成布尔值 false
undefined转布尔值:
javascriptundefined ? false : true // false,undefined 转换成布尔值 false
对象转布尔值:
javascript({}) ? false : true // true,对象转换成布尔值 true
4. 相等性比较(Equality Comparison)
- 在相等性比较中,如果两个操作数类型不同,JavaScript会尝试将它们转换为相同的类型,然后进行比较。
null
和undefined
相等,都转换为对方。String
和Number
比较时,字符串会被转换为数字。Boolean
对象比较时,会被转换为数字(true
转换为1
,false
转换为0
)。- 对象(包括数组和函数)和非对象比较时,对象会被转换为字符串,然后进行比较。
字符串与数字的比较:
javascript"5" == 5 // true,字符串 "5" 被转换成数字 5 后与 5 比较
布尔值与数字的比较:
javascripttrue == 1 // true,布尔值 true 被转换成数字 1 后与 1 比较 false == 0 // true,布尔值 false 被转换成数字 0 后与 0 比较
null与数字的比较:
javascriptnull == 0 // true,null 被转换成数字 0 后与 0 比较
undefined与数字的比较:
javascriptundefined == 0 // false,undefined 被转换成 NaN,NaN 与任何值(包括 0)比较都返回 false
5. 严格相等性比较(===)
- 在严格相等性比较中,不会发生类型转换。如果两个操作数类型不同,比较结果为
false
。