一,数据类型
基础数据类型:number,string,boolean,undefined,null 五类
引用数据类型: Object, Array等
var length = 7; // 数字
var lastName = "Gates"; // 字符串
var cars = ["Porsche", "Volvo", "BMW"]; // 数组
var x = {firstName:"Bill", lastName:"Gates"}; // 对象
二,浅拷贝 和 深拷贝
2.1 浅拷贝
简单点来说,浅拷贝就是假设B复制A,当修改A时,看B是否发生了变化,如果B也跟着变了,则就会浅拷贝,例如
let a=[0,1,2,3,4],
b=a;
console.log(a===b);
a[0]=1;
console.log(a,b); // [1,1,2,3,4] [1,1,2,3,4]
基本数据类型(number,string,boolean,undefined,null)都存储在栈内存中, 例如 let a = 1;
当你 b = a 复制时,栈内存会新开辟一个内存,例如
所以当修改 a = 2 时,对 b 并不会造成影响,当然,let a = 1, b = a, 虽然 b 不受 a 的影响,但这也算不上深拷贝,因为深拷贝本身只针对较为复杂的object类型数据
引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值, 我们以上面浅拷贝的例子画图:
当 b = a进行拷贝时,其实复制的是 a 的引用地址,而并非对立面的值
而当我们 a[0] = 1 进行数组修改时,由于 a 与 b 指向的是同一个地址,所以自然 b 也受了影响,这就是所谓的浅拷贝了
那,要是在堆内存中也开辟一个新的内存专门为 b 存放值,就像基本数据类型那样, 起步就达到深拷贝的效果了
2.2 深拷贝
简单点来说,深拷贝就是假设B复制A,当修改A时,A,B互不影响,则就是深拷贝
2.2.1 很多时候浅拷贝不是我们想要的,如何实现深拷贝? 互不影响呢?
方法:
1)JSON.stringfy 与 JSON.parse
2) Array 的 slice 和 concat 方法 返回新数组
var arr = ["One","Two","Three"];
var arrtoo = arr.slice(0); //从数组下标0开始复制整个数组
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
var arr = ["One","Two","Three"];
var arrtooo = arr.concat();
arrtooo[1] = "set Map To";
document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three