forEach究竟能不能改变数组的值 :https://blog.csdn.net/ZhengKehang/article/details/81281563

初学者每次提到Array对象的时候有些烦人,有些方法是改变原数组的,有些则不改变原数组。 有趣的存在~forEach这个方法,或者说数组存储的数据本身 看两个例子: 例子一:

let obj = {'1':1}
let oldArr = ['1',1,obj,true]
oldArr.forEach((el)=>{
el = 1
})
console.log(oldArr)

从例子一来看forEach并不改变原数组 例子二:

let obj = {'1':1}
let oldArr = ['1',1,obj,true]
oldArr.forEach((el)=>{
if(typeof el == 'object'){
el['2']=2
}
el = 2
})
console.log(oldArr)

例子二里的obj的值是被改变了的,那么forEach究竟改不改变原数组呢? 所以我们回到概念,forEach方法只是操作数据而已,数组里的数据是如何引用的呢? js的数据有基本数据类型和引用数据类型,同时引出堆内存和栈内存的概念。对于基本数据类型:Number、String 、Boolean、Null和Undefined,它们在栈内存中直接存储变量名和值。而Object对象的真实数据存储在堆内存中,它在栈内存中存储的是变量名和堆内存的位置。 而在forEach方法里操作了obj对象,实际操作的是对象本身,而数据只是引用了对象的栈内存地址,所以数组里的数据相应改变。 那么为什么forEach方法不能改变数组里的基本变量呢?

let a = 1
let obj = {'1':1}
let oldArr = ['1',1,obj,true,a]
oldArr.forEach((el)=>{
if(typeof el == 'object'){
el['2']=2
}
el = 2
})
a = 2
console.log(oldArr)

不仅forEach方法无法改变,直接在外面操作a变量也无法改变。 因为数组内的基本变量,在栈内存内生成了自己的值,并非引用栈内存的地址。

let a = 1
let obj = {'1':1}
let oldArr = ['1',1,obj,true,a]
oldArr.forEach((el,index)=>{
// if(typeof el == 'object'){
// el['2']=2
// }
oldArr[index] =2
})
console.log(oldArr)

神奇的事发生了,基本数据类型也被改变了。 因为我们使用forEach方法的时候对于每个数据都创建了一个变量el,我们操作的是el变量,对于基本数据类型,el变量就是新创建的一个内存。el变量改变并不影响基本原来地址值的改变。而el变量对应的是引用数据类型时,实际还是一个引用地址,操作它,仍旧操作的是对应的堆内存。

forEach究竟能不能改变数组的值的更多相关文章

  1. 应该用forEach改变数组的值吗? 原生JS forEach()和map()遍历的异同点

    应该用forEach改变数组的值吗? https://segmentfault.com/q/1010000013170900?utm_source=index-hottest 由于js中的数组是引用类 ...

  2. #PHP 数组添加元素、统计数组相同元素个数、改变数组key值~_~

    一.数组添加元素 1.定义和用法: array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度. 2.语法: array_push(array,value1, ...

  3. php中用foreach改变数组的值的问题

    翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误 ...

  4. php中的foreach改变数组的值的问题

    翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误 ...

  5. php foreach 无法改变数组的值的问题

    转:http://www.cnblogs.com/yangwenxin/p/5845212.html 翻到PHP文档的foreach那页这样写道: “foreach 语法结构提供了遍历数组的简单方式. ...

  6. vue中改变数组的值视图无变化

    今天开发的时候遇到一个多选取消点击状态的,渲染的时候先默认都选中,然后可以取消选中,自建了一个全为true的数组,点击时对应下标的arr[index]改为false,数据改变了状态没更新,突然想起来单 ...

  7. php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值

    /* * 把每个数组值后面都加个SQL然后返回数组 * foreach循环时候,直接用引用(&)的方式就能改变之前的数组 */public function array_foreach(){ ...

  8. for-each用法误区(不能改变数组元素值)

    代码例程: /**  * 数据加密传输  */ import java.util.Scanner; public class secretPass {     public static void m ...

  9. js数组的forEach方法能不能修改数组的值

    如果要使用数组的forEach()方法对其改值时,需要直接通过arr[i]这种方式来更改. 请看下面代码: // 数组改值 let arr = [1,3,5,7,9]; arr.forEach(fun ...

随机推荐

  1. python基础-文件操作的其他方法

    # f=open('code.txt','rb')#b的方式不能指定打开编码格式,以二进制的方式打开文件 # data=f.read() # print(data) # #encode 编码 deco ...

  2. 完整项目:网上图书商城(一、MySQL数据库设计)未完

    一.建立数据库 CREATE DATABASE IF NOT EXISTS bookshop CHARACTER utf8; 二.建立数据库表 1.建立用户表 #用户表(用户id号,用户名,用户密码, ...

  3. alert(1) to win 14

    <!--<script></script>之间的内容会被当作js处理,所以,//we'll use this later </script>被注释了.最终 i ...

  4. 学习旧岛小程序 (4)封装api 请求

    1.配置基本的 请求路径 和 key config.js const config = { baseUrl: 'http://bl.7yue.pro/v1/', appkey: "" ...

  5. CSS3弹性盒模型flexbox布局

    属性介绍 display: flex | inline-flex; (适用于父类容器元素上) 定义一个flex容器,内联或者根据指定的值,来作用于下面的子类容器.· box:将对象作为弹性伸缩盒显示. ...

  6. vue开发可复用组件

    组件,是一个具有一定功能,且不同组件间功能相对独立的模块.高内聚.低耦合.   开发可复用性的组件应遵循以下原则:   1.规范化命名:组件的命名应该跟业务无关,而是依据组件的功能命名. 2.数据扁平 ...

  7. tensorflow图像处理函数(1)

    1.tensorflow中对jpeg格式图像的编码/解码函数: import matplotlib.pyplot as plt import tensorflow as tf image_raw_da ...

  8. shp文件导入数据库

    数据库服务器(引擎) sql server oracle nosql sql语句... 从数据库端导入:新建数据库,导入shp文件 发布地图服务 jdbc.sdk

  9. [CSP-S模拟测试]:巨神兵(状压DP)

    题目描述 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张$n$个点$m$条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张图有多少个子图(即选定一个边集)是优美的?答案对$1,000 ...

  10. qinwoyige

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...