先复原一下场景,很简单的一个从图库里选图片。
//这里是给两个集合初始化值。
//这里是method,我只给标红的一个集合赋了我上传的图片的路径
//下面是输出结果
最上面两行的undefined我大概了解了,但是下面两行输出为什么,我只给了一个赋值,而两个都有??
这里涉及到的知识点是JS中引用数据类型的存放方式,数组、对象等都是引用数据类型,他们的实际值是存放在内存中的堆区。所以我们在代码中定义一个数组或者一个对象时,这个变量只是保存了指向真实地址的地址,也就是说这个变量是对于真实值的一个引用。结合下面代码来讲。第一行定义了一个数组[1,2,3],这个数组就会存放在内存当中的一个位置,并且arr这个变量中保存了这个位置,第二行把arr的值赋值给变量a,其实是把数组[1,2,3]的地址给了a, 第三行把a赋值给变量b,那么b也保存了数组[1,2,3]的地址,即a, b, arr保存的值都是一样的,都是指向[1,2,3,]的地址,所以对其中一个变量进行操作就同时对他们都操作了。
let arr = [1, 2, 3];
let a = arr;
let b = a;
console.log(a); // [1,2,3]
console.log(b); // [1,2,3]
console.log(arr); // [1,2,3]
b.push(4);
console.log(a); // [1,2,3,4]
console.log(b); // [1,2,3,4]
console.log(arr); // [1,2,3,4]
你在第一图里面标红的地方,分别把imglist复制给了this.htPiclist和this.arrayImgs, 那么同样的,this.htPiclist/ this.arrImgs和imglist这三个变量都是指向了同一个地址,对其他一个进行操作,就是对所有的进行操作。
如果想要解决这个问题,那么就需要在给this.htPiclist和this.arrayImgs赋值的时候,不要给原始的imglist, 而是给一个复制品,如下代码:
this.htPiclist = [... imglist];
this.arrayImgs = [...imglist] ; // 这个[...imglist] 解构是在内存中重新生成了一个新的数组,并把imglist的值拷贝到新数组,然后把新数组的地址给了等号前面的变量。这样this.htPiclist和this.arrayImgs就是指向内存中的不同地址,可以分家了。
因为imglist是个数组,是引用类型的,变量只不过指向它的地址
JSON.parse(JSON.stringify(imglist))
这么赋值
var btns=document.getElementsByTagName('button');
for(var i=0;i<btns.length;i++){
btns[i].addEventListener('click',function(){
console.log(i);
})
}
var btns=document.getElementsByTagName('button');
for(var i=0;i<btns.length;i++){
(function(i){
btns[i].addEventListener('click',function(){
console.log(i);
})
})(i)
}