Skip to content

类型转换规则 & 运算规则

类型转换规则

所有 -> 布尔

js
Boolean(null) // false
Boolean(undefined) // false

Boolean(NaN) // false
Boolean(0) // false
Boolean(-0) // false
Boolean(+0) // false
// 除了 0 和 NaN,其他数字均为 true
Boolean(-1) // true
Boolean(1) // true

Boolean('') // false
// 除了空字符串,其他字符串均为 true
Boolean(' ') // true
Boolean('0') // true
Boolean('false') // true

Boolean([]) // true
Boolean({}) // true
Boolean(function () {}) // true

原始 -> 数字

js
Number(null) // 0
Number(undefined) // NaN

Number(true) // 1
Number(false) // 0

// string
Number('') // 0
Number(' ') // 0
Number(' \n\r\t ') // 0
Number('123') // 123
Number(' 123 ') // 123
Number(' 12 3 ') // NaN
Number('abc') // NaN

原始 -> 字符串

js
String(null) // "null"
String(undefined) // "undefined"

String(0) // "0"
String(NaN) // "NaN"
String(1) // "1"
String(-1) // "-1"

String(true) // "true"
String(false) // "false"

对象 -> 原始

  1. 首先调用 obj.valueOf()
    • 如果返回的是原始值(number、string、boolean、symbol、bigint、undefined、null),直接使用这个值。
    • 如果返回的是对象,则继续下一步。
  2. 调用 obj.toString()
    • 如果返回的是原始值,直接使用这个值。
    • 如果返回的还是对象,则返回这个对象本身。

      此时,如果后续操作需要原始值(例如用于加法、字符串连接等),就会抛出 TypeError 错误。

运算规则

算数运算符

  • +-*/%
  • ++--

转换为原始类型:

  • 转换为数字,然后运算。
  • 特殊情况:x + yxy 有一个字符串,则转换为字符串,然后拼接。
  • 特殊情况:NaN 和任何类型的值进行算数运算,结果都是 NaN
面试题
js
null + undefined // NaN
;[] + {} // "[object Object]"

比较运算

  • ><>=<=
  • ===!==
  • ==!=

><>=<=

转换为原始类型:

  • 转换为数字,然后比较。
  • 特殊情况:两端全是字符串,比较字典顺序。
  • 特殊情况:两端存在 NaN,一定为 false。
面试题
js
null > undefined // false
undefined > null // false

===

  • 类型和值必须都相同。
  • 特殊情况:两端存在 NaN,一定为 false。

==

  • 两端类型相同,比较值。
  • 两端类型都为原始类型,转换成数字,然后比较。
  • 一端是原始类型,一端是对象类型,把对象转换为原始类型,然后比较。
  • 特殊情况:undefined 和 null 只有与自身比较,或者互相比较时,才会返回 true。
  • 特殊情况:两端存在 NaN,一定为 false。

!=!==

对相等取反。

逻辑运算

  • &&||!
  • ??

转换为布尔类型:

  • x && y
    • x 为 false,返回 x
    • x 为 true,返回 y
  • x || y
    • x 为 false,返回 y
    • x 为 true,返回 x

基于 MIT 许可发布