例子

[] == ![] 结果为 true,比较过程:

  • [] == ![]
  • [] == false
  • [] == 0
  • [].valueOf() == 0
  • [].toString() == 0
  • ‘’ == 0
  • 0 == 0
  • true

== 比较规则

x == y,

  1. 类型相同: x === y
  2. null 和 undefined:true
  3. NaN 和任何值不相等,包含本身(NaN == NaN // false)
  4. x 和 y 分别为 String 和 Number 类型:String 类型 ToNumber
  5. x 或 y 为 Boolean 类型:先将 Boolean 类型 ToNumber
  6. x 和 y 分别为 Object 类型和 Number/String/Symbol 类型:先将 Object 类型 ToPrimitive(ToPrimitive(input[, PreferredType]): PreferredType 默认值为 number, 则 Object ToPrimitive 先调用 valueOf,若没有该方法或该方法返回其本身,则调用 toString)
  7. return false

+ 一元操作符

ToNumber(GetValue(expr))

ToNumber

类型 转换结果
Undefined NaN
Null +0
Boolean true -> 1,false -> +0
Number 数字值
String
- 数字字符串字面量:去掉头尾空格
- 小数数字字符串字面量:加前导零,例如 +’.12’// 0.12
- 包含正负号数字字符串字面量:保留-,去掉+
- 空字符串或只包含空格字符串字面量:+0
- Infinity/-Infinity 被识别为数字字符串字面量,而不是数字字面量
- 数字字符串字面量支持 BigInt 后缀 n
Symbol/BigInt Throw TypeError
Object primValue = ToPrimitive(argument, hint Number)
ToNumber(primValue)

Object 类型 ToPrimitive

类型 valueOf toString
Array 数组对象本身 数组元素 toString,然后用逗号分隔符连接起来
Function 函数本身 函数源代码字符串
Date 从 1970-01-01 午夜开始的毫秒数UTC 美式英语日期格式的字符串,例如 “Tue Aug 19 1975 23:15:30 GMT+0800 (中国标准时间)”
Object 默认对象本身 [object Object]
Number 数字值 字符串值
Boolean 布尔值 “true” “false”
String 字符串值 字符串值
Math 和 Error 对象 返回对象的原始值,通常由 JavaScript 在后台自动调用,并不显式地出现在代码中 返回对象的原始值,通常由 JavaScript 在后台自动调用,并不显式地出现在代码中
null 和 undefined 无 valueOf 方法 无 toString 方法