JS淺拷貝和深拷貝原理與實(shí)現(xiàn)方法分析
本文實(shí)例講述了JS淺拷貝和深拷貝原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
淺拷貝只會(huì)拷貝一層,深層的引用類型改變還是會(huì)受到影響。
深拷貝是所有內(nèi)部的屬性還有值都被拷貝了一份,不管深層的引用類型怎么改都不會(huì)受到影響。
淺拷貝的實(shí)現(xiàn)方式
1、自定義函數(shù)
function shallowClone (initalObj) { var obj = {}; for ( var i in initalObj) { obj[i] = initalObj[i]; } return obj; }
2、ES6 的 Object.assign()
let newObj = Object.assign({}, obj);
3、ES6 的對(duì)象擴(kuò)展
let newObj = {...obj};
深拷貝的實(shí)現(xiàn)方式
1、JSON.stringify 和 JSON.parse
用 JSON.stringify
把對(duì)象轉(zhuǎn)換成字符串,再用 JSON.parse
把字符串轉(zhuǎn)換成新的對(duì)象。
可以轉(zhuǎn)成 JSON 格式的對(duì)象才能使用這種方法,如果對(duì)象中包含 function 或 RegExp 這些就不能用這種方法了。
let newObj = JSON.parse(JSON.stringify(obj));
2、jquery 和 zepto
jquery 和 zepto 里的 $.extend
方法可以用作深拷貝。
var $ = require('jquery'); var newObj = $.extend(true, {}, obj);
3、lodash
用 lodash 函數(shù)庫(kù)提供的 _.cloneDeep
方法實(shí)現(xiàn)深拷貝。
var _ = require('lodash'); var newObj = _.cloneDeep(obj);
4. 自己封裝
deepClone = (obj) => { let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ // for...in 會(huì)把繼承的屬性一起遍歷 for(let key in obj){ // 判斷是不是自有屬性,而不是繼承屬性 if(obj.hasOwnProperty(key)){ //判斷ojb子元素是否為對(duì)象或數(shù)組,如果是,遞歸復(fù)制 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = this.deepClone(obj[key]); }else{ //如果不是,簡(jiǎn)單復(fù)制 objClone[key] = obj[key]; } } } } return objClone; }
參考:http://www.dbjr.com.cn/article/99013.htm
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
javascript實(shí)現(xiàn)網(wǎng)頁(yè)背景煙花效果的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)網(wǎng)頁(yè)背景煙花效果的方法,涉及javascript數(shù)學(xué)運(yùn)算及頁(yè)面元素動(dòng)態(tài)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JavaScript使用箭頭函數(shù)實(shí)現(xiàn)優(yōu)化代碼
在JavaScript的編程世界里,我們時(shí)常被普通函數(shù)的冗長(zhǎng)寫法所困擾,每次都需要寫function關(guān)鍵字,有時(shí)候還要明確地寫return語(yǔ)句,下面我們就來(lái)看看如何利用箭頭函數(shù)優(yōu)化這些繁瑣的代碼吧2023-11-11JavaScript數(shù)學(xué)對(duì)象之?dāng)?shù)字進(jìn)制轉(zhuǎn)換
這篇文章主要為大家講解了JavaScript數(shù)學(xué)對(duì)象——數(shù)字進(jìn)制轉(zhuǎn)換的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05在標(biāo)題欄顯示新消息提示,很多公司項(xiàng)目中用到這個(gè)方法
在標(biāo)題欄顯示新消息提示,很多公司項(xiàng)目中用到這個(gè)方法,需要的朋友可以參考下。2011-11-11微信小程序點(diǎn)擊圖片實(shí)現(xiàn)長(zhǎng)按預(yù)覽、保存、識(shí)別帶參數(shù)二維碼、轉(zhuǎn)發(fā)等功能
這篇文章主要介紹了微信小程序點(diǎn)擊圖片實(shí)現(xiàn)長(zhǎng)按預(yù)覽、保存、識(shí)別帶參數(shù)二維碼、轉(zhuǎn)發(fā)等功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法,可實(shí)現(xiàn)數(shù)學(xué)上排列組合算法功能,涉及JavaScript數(shù)組與字符串操作技巧,需要的朋友可以參考下2016-01-01JavaScript監(jiān)聽(tīng)觸摸事件代碼實(shí)例
這篇文章主要介紹了JavaScript監(jiān)聽(tīng)觸摸事件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12