今天项目中遇到了很头疼的问题,一点点摸索得到的结论如下:
运行环境1:var [变量名] = ojbect 是引用类型
var a = {a:1,b:2}
var b = a;
这时候 b 和 a object中的元素操作是同步的,即:
b.c = 3;
则
a 这时候是{a:1,b:2,c:3}
运行环境2:var [变量名] = array 是引用类型
var a = [1,2,3,4]
var b = a;
b.push(5);
则
a= [1,2,3,4,5]
运行环境3:
拷贝对象或者数组,即复制一份非引用类型的数据;
对象可以用:object.assign(新object,被复制的object)
数组可以用:arr.concat();
例如:
var a = {a:1,b:2};
var b = Object.assign({},a);
b.c = 3;
这时候:
a 还是{1,2}
_ _ _ _ _ _
var a = [1,2,3,4];
var b = a.concat();
b.push(5);
这时候:
a 还是[1,2,3,4]
深坑慎入:
var a = {a:1,b:2};
var b = {c:3,d:4};
var arr1 = [a,b];
var arr2 = arr1.concat();
arr2[0].c = 5;
arr1???????????????????????
==============================
===============================
解决方案:
var a = {a:1,b:2};
var b = {c:3,d:4};
var arr1 = [a,b];
var arr2 = [];
for(var i in arr1){
arr2.push(Object.assign({},arr1[0]));
}
测试:
arr1[0].c = 5;
结论:
这时候估计数组中存储的每个元素都是一个引用类型吧。
如果本篇文章帮到了你,那么,请点击右侧的百度分享,让我们一起帮助更多的朋友!