JavaScript有两种数据类型:简单数据类型和复杂数据类型(对象类型)
简单数据类型:保存在栈内存中的简单数据段,有undefined,boolean,number,string,null。
复杂数据类型:对象(Object)、数组(Array)、函数(Function),保存在堆内存空间中。
从结构分类:值类型和引用类型
值类型一般指的就是简单数据类型,引用类型指的就是对象类型。
浅拷贝:
如果属性的值是基本类型,拷贝的基本类型的值;如果属性的值是内存地址(引用类型),拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
浅拷贝:
var obj1 = {
name: 'zhangsan',
age: '18',
language: {
name: '中文'
}
};
var arr = [1, 3, {
username: 'kobe'
}];
`````````````````````````
//浅拷贝方法一
/* function shallowCopy(src) {
var newObj = {}
for (var prop in src) {
if(src.hasOwnProperty(prop)){ //获取私有属性,不包括原型上的属性
newObj[prop]=src[prop]
}
}
return newObj
}
var obj2 = shallowCopy(obj1)
二方法用于对象 Object.assign()
````````
//浅拷贝方法二
//var obj2=Object.assign({},arr)
```````
三、四方法只针对于数组对象
````````
//浅拷贝方法三 Array.prototype.concat()
// var arr2 = arr.concat()
//浅拷贝方法四 Array.prototype.slice()
// var arr2=arr.slice()
深拷贝
深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
原理:需要将原始对象的属性的值都为引用类型的都需要进行拷贝,不管多少层,直到属性的值为基本数据类型为止。
var obj = {
name: '铁蛋',
dog: {
name: '大黄',
age: 3,
sex: '女',
bobbies: ['钢琴', '下棋', '阅读', '画画']
},
eat: function () {
console.log(this.dog.name + '西红柿炒番茄');
}
}
function checkedType(target) {
return Object.prototype.toString.call(target).slice(8, -1)
}
function deepCopy(oldObj,newObj){
for(var key in oldObj){
var item=oldObj[key]
if(checkedType(item)==='Object'||checkedType(item)==='Array'){
newObj[key]={}
deepCopy(item,newObj[key])
}else{
newObj[key]=item
}
}
return newObj
}
var obj1={}
deepCopy(obj,obj1)
`````````````````````````````````````````````````````````````````````````````````````````````````````