可能被忽略的一些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 相关文章推荐
js中apply方法的使用详细解析
Nov 04 Javascript
jQuery实现倒计时按钮功能代码分享
Sep 03 Javascript
JavaScript实现文字与图片拖拽效果的方法
Feb 16 Javascript
jQuery实现的漂亮表单效果代码
Aug 18 Javascript
原生js制作日历控件实例分享
Apr 06 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
原生JS封装_new函数实现new关键字的功能
Aug 12 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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 启动报错如何解决
2014/01/17 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
jQuery的链式调用浅析
2010/12/03 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
Javascript实现的Map集合工具类完整实例
2015/07/31 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
使用JS动态显示文本
2017/09/09 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
vue-router传参用法详解
2019/01/19 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
简单讲解Python中的闭包
2015/08/11 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
python matlab库简单用法讲解
2020/12/31 Python
怎样写离婚协议书
2015/01/26 职场文书
项目合作意向书
2015/05/08 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书