例子
[] == ![] 结果为 true,比较过程:
- [] == ![]
- [] == false
- [] == 0
- [].valueOf() == 0
- [].toString() == 0
- ‘’ == 0
- 0 == 0
- true
== 比较规则
x == y,
- 类型相同: x === y
- null 和 undefined:true
- NaN 和任何值不相等,包含本身(NaN == NaN // false)
- x 和 y 分别为 String 和 Number 类型:String 类型 ToNumber
- x 或 y 为 Boolean 类型:先将 Boolean 类型 ToNumber
- x 和 y 分别为 Object 类型和 Number/String/Symbol 类型:先将 Object 类型 ToPrimitive(
ToPrimitive(input[, PreferredType]): PreferredType 默认值为 number, 则 Object ToPrimitive 先调用 valueOf,若没有该方法或该方法返回其本身,则调用 toString) - 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 方法 |
