三月份了,又到了春招的季节,该开始准备面试了(前端js面试1)

256 阅读6分钟

前言

俗话说金三银四,马上就是黄金三月份了,兄弟们该开始准备准备面试了。也许你可能会问,过两天就是三月份了,现在准备还来得及吗?别人我不好说,但是你看我的就可以,就由我带你速成面试,带你速通js八股。

1. js数组上面有哪些语法?

先给兄弟们来点简单的。不过虽然很简单,但是想要回答的面试官满意也还是有一定难度的。回答这种问题教兄弟们一个方法,分类回答。比如回答这个问题就可以从增,删,改,查,这四个方面来回答。

  1. 增加: unshift push splice concat(拼接字符串)
  2. 删除: pop shift splice slice
  3. 改: reverse sort with
  4. 查: indexOf lastIndexOf includes find
  5. 转换其他数据类型: join
  6. 迭代(遍历): forEach map filter some every
  7. Array.from()伪数组转真数组 Array.of()将多个值转为数组

还可以从转换,迭代这俩方面回答,这样就能够回答的更加的全面了。

2. js字符串上有哪些方法?

相信这个对于兄弟们来说仍然很简单,那这里就依然一笔带过,不做更多的赘述。

  1. 增: concat padStart
  2. 删: slice substr substring
  3. 改: replace trim(去除首尾空格) trimStart padStart(填充字符串) toUpperCase
  4. 查: indexOf lastIndexOf includes EndWith startWith
  5. 转换: split
    我并没有完全列出来,比如padStart那自然有padEnd,有toUpperCase那自然有toLowerCase,这种类型的我就不全列出来了。

3. 谈谈js中的类型转换机制

要开始给兄弟们上强度了,面试时最怕的就是这种请你谈谈什么,这样一个概念太过宽泛,一下子面对这样的问题很容易不知道从何下手,大脑一片空白。还是和上面那样回答类似,我们的回答要有条理。不知道从何下手,就先解释一下这个东西是什么

js中的类型转换是什么?

首先,在js中有着原始类型和引用类型两种。而原始类型有7种,引用类型也有7种。接着面试官就很可能会问,有哪几种,当然没问你自己清楚的话也要说。我们在面试中要学会引导面试官,把他们引导到我们知道的知识点上去。

  • 原始类型: number string symbol boolean undefined null Bigint
  • 引用类型: arr Object function Data Regexp Set Map

而类型转换分为隐式类型转换和显式类型转换,通常在开发中,我们会用到一些显式类型转换的手段来完成逻辑开发。显式类型转换通常就是直接调用各个类型的构造函数。

var res = Number('sd512');//NaN
var res = String(11111)//'11111'

而隐式类型转换则通常发生在比较运算符和算术运算符中

隐式类型转换才是面试官想要听的重点,也是这个问题的难点。
首先仍然是先谈谈是什么:隐式类型转换是在一定场景下,js 运行环境自动调用这四种方法,尝试转换成期望的数据类型,前三种方法 ToString ToNumber ToBoolean,我们主要知道就好,可以不用深入了解。原理基本就是直接的转换,这部分我们主要就要记住这张类型转换表就好。然后还有就是当ToString() 要转换的数值为对象时,会直接调用**ToPrimitive(obj,String)**方法,这个方法才是这个问题的重点。

image.png

  • ToPrimitive(obj,type)
    这个方法只针对于引用类型转原始类型,它里面的两个参数obj是要转换的数值,type是要转换的目标类型。这个方法的第一步都是先判断obj是不是原始类型,如果是就直接返回。
对象转字符串 ToPrimitive(obj,String)
判断obj是基本类型,则返回
否则调用 toString 方法,如果得到原始类型则返回
否则调用 valueOf 方法,如果得到原始类型,则返回
否则 报类型错误
对象转数字 ToPrimitive(obj,number)
判断obj是基本类型,则返回
否则调用 valueOf 方法,如果得到原始类型,则返回
否则调用 toString 方法,如果得到原始类型,则返回
否则 报类型错误

这个valueOf方法他是只针对于包装类的方法,对于包装类我的另外一篇文章有详细的讲解。详解js的包装类 new在v8引擎底层是如何执行的 - 掘金 (juejin.cn),这个方法简单来说就是去掉了那一层包装类,大概就是在这样一个过程

    Number{123} -> 123
    String{'hello'} -> hello

另外值得注意的是ToPrimitive所用的这个toString和上面那个ToString是不一样的。这个toString的逻辑是这样的

obj.toString()
{}.toString() // "[Object class]"
数组的toString()会将数组中所有的元素转化为字符串,并以逗号拼接
函数的toString()会将整个函数体以字符串形式返回
DatetoString()会将整个date以字符串形式返回

我们还需要知道比较运算符和加法运算符的逻辑,因为面试中有个经典的问题 []==![] 这个的结果是什么,答案是true。

# 二元运算符
+ 优先当作加法运算,所以左右先转Number
v1 + v2 === ToPrimitive(v1) + ToPrimitive(v2)   //v1,v2都为引用类型
1. 如果 lprim 是字符串 或者 rprim是字符串,则返回将不是字符串的一方转为字符串,再进行拼接
2. 否则 都转为number 进行加法运算

## == 相等运算符 ( === 不发生隐式类型转换)
x == y
如果x和y类型相同
如果x是undefinednull返回true
如果x是number,如果x是NaN返回false(NaN!=NaN)
如果x和y的number值相同,返回true
如果x是字符串,那就看x和y是不是完全相同的字符串序列
如果x,y是布尔值,如果x和y是相同的值那就相同
如果x和y是对象,且是同一个对象(地址相同),返回true

如果x是null且y未定义,则返回true
如果x是number,y是string,返回x==ToNumber(y)的结果
如果x为bool,则返回 ToNumber(x)==y
如果x为StringNumber,y为对象,返回 x == ToPrimitive(y)对象转成字符串最后还会转成数字

因此 *[]==![]*的逻辑就是这样的

[] == ![]
[] == !true
[] == false
[] == 0 
"" == 0
0 == 0
 true

至此,关于类型转换就差不多聊完了,篇幅有点长,但是大家不一定要全部都聊,可以选择性的说,但是关于ToPrimitivevalueOf的部分一定要记住,这个两个东西是一定要会的,这才是面试官想要你回答的,至于其他的都是加分项。

尾声

这个系列仍然会接着更新的,想要面试又无从下手的可以关注我一下等我更新哦。另外兄弟们点点赞吧,创作不易,兄弟们的每一个赞都是对我的激励。祝兄弟们都前程似锦。