唯品秀前端博客
当前位置: 前端开发 > JavaScript > js中map方法到底是否会改变原始数组?

js中map方法到底是否会改变原始数组?

2019-08-16 分类:JavaScript 作者:管理员 阅读(3725)

map方法应该还是比较常见的,和forEach、filter齐头并列,不在此说几个方法的区别,只谈此方法我们写代码时候可能遇到的坑。如题:js中map方法到底是否会改变原始数组?

文档api

数组是值类型

1
2
3
4
5
6
7
const arr = [1, 2, 3]
const result = arr.map(item => {
  item = item * 3;
  return item;
});
console.log('arr', arr);     // [1, 2, 3]
console.log('result', result);  // [3, 6, 9]

数组值是引用类型,例如对象

1
2
3
4
5
6
7
8
9
10
const arr = [
  { data: 1 },
  { data: 1 },
  { data: 1 }
]
const result = arr.map(item => {
  item.data= item.data+ 2;  
  return item
});
console.log('arr', arr);  //原数组被改变,所有item下的data都等于3

小结

我不能说文档不对,否则有人喷子来抬杠。只能说文档描述的有迷惑性,map()不会改变原始数组”这句话并不严谨。而应该是“当数组中元素是值类型,map不会改变原数组;当是引用类型,则可以改变原数组。

map方法体现的是数据不可变的思想。该思想认为所有的数据都是不能改变的,只能通过生成新的数据来达到修改的目的,因此直接对数组元素或对象属性进行操作的行为都是不可取的,个人认为,如果你遇到类似场景,你完全可以使用forEach来替代。如果你执意想用map,又不想违背原数组被改变的初衷,可以考虑下面方法,在原数组上去追加,如下:

1
2
3
4
5
6
7
8
9
10
11
const arr = [
  { data: 1 },
  { data: 1 },
  { data: 1 }
]
const newArry= arr.map(item => ({
  ...item,
  data: item.data+ 2 //不直接通过item.data = item.data+ 2
}));
console.log('arr', arr);
console.log('newArry', newArry);

「三年博客,如果觉得我的文章对您有用,请帮助本站成长」

赞(10) 打赏

谢谢你请我吃鸡腿*^_^*

支付宝
微信
10

谢谢你请我吃鸡腿*^_^*

支付宝
微信
标签:

上一篇:

下一篇:

你可能感兴趣

4 条评论关于"js中map方法到底是否会改变原始数组?"

  1. cleareyes Mac OS X Chrome 79.0.3945.88

    最后的demo中箭头函数用错了, 你省略return的时候不能换行, 不然得到的是undefined。

    1. 管理员 Windows NT Chrome 57.0.2987.98

      @cleareyes并不是箭头函数少了return错了,而是少了个( ,而你所说的使用箭头函数不写return时候不能换行,其实这是一种错觉,我理解的是:能不能换行取决于要执行的代码/块是否是一个整体(可能描述的不准确),比如说const newArry = arr.map(item => 1
      +
      2)
      ,你无论把1+2拆成2行或者3行去写,都是不需要return的。demo代码已更新。

  2. 紫苜蓿 Windows NT Chrome 74.0.3729.169

    你最后还是写的map呀

    1. 管理员 Windows NT Chrome 57.0.2987.98

      @紫苜蓿嗯,语言没表达好,我去改下,我最后写的那段demo,是想体现数据不可变的思想,通过去单独加一个属性,而不改变原数据中原本存在的属性

博客简介

唯品秀博客: weipxiu.com,一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,愿景:成为宇宙中最具有代表性的前端博客,期待您的参与,主题源码 

精彩评论

  • 江吟辞(1周前 (06-29))

    好难坚持啊,我还没毕业,不知道啥时候才能像您一样厉害

    评:碎言碎语
  • 和我、恋爱吧(1周前 (06-29))

    怎么没见你更新呢,比较忙吗

    评:碎言碎语
  • 游离(1周前 (06-29))

    站主,你好!请教一下,前台的pc 端和移动端,你是怎么实现响应式的呢?媒体查询的同时写两套样...

    评:碎言碎语
  • 권지용(1周前 (06-29))

    最近在学习前端,看了博主很多文章,收益匪浅,感谢大佬

    评:碎言碎语
  • 白君也(1周前 (06-28))

    哇 自己制作的吗 在哪学的技术啊 好厉害

    评:碎言碎语
  • 管理员(3周前 (06-16))

    时间区间问题,因为目前是2020年,你所选不可能超出这个时间吧,当然,代码是根据你的业务来,...

    评:js时间戳完美转换成阴历农历格式

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 258 篇
  • 草稿数目: 0 篇
  • 分类数目: 16 个
  • 独立页面: 6 个
  • 评论总数: 902 条
  • 链接总数: 17 个
  • 标签总数: 459 个
  • 注册用户: 8220 人
  • 访问总量: 9213012 次
  • 最近更新: 2020年7月3日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线