Appearance
对象转原始类型规则
如何让下面判断条件成立:
javascript
if (a == 1 && a == 2 && a == 3) {
console.log('成立')
}
宽松比较 =
的规则
- 两端存在
NaN
,返回 false。
javascript
NaN == 1
false
NaN == '1'
false
NaN == true
false
NaN === NaN
false
- 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
- 两端类型相同,比较值
javascript
'a' == 'b'
false
1 == 123
false
1 == 1
true
- 两端都是原始类型,转换为数字比较
javascript
true == 1
true
+true
1
true == 'true'
false
+true
1
'true' - 0
NaN
- 一端是原始类型,一端是对象,把对象转为原始类型后重新比较
对象转原始类型
- [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
- valueOf() 能得到原始值则使用,得不到原始值则下一步
javascript
const a = {
valueOf() {
console.log('valueOf called!')
return 1
}
}
a == 1
VM2004:3 valueOf called!
true
- 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
- 都没有 抛出异常
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 成立