0%

思考如何使a==1&&a==2&&a==3为true

涉及运算符比较过程,运算符在比较两个值是否相等的时候做了什么,第二个涉及闭包JS比较两个数值是否相等可以用== 和=== ,其中 == 会有隐式类型转换的操作,===则不会,在两个数比较时,先调用valueOf,如果返回的不是原始类型,继续调用toString,如果不是原始类型,抛出异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const b = {
value :1,
toString(){
return {
name:1
}
},
valueOf(){
return {
name:1
}
}
}
console.log(`toString : ${b==3}`)
console.log(`valueOf : ${b==4}`)
//抛出异常TypeError: Cannot convert object to primitive value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const b = {
value :1,
toString(){
return 3
},
valueOf(){
return {
name:1
}
}
}
console.log(`toString : ${b==3}`)
console.log(`valueOf : ${b==4}`)
//toString:true,valueOf:false
1
2
3
4
5
6
7
8
9
10
11
12
13
const b = {
value :1,
toString(){
return 3
},
valueOf(){
return 4
}
}

console.log(`toString : ${b==3}`)//false
console.log(`valueOf : ${b==4}`)//true

OK,接下来说正题, a==1的时候先调用了a.valueOf(),然后根据valueOf的返回值与1进行比较,但是在a==1为真的情况下如何确保a==2以及a==3也同时成立呢?还记得里两个数比较时做的操作吗?先调用valueOf,然后是toString,所以只要覆写其中一个方法

1
2
3
4
5
6
7
8
const a ={
value:1,
toString(){
return this.value++;
}
}
//由于这时的a是一个Object,所以调用valueOf的时候返回的并不是原始类型,因此我们覆写toString方法即可
console.log(a==1&&a==2&&a==3)//true