浅拷贝
定义:直接将一个引用数据类型的地址,赋值给另一个变量存储,两个变量存储的是相同的内存地址,在一个变量操作数据,另一个变量中的数据也会改变
案例
var arr1 = [1,2,3,4,5]; // arr1 变量中 存储的是 数组的 内存地址
var arr2 = arr1; // arr1 存储的内存地址,赋值给arr2,两个变量存储的是相同的内存地址
arr1[0] = '浅拷贝'; //将arr[0]的数据改为浅拷贝
console.log(arr2);
案例理解
1、arr1原来的数组中的内容是1-5的数字,后面将arr1[0]的数据改为浅拷贝
2、将arr1赋值给arr2,改变arr1的数据,输出arr2发现arr2数据也改变了
3、输出变量arr2
总结:
arr1给arr2赋值时是给的内存地址,两个变量中的数据改变随意一个变量的数据,另外一个变量中的数据也跟着改变,这种操作就被称为浅拷贝
深拷贝
定义:通过循环遍历获取引用数据类型中存储的每一个数据信息,并赋值到新的变量中 ,赋值之后两个变量没有任何关系并且修改变量中的数据不会相互之间影响
案例
var arr3 = ['葡萄','香蕉','苹果','橘子','李子'];
var arr4 = [];
for(var i = 0 ; i <= arr3.length-1 ; i++){
arr4.push(arr3[i]); --> // arr3[i] 就是获取 arr3中的存储的数据信息
--> // arr4.push() 将arr3中的数据 arr3[i] , 写入到 arr4 中
}
arr3[0] = '草莓';
console.log(arr3 , arr4);
案例理解
1、定义一个变量arr3
2、定义一个新变量arr4,通过循环遍历获取arr3中的数据数值
3、通过循环,生成arr3的所有索引下标,并且将arr3的数据数值写入到arr4中
4、改变arr3[0]的数据,将葡萄替换成草莓
5、输出变量arr3、arr4
总结
通过结果对比发现,变量arr4的数据没有改变,不管arr3或者arr4怎么改变数据内容,它们相互之间不会受影响,这种操作就成为深拷贝
数组去重
定义:数组中存储重复的数值,通过indexOf来达到去重效果
注意:去重的方法有很多,我这儿只是通过indexOf来达到效果
案例
var arr5 = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
var newArr = [];
arr.forEach(function(v){
if(newArr.indexOf(v) === -1){ --> //newArr.indexOf(v) 执行结果如果是 -1
--> //证明在新数组中,没有这个原始数组的数据
newArr.push(v) --> //newArr.push(v)写入到新的数组newArr中
}
})
console.log( newArr , arr );
案例理解
1、定义一个数组arr5,并写入数组数据
2、定义一个新的数组变量newArr,用来获取arr5的数据
3、通过循环遍历,获取原始数组arr5中的所有数值
总结
// 基本思路利用 indexOf()来实现效果
// 建立一个新的数组,将原始数值中的数值,向新的数组中写入
// 如果这个数值不存在于新的数组中,就执行写入,如果已经存在,就不写入