看到了一道面试题:a==1&&a==2&&a==3在什么时候成立,查阅资料后总算明白了,记录一下。
一.利用==中的隐式类型转换
1.原理与思路
首先要了解==运算符中究竟发生了什么。
js调用==进行比较时,不同与===,双等号会触发类型转换,进行比较的事实上不是原始值,而是valueOf()的返回值,类型转换可能会触发两个函数,分别是toString()与valueOf(),关于区别可参照https://www.jb51.net/article/102027.htm
在这里调试后发现触发了valueOf(),每进行一次比较就调用一次,我们可以做一些简单代码来测试是否正确。
//定义obj2,重写方法
let obj2={
arr:[1,2,3],
toString:()=>{
console.log("toString")
},
valueOf:()=>{
console.log("valueOf")
}
}
接着在控制台输入==来进行比较操作,查看结果。
的确是调用了valueOf(),所以我们可以在这里做一些手脚。
2.JS实现
//定义obj3来完成操作
let obj3={
i:1,
valueOf:()=>{
return obj3.i++
}
}
二.利用definProperty的get方法
1.原理与思路
js调用对象属性时时经过了get与set一层的,我们可以在这里进行改动。
2.js实现
let a={
temp:'',
time:0
}
Object.defineProperty(a,"temp",{
get:function(){
return a.time++;
}
})