这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战
背景
学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。
问题
[3, 15, 8, 29, 102, 22].sort()排序结果是什么?
解析:
注意这是一道面试题,看到这道题的时候,我们都知道数组会默认进行排序,所以心中的答案是:
[3,8,15,22,29,102],但是想了想,这既然是一道面试题,不应该这么简单,里面肯定另有玄机,我们打开MDN,看看API。
答案:
看了上面的解析,我们这里也就知道答案了:
a等于多少,可以打印出1呢?
var a = ?;
if(a == 1 && a == 2 && a == 3){
conso.log(1);
}
解析:
这种情况我先想几个特殊的类型,undefined,null,0这些都不成立! 然后我们再观察是== ,是不是考虑字符串可以啊?? 突然想到重写toString方法,看看好不好使。
答案:
var a = {
i: 1,
toString: () => {
//重写toString,每次类型比较,其实
return a.i++;
}
};
if(a==1 && a==2 && a==3){
console.log(1);
}
原理解析: 这里面==属于关系运算符,这块涉及到隐式类型转化。
由于==的右边是数字类型,于是js就需要把关系运算符两边转换成一样的数据类型,进行比较。转换数据类型number的顺序如下:
- 先使用valueOf()方法获取其原始值,如果原始值不是number类型,则使用toString方法转成string类型。
- 将string类型转换为number.
- 进行关系运算。
我们熟悉了解隐式类型转换以后,是不是感觉多了一种方案(采用valueOf):
var a = {
i: 1,
valueOf: () => {
return a.i++;
}
};
if(a==1 && a==2 && a==3){
console.log(1);
}
3 + "2" + 5 与 3 + "2" - 5的值分别为多少?
这道题大家应该粗心的话可能会错。
正确答案:"325", 27
原理解析:
3 + "2" - 5 => "32"-5=27,如果只有一个操作符是字符串,则将另外一个操作数转换为字符串,再将两个字符串拼接。
由于后面一个是+,一个是-,所以这块就有区别了,如果是+,前面操作数如果是字符串,则将后面数字转换为字符串,然后运算。 如果是-,则将任意操作数是字符串、布尔型、buernull、或者undefined,则先使用Number转换为数值,然后再计算。
结语
一步一步慢慢来,踏踏实实把活干!