JS 中循环读取引用类型,并直接赋值之前的数据会覆盖

如下演示的代码

let newData=[]
				for (let item of d) {
					
					if(arrdata[item.name]){
						
						for (let key in arrdata[item.name]) {
							
							for (let key2 in arrdata[item.name][key]) {
								let data1={
									selBrand:item.selBrand,
									name:item.name,
									num:item.num,
									arrkey:item.arrkey
								}
								// let data1=item //之前这样操作直接赋值,arrdata[item.name][key]有多个值的,那么她循环存储的值都会默认吧之前所有的值都改变所以只能像上面那样每个属性单独写出来
								if(arrdata[item.name][key][key2].prodcut_attr){
									data1.images=arrdata[item.name][key][key2].prodcut_attr.image
									data1.sku=arrdata[item.name][key][key2].prodcut_attr.sku
									data1.price=arrdata[item.name][key][key2].prodcut_attr.price
								}else{
									data1.images=arrdata[item.name][key][key2].product_detail.image
									data1.sku=""
									ata1.price="暂未选择"
								}
								data1.product_id=arrdata[item.name][key][key2].product_detail.product_id
								data1.num=arrdata[item.name][key][key2].num
								data1.unique=key2
								data1.mer_id=arrdata[item.name][key][key2].product_detail.merchant.mer_id
								data1.mer_name=arrdata[item.name][key][key2].product_detail.merchant.mer_name
								newData.push(data1)
							
								
							}
						}
					}else{
						console.log("添加了进来了2222",)
						let data1=item
						newData.push(data1)
					}
					
				}
				console.log("添加了***********",newData)
				let projectNew=JSON.parse(JSON.stringify(that.projectData))
				let nData=[]
				
				that.projectData.forEach((ciiten,cindex)=>{
					projectNew[cindex].data=[]
					newData.forEach((item,indedx)=>{
						if(item.arrkey==ciiten.proName){
							item.dw=ciiten.dw
							let a=ciiten
							nData.push(item)
							
							projectNew[cindex].data.push(item.mer_name)
						}else{
							
						}
					})
				})

变量对象也存在于堆内存中,但是由于变量对象有特殊职能,因此在理解时,建议仍然将其与堆内存空间区分开来

引用数据类型与堆内存空间

引用数据类型的值是保存在堆内存空间中的对象。在 JavaScript 中,不允许直接访问堆内存空间中的数据,因此不能直接操作对象那个的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用数据类型都是按引用访问的。这里的引用,可以理解为保存在变量对象中的一个地址,该地址与堆内存中的对象相关联。为了更好地理解变量对象与堆内存,下面用一个示例与图解配合讲解。
function foo() {
    let a1 = 10;
    let a2 = 'hello';
    let a3 = null;
    let b = {
        m: 20
    };
    let c = [1, 2, 3];
}

当我们想要访问堆内存空间中的数据类型时,实际上是通过一个引用(地址指针)来访问的。

let a = 20;
let b = a;
b = 30;

// 这时 a 的值是多少? 20
let m = {
    a: 10,
    b: 20
}
let n = m;
n.a = 15;

// 这时 m.a 的值是多少?15

  • 第一段代码中当变量对象中的数据发生复制行为时,新的变量会被分配到一个新的值。在第一段代码中,通过 let b=a 发生复制之后,虽然 a 与 b 的值都等于 20,但事它们其实已经是相互独立互不影响的值了。因此当我们们修改了 b 的值以后,a 的值并不会发生变化,
  • 在第二段代码中,通过 let n = m 发生了一次复制行为。引用类型的复制同样会为新的变量自动分配一个新的值并保存在变量对象之中。但不同的是,这个新的值,仅仅只是引用类型的一个地址指针。当地址指针相同时,尽管它们相互独立,但是它们指向的具体对象实际上是同一个。因此,当修改 n 时,m 也会发生变化,这就是引用类型的特性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这个错误通常出现在尝试访问一个未定义或不存在的数组元素时。请确保在使用数组前,数组已经被正确地定义和初始化。还要检查循环的索引是否超出了数组的范围。 以下是一个常见的导致此错误的示例: ``` var arr = [1, 2, 3]; for (var i = 0; i <= arr.length; i++) { console.log(arr[i]); } ``` 在这个例子循环的条件是 `i <= arr.length`,但是数组的最后一个元素的索引是 `arr.length - 1`,所以当 `i` 等于 `arr.length` 时,程序尝试访问一个不存在的元素,从而导致错误。 为了解决此错误,请将循环条件更改为 `i < arr.length`。这将确保循环只在数组元素的索引范围内运行。 ### 回答2: 这个错误通常出现在使用 JavaScript 的 for 循环时。它的原因是你在循环访问了一个未定义的值,导致无法读取属性。 这种错误通常出现在以下几种情况下: 1. 数组或对象未定义:如果你在循环访问了一个未定义的数组或对象,就出现这个错误。在使用 for 循环之前,确保你的数组或对象已经正确定义和赋值。 例如: ``` var arr; // 未定义的数组 for (var i = 0; i < arr.length; i++) { // 访问未定义数组的 length 属性,就报错 // 循环逻辑 } ``` 解决方法是,在使用 for 循环之前,确保你的数组或对象已经正确定义和赋值。 2. 访问超出数组范围的索引:如果你在循环访问数组的索引超过了数组的长度,也出现这个错误。 例如: ``` var arr = [1, 2, 3]; for (var i = 0; i < arr.length; i++) { console.log(arr[i]); // 访问索引为 3 的元素,超出了数组长度,就报错 } ``` 解决方法是,在使用 for 循环时,确保你的索引值不超出数组的范围。 对于这个错误的修复方法,需要根据具体的代码情况进行调试和修改。可以使用控制台输出相关变量的值,以便找出问题所在。还可以使用条件语句或异常处理来避免这种错误的发生。 ### 回答3: 这个报错信息"Cannot read properties of undefined (reading '0')"通常在使用JavaScript的for循环时出现。它的意思是无法读取undefined的属性(索引为0的属性)。 出现这个错误的原因可能是: 1. 数组未定义或为空:如果你尝试对一个未定义或为空的数组进行循环,就出现这个错误。请确保你使用的数组变量已经被正确初始化并且包含了数据。 2. 数组长度不足:如果你的循环条件超过了数组的长度,就出现这个错误。请确保你的循环条件正确,并且不越界。 解决这个问题的方法有几种: 1. 首先,检查你的数组是否正确初始化并且包含了数据。你可以使用console.log()来打印数组,以确保它的值是正确的。 2. 检查你的循环条件是否正确,特别是条件里的长度判断。你可以使用数组的length属性来获取数组的长度,并确保循环条件不超过数组的长度。 3. 在处理数组时,可以使用Array.isArray()函数检查一个变量是否是数组类型。 下面是一个使用for循环遍历数组的示例代码,可作为参考: ```javascript var arr = [1, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++) { console.log(arr[i]); } ``` 在这个示例,我们通过arr.length来获取数组的长度,并根据长度设置循环的结束条件。然后使用下标i来访问每个数组元素,并打印出来。请确保你的for循环与这个示例代码类似,并且正确处理数组的边界情况,以避免出现报错。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初遇你时动了情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值