【Array数组】面试前基础知识点深度记忆总结

news/2024/7/11 1:42:14 标签: 前端, javascript, es6, 面试

写本篇博客的原因是发现有人遇到了以下误区,

1、在我面试别人的过程中,我想让他说一下数组的一些内置方法和含义,然后他条例思路不太清晰,跳动着说,所以遗漏了很多,或许按照es5到es6是一个指导顺序,或者先说对数组的删除,插入,再说到遍历这个顺序;

2、我问了一下filter,如果不用filter或者之前没有filter的时候,应该怎么实现一下filter的这个方法,貌似之前没有准备这块,其实也可能是filter用的不多;

3、我之前好像看过一篇博客,写的如果再用for循环,就要扇自己之类的,其实大可不必如此,我觉得我们之中很多人还没有强大到的鄙视某一项技术点的时候吧,想扇就扇自己几下吧,我们也看不见。

 

目录

es6%E5%AE%9E%E7%8E%B0-toc" style="margin-left:80px;">1、filter 查找非 es6实现

es6%E5%AE%9E%E7%8E%B0-toc" style="margin-left:80px;">2、every 判断的 非es6实现

es6%20%E5%AE%9E%E7%8E%B0%C2%A0-toc" style="margin-left:80px;">3、some 判断的 非es6 实现 

es6%20%E5%AE%9E%E7%8E%B0%C2%A0-toc" style="margin-left:80px;">4、find查找的 非es6 实现 

5、请为数组自定义一个方法 myFn ,实现 find 的方法

6、请说一说js中数组的常用内置方法

7、你现在遍历数组,还用for循环吗?


es6%E5%AE%9E%E7%8E%B0">1、filter 查找非 es6实现

filter是通过遍历数组的所有元素,查找到符合过滤条件的元素,并且返回符合条件元素的集合。如果没有找到匹配的元素,那么返回的就是空数组,也就是返回的数组长度为0.代码如下:

var arr = [12, 33, 88, 66, 22];
var returnArr = arr.filter((item, index, arr) => {
    console.log(index + '  循环过程  ' + item);
    return item > 50;
})
console.log('得到的returnArr::', returnArr);

 

非ES6的实现,代码如下:

var returnArr = [];
for (var i=0;i<arr.length;i++) {
    if (arr[i] > 50) {
      returnArr.push(arr[i]);
     }
}
console.log(returnArr);

可以看出,filter相当于重新定义了一个空数组,对原数组进行了一次完整的遍历。需要注意的是filter是一次完整的遍历,数组长度是多少就要执行多少次,如果不是这种场景,可以考虑其他的执行方法。

es6%E5%AE%9E%E7%8E%B0">2、every 判断的 非es6实现

every是对原数组进行遍历判断,every更强调每一个,遍历执行过程中,一旦某一个不符合过滤判断条件,将会直接跳出循环,不再继续执行循环,返回值是false,所以,every返回的是boolean值,代码如下:

var arr = [12, 33, 88, 66, 22];
var returnPause = arr.every((item, index, arr) => {
   console.log(index + '  循环过程  ' + item);
   return item > 50;
})
console.log('得到的returnPause::', returnPause);

 

可见every是一个返回boolean值得执行过程,而且他强调每一个是否符合判断条件。 

非ES6的实现,代码如下: 

var returnPause = true;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] <= 50) {
      returnPause = false;
      break;
   }
}
console.log(returnPause);

而非es6的实现明显判断条件和every的判断条件正好相反,同时every对for循环的break及时跳出循环做了一层封装。 

es6%20%E5%AE%9E%E7%8E%B0%C2%A0">3、some 判断的 非es6 实现 

some和every更强调如果有,就返回true,及时跳出,不再继续执行循环。这里也是对break的一个封装。可以说在日常工作中,数组的元素可能非常多,如果不能及时做出break跳出,将会非常耗费性能。some的代码如下:

var arr = [12, 33, 88, 66, 22];
var returnPause = arr.some((item, index, arr) => {
     console.log(index + '  循环过程  ' + item);
     return item > 50;
})
console.log('得到的returnPause::', returnPause);

而非es6的实现代码如下: 

var returnPause = false;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] > 50) {
       returnPause = true;
       break;
   }
}
console.log(returnPause);

与every相反,这里提前定义的返回结果为false,而some的提前定义结果为true。 

es6%20%E5%AE%9E%E7%8E%B0%C2%A0">4、find查找的 非es6 实现 

find强调查找到的第一个元素,一旦找到符合条件的元素,将会跳出循环,不再继续执行,代码如下:

var arr = [12, 33, 88, 66, 22];
var returnArr = arr.find((item, index, arr) => {
    console.log(index + '  循环过程  ' + item);
    return item > 50;
})
console.log('得到的returnArr::', returnArr);

可见,find查找也是找到后及时跳出循环,并且他返回的是某个元素,而非一个集合。

es6的实现:

var returnItem = 0;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] > 50) {
       returnItem = arr[i];
       break;
   }
}
console.log(returnItem);

以上4种查找方式更符合非准确查找案例,我们已知的是一个不太准确的消息,例如众多元素中是否有符合某种条件的元素存在,而非准确的说众多元素中是否有谁谁谁必须考了88分钟这样。

5、请为数组自定义一个方法 myFn ,实现 find 的方法

面试的时候,让当场自定义一个方法,去实现一些es6中新的方法,也是很常见的一种案例。上面我们已经知道了find的作用和他的本质实现,现在来自定义一个myFn,用来实现和find相同的需求逻辑,代码如下:

Array.prototype.myFn = function() {
   var myArr = this;
   var returnItem = 0;
   for (var i=0;i<myArr.length;i++) {
      if (myArr[i] > 50) {
        returnItem = myArr[i];
        break;
      }
   }
   return returnItem;
}
var returnValue = arr.myFn();
console.log('所得结果::', returnValue);

面试的时候,可能面试官知道你练习过怎么自定义一个方法,他其实是在看你有没有注意break关键字的使用。

6、请说一说js中数组的常用内置方法

我建议你可以这样回答:

在日常工作之余呢,我也有总结过,因为他的内置方法太多了,很容易记混;

△ 首先,有对数组删除和插入操作的,例如

push(向尾部添加元素)这个方法返回的是新数组的长度
pop(删除数组尾部的一个元素)这个方法返回的是删除的元素
unshift(向数组开头添加元素)这个方法返回的是新数组的长度
shift(删除数组的第一个元素)这个方法返回的是删除的元素
splice(从数组的某个位置删除元素,还可以选择是否添加元素,添加几个)这个方法没有返回值,只是单纯的操作数组
concat(链接2个或者更多的数组)这个方法现在我比较习惯用es6的解构...来添加了

△  非常常用的转字符串的方法,例如

toString方法这个方法可以将数组转为字符串,相当于join方法没有入参
join这个方法可以按照一定的规则将数组转为字符串

△  然后是返回数组的元素索引和截取

indexOf和字符串的方法类似,返回某个元素的第一次出现的索引值
lastIndexOf这个方法和indexOf相反,是返回最后一次出现的索引值
slice截取知道了indexOf方法后,就可以对数组进行一定的截取工作,所以我把这2个方法放在一起记忆

△ 数组的循环和判断

for循环并不是数组的内置方法但很多时候我还是比较喜欢这个方法的,因为很多新的方法其实封装了for循环
forEach循环但其实forEach并不能实现break和continue,这是我不太喜欢的,如果不需要这2个的需求逻辑,我会用forEach循环
some和every这2个方法都是合理利用break的体现
filter过滤这个方法会按照过滤条件,将循环整体走一遍,最后返回的是一个数组集合
find查找这个方法最终找到第一个符合条件的元素就break了,返回的是一个元素

△ 比较常用的还有累积计算的方法

reduce方法这个方法是将元素累积做计算,例如累加

可以说数组的内置方法还是比较多的,比较乱套。所以,不做一次整理,一旦面试的时候问起来很容易回答的很乱套,一旦乱套了,自己知道的东西也就忘记了。 

7、你现在遍历数组,还用for循环吗?

回答:用,很多人觉得for循环很low,不应该再用for循环了,其实我还远没有达到鄙视某个知识点的地步。如果某个需求涉及到对数组整体进行一次遍历,那么我会用forEach来遍历,但如果涉及到查找某到某一个元素就要及时跳出,我还是会采用for循环加break关键字的。

虽然some和every有时候也能满足,但我觉得他们也是对for循环的一个封装,不如for循环本身实现快速。而且for循环的兼容性更好一些。 


http://www.niftyadmin.cn/n/20330.html

相关文章

【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

【ML】异常检测、PCA、混淆矩阵、调参综合实践&#xff08;基于sklearn&#xff09;加载数据可视化数据异常点检测PCA降维使用KNN进行分类并可视化计算混淆矩阵调节n_neighbors参数找到最优值加载数据 数据集&#xff1a;https://www.kaggle.com/datasets/yuanheqiuye/data-cl…

【Python百日进阶-数据分析】Day138 - plotly甘特图:px.timeline()

文章目录一、语法二、参数三、返回值四、实例4.1 带有 plotly.express 的甘特图和时间表4.1.1 普通甘特图4.1.2 px.timeline 的离散颜色4.1.3 px.timeline 的连续颜色4.1.4 同一水平线上有多个条4.1.5 Dash中使用甘特图一、语法 甘特图是一种条形图&#xff0c;用于说明项目进…

客户管理繁,库存盘点难?明道云让你准点下班

文/张占胜 程哲 赵香英 编辑/杜逸敏 一、行业背景 随着疫情的扩散&#xff0c;经济形势日益复杂多变&#xff0c;进销存管理无疑成为了国内企业的焦点。如何利用新时代的先进技术把这一传统管理方式现代化和智能化&#xff0c;已经引起了国内业界的重视&#xff0c;这也是企…

嵌入式走过的路

嵌入式走过的路 一.基础二.进阶三.驱动四.有感以下是个人一路走过的一点小结,送给眼前有需要的人。 一.基础 1.数电 模电。 电路基础知识、数电模电基础知识、常用的电子元器件,像二极管 三极管 电阻 电容电感等。2.C 包括三大语法结构、常用的数据类型、函数、结构体、指针、…

ARM uart stdio 的移植

一、uart stdio的移植1 1. 什么是 stdio (1) #include <stdio.h> (2) stdio&#xff1a;standard input output&#xff0c;标准输入输出 (3) 标准输入输出就是操作系统定义的默认的输入和输出通道。一般在 PC 机的情况下&#xff0c;标准输入指的是键盘&#xff0c;标…

EsLint 常用规则

ESLint 是一个代码规范和错误检查工具&#xff0c;有以下几个特性。所有东西都是可以插拔的。你可以调用任意的 rule api 或者 formatter api 去打包或者定义 rule or formatter。任意的 rule 都是独立的。没有特定的 coding style&#xff0c;你可以自己配置。 中文文档: http…

学习性能所必须的知识之算法

什么是算法? 通过有效地缩小查找范围,只需要很少的次数就能很快速的找到需要的数字,这样的策略或方法就称为“算法”。 算法的好坏对性能有很大的影响。 学习算法的窍门 掌握算法优点与缺陷,“折中”是一个很重要的思维通过在图上推演来思考评价算法的指标 通过复杂度(…

改良型新药之详细分类

随着一类新药开发越来越困难、仿制药竞争激烈&#xff0c;改良型新药被认为符合我国医药企业转型升级的方向&#xff0c;吸引了更多企业切入&#xff0c;本文也将针对改良型新药的6个常见共性问题给予解答&#xff0c;涉及科普、专利、分类、临床价值、立项、注册申请、数据统计…