可能被忽略的一些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 相关文章推荐
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
JS实现拖动示例代码
Nov 01 Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
Dec 26 Javascript
Vue制作Todo List网页
Apr 26 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
Oct 31 Javascript
完美解决axios在ie下的兼容性问题
Mar 05 Javascript
vue-router中scrollBehavior的巧妙用法
Jul 09 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
Sep 09 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
Feb 20 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中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
JS常见算法详解
2017/02/28 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
JS判断数组那点事
2017/10/10 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Python读写文件基础知识点
2019/06/10 Python
详解Python文件修改的两种方式
2019/08/22 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
快速查找Python安装路径方法
2020/02/06 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
python实现逻辑回归的示例
2020/10/09 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
应届实习生的自我评价范文
2014/01/05 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
安全演讲稿大全
2014/05/09 职场文书
售后服务承诺书模板
2014/05/21 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android