參考資料
https://juejin.im/post/59ac1c4ef265da248e75892b
看完上面的參考資料后你會(huì)發(fā)現(xiàn), js有2大類型數(shù)據(jù)基礎(chǔ)數(shù)據(jù)類型(boolean,undefined,null,string,number)及引用類型(object)
基本數(shù)據(jù)類型的值是不可變的,動(dòng)態(tài)修改了基本數(shù)據(jù)類型的值诞仓,它的原始值也是不會(huì)改變的,例如:
var str = 'abc'
str[1] = 'f'; // f衣盾, 只是返回了一個(gè)新字符譬正,
console.log(str); // abc乙帮,
參考資料中:復(fù)制代碼這一點(diǎn)其實(shí)開始我是比較迷惑的扑媚,總是感覺(jué) js 是一個(gè)靈活的語(yǔ)言饵筑,任何值應(yīng)該都是可變的埃篓,真是圖樣圖森破,我們通常情況下都是對(duì)一個(gè)變量重新賦值根资,而不是改變基本數(shù)據(jù)類型的值架专。就如上述引用所說(shuō)的那樣,在 js 中沒(méi)有方法是可以改變布爾值和數(shù)字的玄帕。倒是有很多操作字符串的方法胶征,但是這些方法都是返回一個(gè)新的字符串,并沒(méi)有改變其原有的數(shù)據(jù)桨仿。
var p1 = {a: 1}
var p2 = {a: 2}
p1 === p2; // false睛低,因?yàn)橹赶虻亩褩?nèi)存地址不同不是同一個(gè)
var obj = {a: 1}
var p1 = obj;
var p2 = obj;
p1 === p2; // true,因?yàn)樗麄冎赶蛲粋€(gè)內(nèi)存地址
p1.b = 2;
console.log(p2.b); // 2 因?yàn)橹赶蛲粌?nèi)存地址服傍,所以p2也會(huì)受影響
綜上所述钱雷,并不是真正的淺拷貝,只是引用而已吹零,淺拷貝和"="賦值還是有區(qū)別的罩抗。
// 此處內(nèi)容為參考資料的內(nèi)容
// 淺拷貝與賦值的區(qū)別
var obj1 = {
'name' : 'zhangsan',
'age' : '18',
'language' : [1,[2,3],[4,5]],
};
var obj2 = obj1;
var obj3 = shallowCopy(obj1);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
obj2.name = "lisi";
obj3.age = "20";
obj2.language[1] = ["二","三"];
obj3.language[2] = ["四","五"];
console.log(obj1);
//obj1 = {
// 'name' : 'lisi',
// 'age' : '18',
// 'language' : [1,["二","三"],["四","五"]],
//};
console.log(obj2);
//obj2 = {
// 'name' : 'lisi',
// 'age' : '18',
// 'language' : [1,["二","三"],["四","五"]],
//};
console.log(obj3);
//obj3 = {
// 'name' : 'zhangsan',
// 'age' : '20',
// 'language' : [1,["二","三"],["四","五"]],
//};
- obj1:原始數(shù)據(jù)
- obj2:賦值操作得到
- obj3:淺拷貝得到
建議還是看參考資料吧。實(shí)在是太詳細(xì)太明白了灿椅。
總結(jié)下:
類型 | 和原數(shù)據(jù)是否指向同一對(duì)象 | 第一層數(shù)據(jù)為基本數(shù)據(jù)類型 | 原數(shù)據(jù)中包含子對(duì)象 |
---|---|---|---|
賦值 | 是 | 改變會(huì)使原數(shù)據(jù)一同改變 | 改變會(huì)使原數(shù)據(jù)一同改變 |
淺拷貝 | 否 | 改變不會(huì)使原數(shù)據(jù)一同改變 | 改變會(huì)使原數(shù)據(jù)一同改變 |
深拷貝 | 否 | 改變不會(huì)使原數(shù)據(jù)一同改變 | 改變不會(huì)使原數(shù)據(jù)一同改變 |
我們?cè)趯懘a的時(shí)候遇到的困難多是如何寫出深拷貝套蒂,及復(fù)制一個(gè)對(duì)象,對(duì)該對(duì)象修改不會(huì)影響原始對(duì)象茫蛹,最簡(jiǎn)單的方法就是: var newObj = JSON.parse(JSON.stringify(obj))