面试总结

10次阅读

共计 3755 个字符,预计需要花费 10 分钟才能阅读完成。

前言
这次面试发现自己的问题还是很多很多,最基础的 js 数组的问题都没有熟悉到位,面试官问 js 数组有哪些方法,我都回答不上来,还有就是很多知识都很零散,以前明明看过,但是就是容易忘,现在对今天面试的题目总结一下。
数组去重有哪些方法?
排序后遍历去重
let array = [1,22,44,44,44,33,33,33,33,44,22,1]

function deleteArray(){
let newArray = [];
array = array.sort()
array.map((index,item)=>{
if(index != array[item+1]){
newArray.push(index)
}
})

console.log(newArray)
}

deleteArray();//[1, 22, 33, 44]
说明:sort()方法比较特殊,会将 [1,12,3,4,24] 排序成[1,12,24,3,4],你会发现如果该数字是两位数的话,sort 只会根据第一个数字排序,这样显然是错的,所以我们在进行排序的时候要在 sort 中传入一个比较函数,这也牵扯出了一道很容易考的题:
怎样实现一个随机数组(也称随机洗牌算法)?
arr = arr.sort(function(a,b){return Math.random() – 0.5;})// 最好是针对数值型数组

分析:是的,你没有看错,一行代码就可以解决这个问题,只要在 sort 中放一个函数就可以,而且是不需要被调用的,根据函数返回值的正负,来判断怎么排序,具体参考这里。
indexof 去重
let array = [1,22,44,44,44,33,33,33,33,44,22,1]

function deleteArray(){
let newArray = [];
for(let i = 0;i<array.length;i++){
if(newArray.indexOf(array[i]) == -1){
newArray.push(array[i])
}
}

console.log(newArray)
}

deleteArray();
set 方法去重
let array = [1,22,44,44,44,33,33,33,33,44,22,1]

function deleteArray(){
let newArray = []
// 使用 set 方法进行去重过后得到的是一个对象,所以我们还要想办法把它变成一个数组
newArray = new Set(array)
//Array.from 可以直接将对象转换成数组,也可以使用 …newArray 的方法将可遍历对象转换成数组
newArray = Array.from(newArray)// 或 newArray = new Array(…newArray)
console.log(newArray)
}

deleteArray();//[1, 22, 33, 44]

使用 reduce 方法去重
参考这里
数组的方法有哪些?这些方法中不改变原数组的有哪些?
数组的方法有:

concat: 连接两个数组,不改变原数组

join:将数组中的内容放入一个字符串中,括号中的参数就是分隔符,不改变原数组

slice:获取数组指定位置区间的元素,不改变原数组

不传参数时,相当于不操作,返回整个数组
传入一个参数时,会返回从该参数到数组末尾的所有元素
传两个参数时,会返回从第一个参数到第二个参数之间的所有元素,但是不包含最后一个元素
当传入的参数为负数时,会加上数组的长度再取元素,比如说 slice(-2,-1)=>slice(3,4)(假设数组长度为 5)
当传入两个参数,并且第一个参数大于第二个参数时,会返回空数组

pop:删除并返回数组的最后一个元素,会改变原数组

shift:从数组的头部删除元素,返回的是该元素,会改变原数组

unshift:向数组的头部添加元素,返回的是数组长度,会改变原数组

push:向数组的末尾添加一个元素,返回的是数组长度,会改变原数组

reverse:将数组进行反转,返回的是反转后的数组,会改变原数组

sort:对数组进行排序,原理是先将数组中的元素转换成字符串,然后比较字符串,如果要正确的排序,需要在方法中传入一个比较函数,返回的是排序后的数组,会改变原数组

splice:主要用途是在数组的中部插入或删除元素,返回的是从该数组中删除的元素,如果没有删除,则返回空数组,会改变原数组

删除任意数量的项,需要传入两个参数,第一参数指定删除的开始位置,第二个参数指定删除多少项

插入任意数量的项,需要传入 3 个参数,分别为起始位置,要删除的项数(一般取 0),插入的项(可以为多项)

替换指定数目的项,参数和上面完全相同,只是第二个参数不再取 0

indexOf:查找指定元素的位置,返回该元素第一次出现的位置,不会改变原数组

如果只传入一个参数,表明是查找该元素
如果传入两个参数,则第一个表示从哪个位置开始往后找,第二个参数表示要查找的元素

lastIndexOf:从后往前查找指定元素的位置,只是和 indexOf 的查找方向不同,其他部分均相同
reduce:这个方法很强大,也比较复杂,我专门总结了一篇文章,这个方法也不会改变原数组

总结:改变原数组的方法有:shift,push,pop,unshift,sort,reserve,splice 不改变原数组的有:concat,join,slice,reduce,indexOf,lastIndexOf
http 常见状态码有哪些?服务器怎么判断出是否应该返回 304 状态码?
答:常见的状态码就先不说了,这篇文章中写了,重点看服务器怎么判断应该返回 304 状态码,具体实现为:

浏览器第一次请求资源,响应成功,会返回 200,然后浏览器会将这个资源的副本缓存在本地;(这个资源的响应头部会带有一个 ETag 字段,用来标志这个资源)
下次再发送请求时,在请求头中会有一个 If Modified Since 字段,这个字段是告诉服务器如果在这个时间之后的资源没有发生更改,自己就可以直接从缓存中拿了,如果有更改,就需要发送新的资源了;(服务器就是通过 ETag 字段来判断资源是否更改)
服务器通过匹配 ETag 字段发现没有更改时,会返回一个 304。

js 中的事件冒泡和事件捕获
答:事件冒泡是 IE 的事件流,事件开始是由最具体的元素接收,然后逐步向上级传播为较不具体的节点;而事件捕获是网景推出的事件流,和事件冒泡刚好相反,事件捕获是从外到内,从最不具体的流向具体的节点,也就是最具体的节点是最后接收到事件的。(补充:DOM2 级事件的流的三个阶段跟别为事件捕获阶段,处于目标阶段,事件冒泡阶段)
js 中基本数据类型有哪些?引用类型有哪些?
答:基本数据类型包括:null,undefined,string,number,boolean,symbool(es6 中新增);引用类型只有 Object;其中基本数据类型是存放在栈中,引用数据类型是存放在堆中。
null 和 undefined 的区别?
答:null 通常表示指向空指针的对象,而 undefined 一般是表示只进行声明但是没有初始化的变量。
将 null 和 undefined 转换成 number 类型返回的是什么?
答:Number(null)==0 Number(undefined)==NaN Number(“”)==0
将哪些转换成布尔类型会返回 false?
答:false,NaN,””,null,undefined,0
js 事件循环机制?
答:事件循环机制就是任务分为主任务和异步任务,只有在主任务都执行完毕后才会去异步队列中取异步任务执行,这样就会造成异步的假象。具体解释,可以参考这里。
js 中的微任务有哪些?
答:微任务有 process.nextTick 和 promise.then
call()和 apply()以及 bind()的区别?
答:首先三者都可以绑定 this,从而改变 this 的指向,区别在于 call()和 apply()只是绑定 this 指向,没有返回值;而使用 bind()时,会返回一个函数,绑定了 this 指向后的这个函数在任何地方进行调用 this 都不会发生改变。而 call 和 apply 之间的区别在于前者传参时是逐个传入,而后者是传入一整个数组。
数组进行遍历的方法有哪些?它们的区别在哪儿?
答:遍历数组的方法有:

for — 需要知道数组的长度
forEach — 不需要数组的长度,没有返回值
map — 返回每次函数调用的结果组成的数组,不改变原数组
some — 只要函数调用结果有一个返回 true,结果就是 true
every — 函数调用的结果全部返回 true 时,返回的就是 true
filter — 根据条件对数组元素进行筛选,返回的是满足条件的元素组成的数组,不会改变原数组
reduce — 为数组中的每个元素执行一个回调函数,上面也有提到。
for-of — 用来遍历可迭代的数据结构,比如说数组,字符串,集合,类数组对象等。

 遍历对象的方法有:

for-in — 返回可枚举属性(包括自身和继承的),也可以遍历数组,不过返回的是数组的下标
Object.getOwnPropertyNames — 返回该对象自身的所有属性(包括可枚举的和不可枚举的)组成的数组
Object.keys — 返回该对象的自身的可枚举属性组成的数组

正文完
 0