主题
类型转换规则 & 运算规则
类型转换规则
所有 -> 布尔
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"对象 -> 原始
- 首先调用
obj.valueOf()。- 如果返回的是原始值(number、string、boolean、symbol、bigint、undefined、null),直接使用这个值。
- 如果返回的是对象,则继续下一步。
- 调用
obj.toString()。- 如果返回的是原始值,直接使用这个值。
- 如果返回的还是对象,则返回这个对象本身。
此时,如果后续操作需要原始值(例如用于加法、字符串连接等),就会抛出 TypeError 错误。
运算规则
算数运算符
+、-、*、/、%++、--
转换为原始类型:
- 转换为数字,然后运算。
- 特殊情况:
x + y,x和y有一个字符串,则转换为字符串,然后拼接。 - 特殊情况:
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。
