數(shù)據(jù)類型
基本數(shù)據(jù)類型
- Number
- String
- Boolean
- Undefined
- Null
引用類型
多個(gè)基本數(shù)據(jù)類型復(fù)合形成饼拍。
- Object
存儲(chǔ)方式
基本數(shù)據(jù)類型的存儲(chǔ)方式
- 每當(dāng)定義一個(gè)基本數(shù)據(jù)類型的變量,會(huì)在 棧區(qū) 開(kāi)辟一個(gè)內(nèi)存空間跪帝,用于存放該變量。棧區(qū)的特點(diǎn)是:靜態(tài)分配锨并,大小固定膀估。
- 當(dāng)一個(gè)變量通過(guò)直接復(fù)制的方式復(fù)制給另一個(gè)變量,系統(tǒng)會(huì)在 棧區(qū) 重新開(kāi)辟一個(gè)內(nèi)存空間荞怒;兩個(gè)變量互不影響。
let num1 = 10;
let num2 = num1;
num2 = 20;
console.log(num1); // 10
引用類型的存儲(chǔ)方式
- 每當(dāng)定義一個(gè)引用類型秧秉,如:對(duì)象褐桌,會(huì)在 堆區(qū) 開(kāi)辟一個(gè)內(nèi)存空間;然后如果創(chuàng)建一個(gè)該對(duì)象的實(shí)例象迎,會(huì)在 棧區(qū) 開(kāi)辟一個(gè)內(nèi)存存放該實(shí)例荧嵌,該實(shí)例實(shí)際上是一個(gè)指向 堆內(nèi)存 對(duì)象的指針呛踊。堆區(qū)的特點(diǎn)是:動(dòng)態(tài)分配,大小不固定啦撮。
- 當(dāng)一個(gè)實(shí)例直接復(fù)制給另一個(gè)實(shí)例谭网,系統(tǒng)會(huì)在 棧區(qū) 重新開(kāi)辟一個(gè)內(nèi)存空間,但是新實(shí)例同樣也是一個(gè)指向 堆內(nèi)存 對(duì)象的指針赃春,所以愉择,這樣的操作,這樣的修改都會(huì)對(duì)新舊實(shí)例產(chǎn)生影響织中。
let obj1 = {
name: 'zero',
age: 22,
num: ['1', '2', '3']
}
//直接復(fù)制
let obj2 = obj1;
obj2.name = 'Ertsul';
obj2.num[0] = '一';
console.log(obj1, obj2);
// name:"Ertsul"
// age:22
// num:["一", "2", "3"]
淺拷貝和深拷貝
區(qū)別
兩者的區(qū)別主要在于 復(fù)制層次 的不同:
- 淺拷貝主要復(fù)制到對(duì)象屬性這一層次锥涕,如果對(duì)象里面有子對(duì)象,則無(wú)法對(duì)子對(duì)象完成復(fù)制狭吼;之后對(duì)于子對(duì)象的修改 會(huì) 影響到原復(fù)制對(duì)象层坠。
- 深拷貝則是淺拷貝的 加強(qiáng)版 ,可以實(shí)現(xiàn)對(duì)于子對(duì)象的拷貝刁笙;之后對(duì)于子對(duì)象的修改 不會(huì) 影響到原復(fù)制對(duì)象破花。主要實(shí)現(xiàn)方法有:
- 遞歸
- JSON解析
淺拷貝
// 淺拷貝
function shallowCopy(source) {
let result = {};
for(let key in source){
result[key] = source[key]
}
return result;
}
let obj1 = {
name: 'zero',
age: 22,
num: ['1', '2', '3']
}
let obj2 = {};
obj2 = shallowCopy(obj1);
obj2.name = 'Ertsul'; // 不會(huì)產(chǎn)生影響
obj2.num[0] = '一'; // 產(chǎn)生影響
console.log("obj1", obj1);
console.log("obj2", obj2);
結(jié)果如圖:
image.png
深拷貝
遞歸
// 遞歸實(shí)現(xiàn)深拷貝
function deepCopy(source, res){
var res = res || {};
for(let i in source){
if(typeof source[i] === 'object'){
if(source[i].constructor === Array){
res[i] = []
}else {
res[i] = {}
}
deepCopy(source[i], res[i]); // 遞歸子對(duì)象屬性
}else{
res[i] = source[i]
}
}
return res;
}
let obj1 = {
name: 'zero',
age: 22,
num: ['1', '2', '3']
}
let result = {}
result = deepCopy(obj1, result);
result.name = 'Ertsul';
result.num[1] = '二';
console.log("result", result);
console.log("obj1", obj1);
結(jié)果如圖:
image.png
JSON解析
// JSON實(shí)現(xiàn)深拷貝
let obj1 = {
name: 'zero',
age: 22,
num: ['1', '2', '3']
}
let result1 = JSON.parse(JSON.stringify(obj1));
result1.num[2] = '三';
console.log('result1', result1);
console.log('obj1', obj1);
結(jié)果如圖:
image.png