js类型转换和比较操作的规范

126 阅读3分钟

在 JavaScript 中,类型转换和比较操作遵循特定的规范。以下是对常见转换和比较操作的规范总结:

操作类型操作符规范说明示例
显式类型转换-使用构造函数或方法直接进行类型转换。String(123)'123'
Number('42')42
隐式类型转换+在字符串连接操作中,+ 会将非字符串类型转换为字符串。'5' + 3'53'
-*/算术运算符会将操作数转换为数字类型。'5' - '2'3
比较运算符比较字符串时按字典顺序比较,将其他类型转换为数字再比较。'10' > '2'false
==非严格相等(==)在比较前会执行类型转换(遵循 ECMAScript 的抽象相等比较规范)。1 == '1'true
严格比较===严格相等(===)不进行类型转换,类型不同即为 false1 === '1'false
!==严格不等于(!==)不进行类型转换,类型不同即为 true1 !== '1'true
布尔转换Boolean()将值转换为布尔值,0NaN''nullundefined 转换为 false,其他值为 trueBoolean(0)false
&&、``&& 返回第一个假值,`` 返回第一个真值,常用于短路运算。`null'default''default'`
对象转换toString()对象在字符串上下文中会默认调用 toString() 方法;数字上下文调用 valueOf()(如定义了此方法)。{}'[object Object]'
JSON.stringify()转换对象为 JSON 字符串,通常用于序列化。JSON.stringify({a: 1})'{"a":1}'
Symbol 转换-Symbol 不能隐式转换为字符串或数字,显式转换时需调用 String()Symbol.prototype.descriptionString(Symbol('id'))'Symbol(id)'

比较操作规范

  1. 相等比较(==

    • 首先进行类型转换,再进行比较。例如,null == undefinedtrue0 == '0'true
    • 特殊情况:
      • NaN 与任何值都不相等,包括自身,需用 Number.isNaN() 检查。
      • 0false'' 等会被认为相等,但 nullfalse 不相等。
  2. 严格相等比较(===

    • 仅在类型和值都相等时返回 true,避免隐式类型转换带来的误解。例如,0 === '0'false
  3. 对象比较

    • 引用类型比较地址是否相同,不比较内容。例如,{a: 1} === {a: 1}false,因为它们是不同的对象。
  4. 字符串比较

    • 按字典顺序比较字符的 Unicode 编码值。

其他注意事项

  • 模板字符串${} 内的表达式会被自动转换为字符串。
  • 隐式布尔转换:条件语句如 if 和三元运算符中会自动进行布尔转换。

[] == ! [] 为什么返回 true?

在 JavaScript 中,表达式 [] == ![] 返回 true 是因为 JavaScript 在处理 ==! 运算符时进行了隐式的类型转换。以下是解析该表达式的具体步骤:

步骤解析

  1. ![] 的计算

    • ! 是逻辑非运算符,作用是将操作数转换为布尔值,然后取反。
    • [] 是一个非空数组对象,因此在布尔上下文中被视为 true
    • ![] 先将 [] 转换为 true,然后取反,结果为 false
    • 因此,![] 的值为 false
  2. 表达式变为 [] == false

    • 经过第一步后,原表达式 [] == ![] 可以简化为 [] == false
  3. [] == false 的计算

    • ==(非严格相等)比较中,如果两边的类型不同,JavaScript 会执行类型转换。
    • JavaScript 的规则是,将非布尔值与布尔值进行比较时,首先将布尔值 false 转换为 0
      • 因此,[] == false 可以进一步简化为 [] == 0
  4. [] == 0 的计算

    • JavaScript 的规则是,如果对象([] 是对象)与数字进行比较,会尝试将对象转换为一个原始值。
    • [] 转换为原始值时会调用 toString() 方法,其结果是空字符串 ""
    • 于是,表达式 [] == 0 可以简化为 "" == 0
  5. "" == 0 的计算

    • == 比较中,空字符串 "" 会被转换为数字 0
    • 因此,"" == 0 结果为 true

结果

经过上述步骤,最终得出 [] == ![] 的结果为 true