在 JavaScript 中,类型转换和比较操作遵循特定的规范。以下是对常见转换和比较操作的规范总结:
| 操作类型 | 操作符 | 规范说明 | 示例 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 显式类型转换 | - | 使用构造函数或方法直接进行类型转换。 | String(123) → '123'Number('42') → 42 | ||||||
| 隐式类型转换 | + | 在字符串连接操作中,+ 会将非字符串类型转换为字符串。 | '5' + 3 → '53' | ||||||
-、*、/ | 算术运算符会将操作数转换为数字类型。 | '5' - '2' → 3 | |||||||
| 比较运算符 | 比较字符串时按字典顺序比较,将其他类型转换为数字再比较。 | '10' > '2' → false | |||||||
== | 非严格相等(==)在比较前会执行类型转换(遵循 ECMAScript 的抽象相等比较规范)。 | 1 == '1' → true | |||||||
| 严格比较 | === | 严格相等(===)不进行类型转换,类型不同即为 false。 | 1 === '1' → false | ||||||
!== | 严格不等于(!==)不进行类型转换,类型不同即为 true。 | 1 !== '1' → true | |||||||
| 布尔转换 | Boolean() | 将值转换为布尔值,0、NaN、''、null、undefined 转换为 false,其他值为 true。 | Boolean(0) → false | ||||||
&&、` | ` | && 返回第一个假值,` | ` 返回第一个真值,常用于短路运算。 | `null | 'default'→'default'` | ||||
| 对象转换 | toString() | 对象在字符串上下文中会默认调用 toString() 方法;数字上下文调用 valueOf()(如定义了此方法)。 | {} → '[object Object]' | ||||||
JSON.stringify() | 转换对象为 JSON 字符串,通常用于序列化。 | JSON.stringify({a: 1}) → '{"a":1}' | |||||||
| Symbol 转换 | - | Symbol 不能隐式转换为字符串或数字,显式转换时需调用 String() 或 Symbol.prototype.description。 | String(Symbol('id')) → 'Symbol(id)' |
比较操作规范
-
相等比较(
==)- 首先进行类型转换,再进行比较。例如,
null == undefined为true,0 == '0'为true。 - 特殊情况:
NaN与任何值都不相等,包括自身,需用Number.isNaN()检查。0与false、''等会被认为相等,但null与false不相等。
- 首先进行类型转换,再进行比较。例如,
-
严格相等比较(
===)- 仅在类型和值都相等时返回
true,避免隐式类型转换带来的误解。例如,0 === '0'为false。
- 仅在类型和值都相等时返回
-
对象比较
- 引用类型比较地址是否相同,不比较内容。例如,
{a: 1} === {a: 1}为false,因为它们是不同的对象。
- 引用类型比较地址是否相同,不比较内容。例如,
-
字符串比较
- 按字典顺序比较字符的 Unicode 编码值。
其他注意事项
- 模板字符串:
${}内的表达式会被自动转换为字符串。 - 隐式布尔转换:条件语句如
if和三元运算符中会自动进行布尔转换。
[] == ! [] 为什么返回 true?
在 JavaScript 中,表达式 [] == ![] 返回 true 是因为 JavaScript 在处理 == 和 ! 运算符时进行了隐式的类型转换。以下是解析该表达式的具体步骤:
步骤解析
-
![]的计算!是逻辑非运算符,作用是将操作数转换为布尔值,然后取反。[]是一个非空数组对象,因此在布尔上下文中被视为true。![]先将[]转换为true,然后取反,结果为false。- 因此,
![]的值为false。
-
表达式变为
[] == false- 经过第一步后,原表达式
[] == ![]可以简化为[] == false。
- 经过第一步后,原表达式
-
[] == false的计算- 在
==(非严格相等)比较中,如果两边的类型不同,JavaScript 会执行类型转换。 - JavaScript 的规则是,将非布尔值与布尔值进行比较时,首先将布尔值
false转换为0。- 因此,
[] == false可以进一步简化为[] == 0。
- 因此,
- 在
-
[] == 0的计算- JavaScript 的规则是,如果对象(
[]是对象)与数字进行比较,会尝试将对象转换为一个原始值。 []转换为原始值时会调用toString()方法,其结果是空字符串""。- 于是,表达式
[] == 0可以简化为"" == 0。
- JavaScript 的规则是,如果对象(
-
"" == 0的计算- 在
==比较中,空字符串""会被转换为数字0。 - 因此,
"" == 0结果为true。
- 在
结果
经过上述步骤,最终得出 [] == ![] 的结果为 true。