基本类型值和引用类型值
1、js中包括2中不同类型的值:基本类型值和引用类型值。
基本类型值指的是简单的数据段。包括Undifined、Null、Boolean、Number。
引用类型值指的是由多个值组成的对象。包括对象、数组、函数。
2、基本类型值:按值访问,操作的是实际保存的值。
引用类型值 :按指针访问,根据指针在内存中找到实际的值。(也就是说引用类型值记录的是一个指针,真正的值是通过指针到内存里寻找)。
3、浅拷贝:复制时,只复制引用类型值的指针。
深拷贝:复制时,将内存中的值复制一份,并将指针指向新复制的值。
数组拷贝
//数组浅拷贝 var arr = [1,2,3], arrShallow = arr; arrShallow.push(4); console.log(arr); //[1,2,3,4] console.log(arrShallow); //[1,2,3,4]
//数组深拷贝 let pro = [1,2,3], proCopy = []; let deepCopy = function(arr1,arr2){ for(let i = 0;i < arr1.length;i++ ){ arr2[i] = arr1[i]; } } deepCopy(pro,proCopy); pro.push(4); console.log(pro);//[1,2,3,4] console.log(proCopy);//[1,2,3]
//复杂一点数组深拷贝 let pro = [[1,2,3],2,3], proCopy = []; let deepCopy = function(arr1){ let copy = []; for(let i = 0;i < arr1.length;i++ ){ copy[i] = arr1[i] instanceof Array? deepCopy(arr1[i]) : arr1[i]; } return copy; } proCopy = deepCopy(pro); pro.push(4); console.log(pro);//[[1,2,3],2,3,4] console.log(proCopy);//[[1,2,3],2,3]
对象拷贝
//对象浅拷贝 var obj = {name : "小明"}, objSha = new Object(); objSha = obj; objSha.age = 13; console.log(obj);//{name: "小明", age: 13} console.log(objSha);//{name: "小明", age: 13}
//对象深拷贝 var objs = {name : "小明"}, objDeep = new Object(); objDeep.name = objs.name; objDeep.age = 13; console.log(objs);//{name: "小明"} console.log(objDeep);//{name: "小明", age: 13}
//复杂一点对象深拷贝 let objs = {name : "小明"}, objDeep = new Object(); let deepObj = function(source){ let result = {}; for(let key in source){ result[key] = typeof source[key] === 'object'? deepObj(source[key]) : source[key]; } return result; } objDeep = deepObj(objs); objDeep.age = 14; console.log(objs);//{name: "小明"} console.log(objDeep);//{name: "小明", age: 13}