javaScritp的数据类型按存储方式,分为基本数据类型和引用数据类型。基本数据类型保存在栈内存,引用类型保存在堆内存中。保存在栈内存是大小固定的数据,而引用类型的大小不固定,只能保存在堆内存中,但是它的地址写在栈内存中可以供我们访问。
基本数据类型是按值访问,操作的就是变量保存的值;对于引用类型,我们只是通过保存在变量中的引用类型的地址来操作实际对象。所以基本数据类型的复制可以通过简单的赋值来进行,而引用数据类型复制的则是其地址。因此对引用类型数据,分为深拷贝与浅拷贝。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
//深浅拷贝函数实现
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()和... 展开运算符也类似。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。