javaScritp的数据类型按存储方式,分为基本数据类型和引用数据类型。基本数据类型保存在栈内存,引用类型保存在堆内存中。保存在栈内存是大小固定的数据,而引用类型的大小不固定,只能保存在堆内存中,可是它的地址写在栈内存中能够供咱们访问。
基本数据类型是按值访问,操做的就是变量保存的值;对于引用类型,咱们只是经过保存在变量中的引用类型的地址来操做实际对象。因此基本数据类型的复制能够经过简单的赋值来进行,而引用数据类型复制的则是其地址。所以对引用类型数据,分为深拷贝与浅拷贝。浅拷贝只复制指向某个对象的指针,而不复制对象自己,新旧对象仍是共享同一块内存。但深拷贝会另外创造一个如出一辙的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。java
//深浅拷贝函数实现 function extend(obj1, deep){ //deep为true,则递归调用extend函数进行深拷贝 var obj = (obj1 instanceof Array ? [] : {}) for(var key in obj1){ var value = obj1[key] obj[key] = (!!deep && value !== null && typeof value === "object") ? extend(value, deep) : value } return obj } var obj = { a: "hello", b:{ a: "world", b: 21 }, c:["Bob", "Tom", "Jenny"], d:function() { alert("hello world"); } } var objCopy = extend(obj, true) JSON.parse(JSON.stringify(obj)) //利用JSON的序列化和反序列化,没法对函数类型进行拷贝; //undefined、function、symbol 会在转换过程当中被忽略 另外concat和slice两个数组方法均可以返回一个修改后的新数组,能够对单层的数组进行拷贝;Object.assign()和... 展开运算符也相似。