资讯专栏INFORMATION COLUMN

那些被忽略的 JavaScript 数组方法细节

jsyzchen / 825人阅读

摘要:这两个方法的参数是一致的,回调函数和执行回调函数时使用的值,回调函数中的参数也是一致的,分别是数组当前元素当前元素索引和数组本身。

青湛(GitHub/mintsweet) 原文链接
前言

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

之所以会突然想讲一讲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
结语

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102189.html

相关文章

  • 5分钟了解JSON那些事儿

    摘要:简介是对象表示法的缩写是一种数据格式而不是一种编程语言用来表示结构化数据是的一个严格子集并不从属于很多编程语言都可以用数据格式语法语法可以表示以下三种类型的值简单值字符串数值布尔值但是不支持对象数组不支持变量函数对象实例简单值字符串数字布尔 JSON 简介 JSON是JavaScript Object Notation(JavaScript对象表示法)的缩写 JSON是一种数据格式,...

    ad6623 评论0 收藏0
  • js进阶 - 收藏集 - 掘金

    摘要:很多人可能误认为资源跨域时无法请求,实质上请求是可以正常发起的指通常情况下,部分浏览器存在部分特例,后端也可能正常进行了处理,中文指南调试技巧指南前端掘金作者缉熙简介是推出的一个天挑战。 深入 JavaScript,从对象开始 - 前端 - 掘金入坑前端开发有一段时间了,面对形形色色的JavaScript优秀框架,到底该选择那一款呢?最近在使用Vue.js写一款markdown编辑器插...

    qqlcbb 评论0 收藏0
  • 那些遗忘javascript细节

    摘要:第一章变量内置类型空值未定义布尔值数字字符串对象符号新增正确的返回结果应该是但这个由来已久在中已经存在了将近年也许永远也不会修复因为这涉及太多现有的系统修复它会产生更多的是基本类型中唯一的假值函数是的一个内置函数实际上是的一个子类型函数是 Author: bugall Wechat: bugallF Email: 769088641@qq.com Github:...

    CoyPan 评论0 收藏0
  • JavaScript细节点罗列(1)

    摘要:一旦属性引用结束了,这个新创建的对象就会被销毁。回到属性访问表达式,如果表达式后跟随和标识符,就会查找这个标识符所指定的属性的值没并将其作为整个表达式返回的值。而且运算符只能删除自有属性,不能删除继承属性。真真真假真真真真真假真假未完待续 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 表达式(指定对象),标识符(指定需要访问的属性的名称...

    I_Am 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<