阿里有道前端面试题,有很多解答帖,扫除了一些知识盲点,下面做一下梳理
题目如下:
//a为何值时,输出1
let a = ?;
if(a==1 && a==2 && a==3){
console.log(1);
}
答案:
let a = {
_num:0,
valueOf:function(){
return this._num += 1;
}
}
if(a==1 && a==2 && a==3){
console.log(1);
}
分析:
- 首先搞清楚js的==机制:
等号比较的是变量的原始值,即:在比较之前会先将两边的变量转为原始类型
js有两种类型:原始类型(Primitive)、对象类型(Object)
原始类型 包括:Undefined、Null、Boolean、Number和String五种 - 如何获取变量的原始值:
js对象都有valueOf()和toString()两个方法,先计算 obj.valueOf() ,如果结果为原始值,则返回 此结果;否则,计算 obj.toString() ,如果结果是原始值,则返回此结果;否则,抛出异常; - a不可能同时和三个数值相等,a中必然包含自增运算。可以重写 valueOf() 方法,每次执行自增1;
运行:
执行到a==1
,a为Object类型,a.valueOf()==1
,1是原始类型,真实比较结果1==1
为true
执行到a==2
,此时a._num==1
,比较a.valueOf()==2
结果2==2
为true
执行到a==3
,同理,比较a.valueOf()==3
结果3==3
为true
执行console.log(1);
尽然还有方法二!
得知了js的等号机制,发现可以重写数组的方法,虽然不太符合a=?
的题目要求,但也是一种实现方法,尝试一下也算是更深入的理解了javascript
先贴代码
let a = [1,2,3];
a.toString = a.shift;
if(a==1 && a==2 && a==3){
console.log(1);
}
分析:
a的类型为Array
,执行等于判断之前会先执行a.valueOf()
,结果为a本身,类型仍然是Array
,执行a.toString()
返回"1,2,3,4"
类型为String
是原始类型;
和方法一的思路是一样的:我们可以用shift()
重写toString()
方法,返回第一个元素并删除;