一道京东面试题:下面代码什么时候会打印出 1 ?
var a = ?;
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
怎么实现呢?a 能与1,2,3相等,那a肯定不能是简单的一个number或string,那试试数组和对象吧?!
我们知道当复杂类型与基本类型数据作比较时,会发生隐式类型转化
先试试数组:
var a = [1, 2, 3]
当 a 是一个数组时,a == 1就会调用 toString()方法,然后,
a.toString = a.shift
完整代码:
var a = [1,2,3]
a.toString = a.shift
if (a == 1 && a == 2 && a == 3) {
console.log(1)
}
还有一种方法,
var a = {
i: 1,
toString: function() {
return a.i++
}
}
因为a是一个对象,a == 1 的时候会隐式调用原型链上的toString或valueOf方法,我们在这里使toString方法变成了 return a.i++,所以 a 会依次取值 1、2、3(把toString换成valueOf,结果一样)
还有使用Object.defineProperty()的
Object.defineProperty(window, 'a', {
get: function () {
if (this.value) {
return this.value += 1
} else {
return this.value = 1
}
}
})
if (a == 1 && a == 2 && a == 3) {
console.log(1)
}
为什么要加if...else判断呢?因为最初时 this.value===undefined
把上面的精改一下:
Object.defineProperty(window, 'a', {
get: function () {
return this.value = this.value ? (this.value += 1) : 1
}
})
if (a == 1 && a == 2 && a == 3) {
console.log(1)
}
参考链接:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/57