js中我们熟悉又陌生的小知识

290 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

问题

[3, 15, 8, 29, 102, 22].sort()排序结果是什么?

解析:

注意这是一道面试题,看到这道题的时候,我们都知道数组会默认进行排序,所以心中的答案是:

[3,8,15,22,29,102],但是想了想,这既然是一道面试题,不应该这么简单,里面肯定另有玄机,我们打开MDN,看看API。

image.png

答案:

看了上面的解析,我们这里也就知道答案了:

image.png

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);
    }

image.png

原理解析: 这里面==属于关系运算符,这块涉及到隐式类型转化。

由于==的右边是数字类型,于是js就需要把关系运算符两边转换成一样的数据类型,进行比较。转换数据类型number的顺序如下:

  1. 先使用valueOf()方法获取其原始值,如果原始值不是number类型,则使用toString方法转成string类型。
  2. 将string类型转换为number.
  3. 进行关系运算。

我们熟悉了解隐式类型转换以后,是不是感觉多了一种方案(采用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转换为数值,然后再计算。

结语

一步一步慢慢来,踏踏实实把活干!