Xin's blog Xin's blog
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

Xin

英雄可不能临阵脱逃啊~
首页
  • 前端文章

    • HTML
    • CSS
    • JavaScript
    • Vue
    • 组件与插件
    • CSS扩展语言
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
  • 前端框架面试题汇总
  • 基本面试题
  • 进阶面试题
  • 其它
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 前后端联调
  • mock.js
  • 奇技淫巧
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • HTML

  • CSS

  • JavaScript

    • 知识点

      • new命令原理
      • ES5面向对象
      • ES6面向对象
      • 多种数组去重性能对比
      • 比typeof运算符更准确的类型判断
      • 可选链操作符
      • 三点运算符
      • cookies,sessionStorage和localStorage的区别?
      • forEach()函数究竟会不会修改原数组?
        • 先来看两个🌰:
        • 总结
      • 宏任务与微任务
      • Promise实现原理
      • this指向
      • 递归函数返回undefined
      • 使用JS的FileReader对象读取blob对象二进制数据
      • clipboard 剪切板属性
    • 方法

  • Vue

  • 组件与插件

  • css扩展语言

  • 学习笔记

  • 前端
  • JavaScript
  • 知识点
ctrlwin
2021-05-28

forEach()函数究竟会不会修改原数组?

# 先来看两个🌰:

例子一:

let arr = [1, 2, 3, 4]
arr.forEach(item => {
    item += 1
})
console.log(arr); // [1, 2, 3, 4]
1
2
3
4
5

从例子一来看的话,forEach()并不会修改原数组。那么我们再看一下例子二:

例子二:

let arr = [{
    a: 'ww',
    b: 'cc'
}, {
    a: 'dd',
    b: 'll'
}]
arr.forEach(item => {
    item.a = 1
})
console.log(arr);
//  a: 1 b: "cc"
//  a: 1 b: "ll"
1
2
3
4
5
6
7
8
9
10
11
12
13

从例子二中我们看到,arr的a属性全被修改成了1。

js的数据有基本数据类型和引用数据类型,同时引出堆内存和栈内存的概念。对于基本数据类型:Number、String 、Boolean、Null和Undefined,它们在栈内存中直接存储变量名和值。而Object对象的真实数据存储在堆内存中,它在栈内存中存储的是变量名和堆内存的位置。 而在forEach方法里操作了obj对象,实际操作的是对象本身,而数据只是引用了对象的栈内存地址,所以数组里的数据相应改变。 那么为什么forEach方法不能改变数组里的基本变量呢?因为数组内的基本变量,在栈内存内生成了自己的值,并非引用栈内存的地址。

# 总结

数组元素如果为基本类型时,forEach()无法改变原数组。

数组元素如果为引用类型时,forEach()可以改变原数组。

在GitHub上编辑 (opens new window)
#js
上次更新: 2/23/2022, 5:36:03 PM

← cookies,sessionStorage和localStorage的区别? 宏任务与微任务→

最近更新
01
createElement函数创建虚拟DOM
05-26
02
clipboard 剪切板属性
05-26
03
vue的权限管理
05-16
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Xin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×