js forEach遍历修改对象的问题

        const arr1 = [
            { id: 1, value: 1 },
            { id: 2, value: 2 },
            { id: 3, value: 3 },
            { id: 4, value: 4 },
            { id: 5, value: 5 },
        ]

        arr1.forEach((item, index) => {
            if (item.id === 1) {
                item.value *= 10   // 修改成功
            }
        })

        arr1.forEach((item, index) => {
            if (item.id === 1) {
                item = {id:6,value:6}  // 无法修改
            }
        })

为什么在使用forEach遍历修改对象数组的某项的属性值的时候,就能够修改成功呢 ?

Comments
登录后评论
Sign In
·

修改数组对象应该用 map 不是 forEach

·

item 是个变量,在你第二段代码的 if 语句内,item.id == 1 首先让 item 变量指向了需要的对象,但你使用赋值 =,让 item 指向了新对象。你改变的 item 指向的对象,所以原对象并没有发生改变。

正确的方法是引用 arr1,然后修改 arr1。但你的 arr1 为什么声明成了 const 对象?这里应该用 let 吧。你也可以用 map,但就生成了新的数组。

arr1.forEach((item, index) => {
    if (item.id == 1) {
        arr1[index] = { id: 6, value: 6}
    }
}

测试了一下,在 const 声明下也能修改 arr1。原来 js 中的 const 只是限制变量不能被重新赋值,啊这,不合理 joy

·

forEach 里面对象都是引用关系,所以第一个 forEach 修改对象的值是实际修改了内存地址中真实的对象,可以简单理解成一个快捷方式,另一个是真实的文件,所以修改快捷方式中的属性实际就是修改真实文件。但第二个 forEach 相当于替换了 item 指向到一个新的内存地址,即原来 item 是一个快捷方式指向对应对象的内存地址,而你将这个快捷方式换成另一个新的对象,那实际是没有做任何修改的,而是创建了一个新的对象。