JS中forEach究竟能不能改变数组的值?
let arr = [
{ name: '1',
id: '1'
},{ name: '2',
id: '2'
},{ name: '3',
id: '3'
}
]
arr.forEach(list=>{
if(list.name==='2'){
list = {a: 'hee'}
//list.name = {a: 'hee'} 结果可以改变原数组
}
})
console.log(arr)
这个是MDN的介绍
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
不改变原数组指的是不对原数组重新赋值,但你数组里的值是可以随便改的,反过来讲也就是说改变原数组的意思是对原数组变量重新赋值的意思,举个例子:
reverse
是对数组进行翻转,它返回一个翻转后的数组,但与此同时原数组其实也改变了这就是MDN描述的所谓改变的意思
再举个例子比如
map
,它同样返回处理后的数组,但它不改变原数组,也就是它其实返回的是一个新数组,而不是对原数组进行操作1、基本数据类型 -> 死都改不动原数组!
2、引用类型 -> 类似对象数组可以改变
3、那引用类型 -> 改变整个单次循环的item? ->不行
4、终极方法!
总结一下
基本类型我们当次循环拿到的
ele
,只是forEach
给我们在另一个地方复制创建新元素,是和原数组这个元素没有半毛钱联系的!所以,我们使命给循环拿到的ele
赋值都是无用功!专业的概念说就是:
JavaScript
是有基本数据类型与引用数据类型之分的。对于基本数据类型:number
,string
,Boolean
,null
,undefined
它们在栈内存中直接存储变量与值。而Object
对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object
其实就是直接操作了原数组对象本身。forEach
的基本原理也是for循环
,使用arr[index]
的形式赋值改变,无论什么就都可以改变了。题主先要区分值类型和引用类型。
不改变原数组,不是不可以改变数组里某个引用对象的某个属性。
你好,我这里有一篇总结,你可以看看,相信可以解答你的疑惑。
Array的迭代