可能被忽略的一些JavaScript数组方法细节


Posted in Javascript onFebruary 28, 2019

前言

自以为还算一个比较高产的人吧~但是感觉好久都没有写点什么没有营养的东西了,这一篇本来是打算去年年底都要拿出来说一说的,但是年底事情太多了,加上我真的变懒了拖到现在才要把这个准备了好久的标题完善一下。

之所以会突然想讲一讲JavaScript中的数组,是因为我经历了好多次事后发现很傻的问题,所以就想说还是总结一下,这篇相当于总结一样的文章我也不想讲数组的方法是怎么用的,毕竟不管是在哪,数组方法的使用都有很多教程了,单纯的就来说一说那些我们可能忽略的细节。

抛砖引玉

在开始正式讲被我们忽略的一些数组方法之前,我还是想先举一个例子来说说我在其中躺过的一丢丢小坑~

现在我们随便来有一个小小的需求,写一个方法,有两个参数,一个是数组,另一个是需要添加到数组里面的元素。

function arrPush(arr, target) {
 return arr.push(target);
}

var arr_1 = [1, 2, 3];

console.log(arrPush(arr_1, 4));

上面的代码对你来说应该是很简单的吧,我们的需求就是把[1, 2, 3]变成[1, 2, 3, 4],看起来好像没有错诶~大胆的推测一下最后的console.log()结果是什么呢,你可以自己试一下看看。

好了,不卖关子了,最后的结果是4,诶?你可能已经清楚了这个点,你也可能完全不知道是怎么回事,没关系,清楚了你就当在复习一次,没清楚的话那你真的应该把这篇应该不长的总结看一下下。

意想不到数组方法

上面抛砖引玉之后你可能大概加估计应该也知道了我为什么想要做这样一个总结,尤其是对JavaScript掌握的不是那么好的同学来说,更是特别容易忽略的地方了。

我希望当你看到下面方法名字的时候,应该马上出现那个方法的用法,而且应该知道你可能没有经常用到的它剩下的参数还有它的返回值。

其实很多时候在MDN上面对一个方法的描述已经非常清楚了,但是我们还是会忽略到,所以结合例子来看,可能对你的记忆会更加有帮助。

array.push

上面抛砖引玉的原因,先来说说这个方法,解释一下出现上面情况的原因。

push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度

这一句话其实已经把上面的答案解释了,我们在return arr.push(target)的时候,返回的是arr.push()函数的返回值,这个值是这个数组新的长度,所以结果是4,来正确的使用一下这个方法。

function arrPush(arr, target) {
 arr.push(target)
 return arr;
}

var arr_1 = [1, 2, 3];

console.log(arrPush(arr_1, 4));

这个时候结果才是我们最后想要的[1, 2, 3, 4],顺便就说说push方法可以同时接收多个参数,像这样arr.push(1, 2, 3, 4) ,返回结果当然还是数组的新长度啦。

array.concat

接着来说说concat合并多个数组的方法,因为想要跟上面的push做一下对比,所以选择接着说这个方法,来看一下小例子。

function arrConcat(arr, arr2) {
 arr.concat(arr2);
 return arr;
}

var arr_1 = [1, 2];
var arr_2 = [3, 4];

console.log(arrConcat(arr_1, arr_2));

由于上面push方法的原因,我们依然选择return arr,这样的结果是什么呢,还是建议大家动手试一试,会发现得到的是[1, 2],哇哦~怎么和push表现不一致呢,为什么又返回了[1, 2]。

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组

当你理解了这个方法的时候,你就会发现MDN上面的表述真的很棒~忍不住想要夸一下它,很清楚了吧,concat方法不会改变原来的数组,也就是当我们return arr的时候,arr并没有发生改变,所以还是[1, 2],改写一下我们的方法。

function arrConcat(arr, arr2) {
 return arr.concat(arr2);
}

var arr_1 = [1, 2];
var arr_2 = [3, 4];

console.log(arrConcat(arr_1, arr_2));

这时候在看就会得到预期的结果了~这个方法其实还有一个神奇的地方,就是它可以直接连接一个值,并且它也能同时连接多个值或者多个数组,或者多个值和多个数组的组合,像这样。

var arr = [1, 2];
arr.concat(3, 4, [5, 6], 7, [8, 9]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

arrary.map 和 array.forEach

因为这两个方法有丢丢类似,所以同时说一下,顺便讲讲它们的区别吧,先来看看它们的基本解释。

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果

forEach() 方法对数组的每个元素执行一次提供的函数

从这两句解释来看,它们都是迭代数组的每一个元素,区别是map方法会返回新的数组,而forEach方法不会,那它有返回值吗?答案是有的...

var arr = [1, 2, 3];

var newArr = arr.map(item => {
 return item + 1; 
}); // [2, 3, 4];

var newArr2 = arr.forEach(item => {
 return item + 1; 
}); // undefined

var newArr3 = arr.map(item => {
 console.log(item + 1);
}); // [undefined, undefined, undefined]

// 2
// 3
// 4

var newArr4 = arr.forEach(item => {
 console.log(item + 1); 
}); // undefined

// 2
// 3
// 4

答案我已经写在上面了,map方法必须显示的返回值,而forEach只是对数组的每一个元素执行内部内容。这两个方法的参数是一致的,回调函数和执行回调函数时使用的this值,回调函数中的参数也是一致的,分别是数组当前元素、当前元素索引和数组本身。

一般来说我们用的比较多的也就是回调函数和它的两个参数,很多人忽略了回调函数的第三个参数,其实还蛮好用的,先不表。最后就是改变this值的参数,因为真的很少用,也没有实际案例来说,所以就不多说了,大家知道还有这么个东西就行,如果有实际用到的情况,也可以给我分享一下,学习一下~

arrary.filter

在es5之后的新的数组迭代方法,参数几乎都与上述一致。

- 回调函数(数组当前值,当前值索引,数组本身)

- 执行回调函数的this值

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素

本身这个数组过滤的方法使用很简单,我就说一丢丢在使用的时候的小技巧,比如数组去重就很好用。

var arr = [1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9];
var result = arr.filter((item, index, arr) => {
 return arr.indexOf(item) === index; 
});
console.log(result); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

arrary.pop 和 arrary.shift

上面说了很多了~大家估计也大概知道我们容易忽略的一个是方法的返回值,还有就是没有经常使用的参数,所以我这两个方法就直接上说明了。

pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度

shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度

这两个方法用法完全相同,区别就是一个弹出的是数组最后的元素,一个弹出的是数组最前面的元素,弹出这个大家看了上面方法的解释也应该知道我想表达的是方法返回值元素~

var arr = [1, 2, 3];

console.log(arr.pop()); // 3
console.log(arr.shift()); // 1

console.log(arr.length); // 1

结语

我并没有把所有的数组方法的拿出来说一下是觉得上述这些例子已经足以告诉大家平常我们在使用的时候容易忽略的地方,也不是什么很难理解的东西,所以就说到这里吧~剩下的方法就靠大家自己去仔细的使用了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Use Word to Search for Files
Jun 15 Javascript
关于恒等于(===)和非恒等于(!==)
Aug 20 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
javascript模拟实现ajax加载框实例
Oct 15 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
js 打开新页面在屏幕中间的实现方法
Nov 02 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
关于微信小程序map组件z-index的层级问题分析
Jul 09 Javascript
Vue开发环境中修改端口号的实现方法
Aug 15 Javascript
Vue插件从封装到发布的完整步骤记录
Feb 28 #Javascript
Javascript删除数组里的某个元素
Feb 28 #Javascript
vue强制刷新组件的方法示例
Feb 28 #Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 #Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 #jQuery
Vue多组件仓库开发与发布详解
Feb 28 #Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 #Javascript
You might like
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python入门之后再看点什么好?
2018/03/05 Python
python学习入门细节知识点
2018/03/29 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
施工班组长岗位职责
2014/01/05 职场文书
发展部经理职责规定
2014/02/22 职场文书
物业消防安全责任书
2014/07/23 职场文书
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers