js的深淺拷貝

js的深淺拷貝可以分為數(shù)組的深淺拷貝和對(duì)象的深淺拷貝

一、數(shù)組的深淺拷貝
如果只是簡(jiǎn)單的將數(shù)組中的元素付給另外一個(gè)數(shù)組吼渡,那么只要新數(shù)組中的元素發(fā)生了改變容为,原數(shù)組中的元素也會(huì)相應(yīng)的發(fā)生改變,因?yàn)槿绻皇呛?jiǎn)單的賦值寺酪,那么它只是對(duì)引用了元素的地址坎背,并非真正意義上的拷貝,這種稱之為淺拷貝寄雀。
例如:

var arr = ['張三','李四','王五'];
var newArr = arr;

newArr[1] = '趙四';

console.log(arr);    // ==> ['張三','趙四','王五']
console.log(newArr);    // ==> ['張三','趙四','王五']

但是我們?cè)趹?yīng)用中往往不希望原數(shù)組的元素也被修改得滤,那么就需要深拷貝來(lái)解決這個(gè)問(wèn)題。
有兩種方法:
1盒犹、js的slice()方法
slice()slice() 方法可從已有的數(shù)組中返回選定的元素.
語(yǔ)法:arrayObject.slice(start,end);
start:必選懂更。規(guī)定從何處開始選取。如果是負(fù)數(shù)急膀,那么它規(guī)定從數(shù)組尾部開始算起的位置沮协。也就是說(shuō),-1 指最后一個(gè)元素卓嫂,-2 指倒數(shù)第二個(gè)元素慷暂,以此類推。
end:可選命黔。規(guī)定從何處結(jié)束選取呜呐。該參數(shù)是數(shù)組片斷結(jié)束處的數(shù)組下標(biāo)。如果沒有指定該參數(shù)悍募,那么切分的數(shù)組包含從 start 到數(shù)組結(jié)束的所有元素蘑辑。如果這個(gè)參數(shù)是負(fù)數(shù),那么它規(guī)定的是從數(shù)組尾部開始算起的元素坠宴。
返回值:返回一個(gè)新的數(shù)組洋魂,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。

var arr = ['張三','李四','王五'];
var newArr = arr.slice(0);

newArr[1] = '趙四';

console.log(arr);    // ==> ['張三','李四','王五']
console.log(newArr);    // ==> ['張三','趙四','王五']

2喜鼓、js的contat()方法
concat() 方法用于連接兩個(gè)或多個(gè)數(shù)組副砍。
該方法不會(huì)改變現(xiàn)有的數(shù)組,而僅僅會(huì)返回被連接數(shù)組的一個(gè)副本庄岖。
語(yǔ)法:arrayObject.concat(arrayX,arrayX,arrayX......)
返回值:返回一個(gè)新的數(shù)組豁翎。該數(shù)組是通過(guò)把所有 arrayX 參數(shù)添加到 arrayObject 中生成的。如果要進(jìn)行 concat() 操作的參數(shù)是數(shù)組隅忿,那么添加的是數(shù)組中的元素心剥,而不是數(shù)組。

var a = [1,2,3];
console.log(a.concat(4,5));    // ===>[1,2,3,4,5]

var newArr = [4,5];
console.log(arr.concat(newArr));   //===>[1,2,3,4,5]
var arr = ['張三','李四','王五'];
var newArr = arr.concat();

newArr[1] = '趙四';

console.log(arr);    // ==> ['張三','李四','王五']
console.log(newArr);    // ==> ['張三','趙四','王五']

二背桐、對(duì)象的深淺拷貝
例如:

var obj = {
    'name' : 'zhangsan',
    'hobby' : ['sport','singing','reading']
}
function copy(obj1) {
  var obj2 = new Object();
  for (var i in obj1) {
    obj2[i] = obj1[i];
  }
  return obj2;
}
var newObj = copy(obj);
obj.hobby.push('hiking');
console.log(obj.hobby);  // ['sport','singing','reading','hiking']
console.log(newObj.hobby)  // ['sport','singing','reading','hiking']

可見淺拷貝只是對(duì)原對(duì)象進(jìn)行了數(shù)據(jù)的應(yīng)用优烧,子對(duì)象獲得的只是一個(gè)內(nèi)存地址,而不是真正拷貝链峭,因此存在父對(duì)象被篡改的可能畦娄。(對(duì)象中存在數(shù)組的時(shí)候)

function deepCopy(obj1, obj2) {
      var obj2 = obj2 || {};
        for (var i in obj1) {
          if (typeof obj1[i] === 'object') {
            obj2[i] = (obj1[i].constructor === Array) ? [] : {};
            deepCopy(obj1[i], obj2[i]);
          } else {
             obj2[i] = obj1[i];
          }
  }
  return obj2;
}

var obj = {
    'name' : 'zhangsan',
    'hobby' : ['sport','singing','reading'],
    'friends' : ['lisi','wangwu']
}

var newObj = new Object();
deepCopy(obj,newObj);
obj.hobby.push('hiling');

console.log(newObj);
console.log(obj);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弊仪,隨后出現(xiàn)的幾起案子熙卡,更是在濱河造成了極大的恐慌,老刑警劉巖励饵,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件再膳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡曲横,警方通過(guò)查閱死者的電腦和手機(jī)喂柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禾嫉,“玉大人灾杰,你說(shuō)我怎么就攤上這事∥醪危” “怎么了艳吠?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)孽椰。 經(jīng)常有香客問(wèn)我昭娩,道長(zhǎng)凛篙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任栏渺,我火速辦了婚禮呛梆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磕诊。我一直安慰自己填物,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布霎终。 她就那樣靜靜地躺著滞磺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪莱褒。 梳的紋絲不亂的頭發(fā)上击困,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音广凸,去河邊找鬼沛励。 笑死,一個(gè)胖子當(dāng)著我的面吹牛炮障,可吹牛的內(nèi)容都是我干的目派。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胁赢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼企蹭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起智末,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谅摄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后系馆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送漠,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年由蘑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闽寡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尼酿,死狀恐怖爷狈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裳擎,我是刑警寧澤涎永,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響羡微,放射性物質(zhì)發(fā)生泄漏谷饿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一妈倔、第九天 我趴在偏房一處隱蔽的房頂上張望博投。 院中可真熱鬧,春花似錦启涯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叉跛,卻和暖如春松忍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筷厘。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工鸣峭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酥艳。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓摊溶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親充石。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莫换,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容