JavaScript有兩種數(shù)據(jù)類型:簡(jiǎn)單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型(對(duì)象類型)
簡(jiǎn)單數(shù)據(jù)類型:保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,有undefined,boolean,number,string,null。
復(fù)雜數(shù)據(jù)類型:對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function),保存在堆內(nèi)存空間中。
從結(jié)構(gòu)分類:值類型和引用類型
值類型一般指的就是簡(jiǎn)單數(shù)據(jù)類型,引用類型指的就是對(duì)象類型。
淺拷貝:
如果屬性的值是基本類型,拷貝的基本類型的值;如果屬性的值是內(nèi)存地址(引用類型),拷貝的就是內(nèi)存地址,因此如果其中一個(gè)對(duì)象改變了這個(gè)地址,就會(huì)影響到另一個(gè)對(duì)象。
淺拷貝:
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)
二方法用于對(duì)象 Object.assign()
````````
//淺拷貝方法二
//var obj2=Object.assign({},arr)
```````
三、四方法只針對(duì)于數(shù)組對(duì)象
````````
//淺拷貝方法三 Array.prototype.concat()
// var arr2 = arr.concat()
//淺拷貝方法四 Array.prototype.slice()
// var arr2=arr.slice()
深拷貝
深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象。
原理:需要將原始對(duì)象的屬性的值都為引用類型的都需要進(jìn)行拷貝,不管多少層,直到屬性的值為基本數(shù)據(jù)類型為止。
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)
`````````````````````````````````````````````````````````````````````````````````````````````````````