Skip to content

对象转原始类型规则

如何让下面判断条件成立:

javascript
if (a == 1 && a == 2 && a == 3) {
    console.log('成立')
}

宽松比较 = 的规则

  1. 两端存在 NaN,返回 false。
javascript
NaN == 1
false
NaN == '1'
false
NaN == true
false
NaN === NaN
false
  1. undefined 和 null 只有自身比较或互相比较才返回 true,二者和其它原始类型比较都是 false。
javascript
undefined == null
true
undefined == undefined
true
null == null
true
undefined == 1
false
null == 1
false
undefined == false
false
null == 0
false
  1. 两端类型相同,比较值
javascript
'a' == 'b'
false
1 == 123
false
1 == 1
true
  1. 两端都是原始类型,转换为数字比较
javascript
true == 1
true
+true
1

true == 'true'
false
+true
1
'true' - 0
NaN
  1. 一端是原始类型,一端是对象,把对象转为原始类型后重新比较

对象转原始类型

  1. [Symbol.toPrimitive] 能得到原始值则使用,得不到原始值抛出异常
javascript
const a = {
    [Symbol.toPrimitive]() {
        console.log('Symbol.toPrimitive called!')
        return {}
    }
}

a == 1
VM1696:3 Symbol.toPrimitive called!
VM1737:1 Uncaught TypeError: Cannot convert object to primitive value
    at <anonymous>:1:3
javascript
const a = {
    [Symbol.toPrimitive]() {
        console.log('Symbol.toPrimitive called!')
        return 1
    }
}

a == 1
VM1804:3 Symbol.toPrimitive called!
true
  1. valueOf() 能得到原始值则使用,得不到原始值则下一步
javascript
const a = {
    valueOf() {
        console.log('valueOf called!')
        return 1
    }
}

a == 1
VM2004:3 valueOf called!
true
  1. toString() 能得到原始值则使用,得不到原始值抛出异常
javascript
const a = {
    valueOf() {
        console.log('valueOf called!')
        return {}
    },
    toString() {
        console.log('toString called!')
        return {}
    }
}

a == 1
VM2095:3 valueOf called!
VM2095:7 toString called!
true
  1. 都没有 抛出异常
javascript
const a = {
    valueOf() {
        console.log('valueOf called!')
        return {}
    },
    toString() {
        console.log('toString called!')
        return {}
    }
}

a == 1
VM2131:3 valueOf called!
VM2131:7 toString called!
VM2131:12 Uncaught TypeError: Cannot convert object to primitive value
    at <anonymous>:12:3

等式成立条件

javascript
const a = {
    num: 1,
    [Symbol.toPrimitive]() {
        return this.num++
    }
}
if (a == 1 && a == 2 && a == 3) {
    console.log('成立')
}
VM2248:8 成立

最后更新于: