前言
俗话说金三银四,马上就是黄金三月份了,兄弟们该开始准备准备面试了。也许你可能会问,过两天就是三月份了,现在准备还来得及吗?别人我不好说,但是你看我的就可以,就由我带你速成面试,带你速通js八股。
1. js数组上面有哪些语法?
先给兄弟们来点简单的。不过虽然很简单,但是想要回答的面试官满意也还是有一定难度的。回答这种问题教兄弟们一个方法,分类回答。比如回答这个问题就可以从增,删,改,查,这四个方面来回答。
- 增加: unshift push splice concat(拼接字符串)
- 删除: pop shift splice slice
- 改: reverse sort with
- 查: indexOf lastIndexOf includes find
- 转换其他数据类型: join
- 迭代(遍历): forEach map filter some every
- Array.from()伪数组转真数组 Array.of()将多个值转为数组
还可以从转换,迭代这俩方面回答,这样就能够回答的更加的全面了。
2. js字符串上有哪些方法?
相信这个对于兄弟们来说仍然很简单,那这里就依然一笔带过,不做更多的赘述。
- 增: concat padStart
- 删: slice substr substring
- 改: replace trim(去除首尾空格) trimStart padStart(填充字符串) toUpperCase
- 查: indexOf lastIndexOf includes EndWith startWith
- 转换: 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)**方法,这个方法才是这个问题的重点。
- 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()会将整个函数体以字符串形式返回
Date的toString()会将整个date以字符串形式返回
我们还需要知道比较运算符和加法运算符的逻辑,因为面试中有个经典的问题 []==![] 这个的结果是什么,答案是true。
# 二元运算符
+ 优先当作加法运算,所以左右先转Number
v1 + v2 === ToPrimitive(v1) + ToPrimitive(v2) //v1,v2都为引用类型
1. 如果 lprim 是字符串 或者 rprim是字符串,则返回将不是字符串的一方转为字符串,再进行拼接
2. 否则 都转为number 进行加法运算
## == 相等运算符 ( === 不发生隐式类型转换)
x == y
如果x和y类型相同
如果x是undefined和null返回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为String或Number,y为对象,返回 x == ToPrimitive(y)对象转成字符串最后还会转成数字
因此 *[]==![]*的逻辑就是这样的
[] == ![]
[] == !true
[] == false
[] == 0
"" == 0
0 == 0
true
至此,关于类型转换就差不多聊完了,篇幅有点长,但是大家不一定要全部都聊,可以选择性的说,但是关于ToPrimitive
和valueOf
的部分一定要记住,这个两个东西是一定要会的,这才是面试官想要你回答的,至于其他的都是加分项。
尾声
这个系列仍然会接着更新的,想要面试又无从下手的可以关注我一下等我更新哦。另外兄弟们点点赞吧,创作不易,兄弟们的每一个赞都是对我的激励。祝兄弟们都前程似锦。