js 中賦值霉囚、淺拷貝和深拷貝的區(qū)別和實(shí)現(xiàn)方式

一柄粹、 數(shù)據(jù)類型

js的數(shù)據(jù)類型分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和引用數(shù)據(jù)類型。

  1. 基本數(shù)據(jù)類型:直接存儲(chǔ)在棧中的數(shù)據(jù)铐刘。
  2. 引用數(shù)據(jù)類型:棧中存儲(chǔ)的是該對(duì)象的引用地址陪每,真實(shí)的數(shù)據(jù)存放在堆內(nèi)存中。引用數(shù)據(jù)類型在棧中存儲(chǔ)了指針。當(dāng)解釋器尋找引用值時(shí)檩禾,會(huì)首先檢索其在棧中的地址挂签,取到地址后從堆中獲得實(shí)體。
  3. 保存在棧內(nèi)存的必須是大小固定的數(shù)據(jù)盼产,引用類型的大小不固定饵婆,只能保存在堆內(nèi)存,把它的地址寫在棧內(nèi)存供訪問戏售。
  4. 如果是基本數(shù)據(jù)類型侨核,是按值訪問,操作的就是變量保存的值灌灾。如果是引用類型的值搓译,只能通過保存在變量中的引用類型地址來操作實(shí)際對(duì)象。

二锋喜、賦值些己、淺拷貝和深拷貝

只準(zhǔn)對(duì) object 和 array 這樣的引用數(shù)據(jù)類型的。

  1. 賦值:當(dāng)我們把一個(gè)對(duì)象賦值給一個(gè)新的變量時(shí)嘿般,賦的其實(shí)是該對(duì)象的在棧中的引用地址段标,而不是堆中的數(shù)據(jù)。兩個(gè)對(duì)象指向的是同一個(gè)存儲(chǔ)空間炉奴,無論哪個(gè)對(duì)象發(fā)生改變逼庞,其實(shí)都是改變的存儲(chǔ)空間的內(nèi)容,因此瞻赶,兩個(gè)對(duì)象是聯(lián)動(dòng)的赛糟。

  2. 淺拷貝:淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身共耍,新舊對(duì)象共享一塊內(nèi)存虑灰。淺拷貝只能拷貝一層的基本數(shù)據(jù)類型,多層后就無法拷貝到了痹兜。淺拷貝比賦值多了一層穆咐。

    function shallowCopy(obj) {
      var prop = {};
      for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
          prop[i] = obj[i];
        }
      }
      return prop;
    }
    
  3. 深拷貝:深拷貝會(huì)在堆內(nèi)存中開辟一個(gè)新的區(qū)域存放新的值,新值和舊值不共享內(nèi)存字旭。修改新值不影響原值对湃。

三、實(shí)現(xiàn)方式

  1. 淺拷貝的實(shí)現(xiàn)方式

    (1)Object.assign():可以把任意多個(gè)的源對(duì)象自身的可枚舉屬性拷貝給目標(biāo)對(duì)象遗淳,然后返回目標(biāo)對(duì)象拍柒。

    (2)lodash的clone方法

    (3)擴(kuò)展...操作符

    (4)Array.prototype.concat,數(shù)組的拼接方法

    (5)Array.prototype.slice屈暗,數(shù)組的截取方法

    (6)手寫淺拷貝

  2. 深拷貝的實(shí)現(xiàn)方式

    (1)JSON.parse(JSON.stringify()):可以處理數(shù)組和對(duì)象的深拷貝拆讯,但是不能處理函數(shù)和正則等

         如果obj里存在***時(shí)間對(duì)象***脂男,得到的是***字符串***
    
         存在***RegExp、Error***對(duì)象种呐,得到的是***空對(duì)象***
    
         存在***函數(shù)宰翅、undefined***,會(huì)把函數(shù)和undefined***丟失***
    
         存在***NaN爽室、Infinity和-Infinity***汁讼,會(huì)變成***null***
    
         存在***構(gòu)造函數(shù)***生成的,構(gòu)造函數(shù)會(huì)被***丟棄***阔墩;
    
         對(duì)象中存在循環(huán)引用(環(huán)形變量)會(huì)報(bào)錯(cuò)
    

    (2)lodash的cloneDeep函數(shù)

    (3)jQuery.extend函數(shù)

    (4)手寫遞歸實(shí)現(xiàn)

四嘿架、使用場景

深拷貝
在前臺(tái)發(fā)請求從后臺(tái)獲取數(shù)據(jù)的時(shí)候,獲取的一般都是json格式的對(duì)象啸箫,我們一般要對(duì)這些數(shù)據(jù)進(jìn)行操作耸彪,但是這些數(shù)據(jù)可能有其他地方也需要使用,就可能會(huì)造成很多隱性問題忘苛,對(duì)數(shù)據(jù)做一次深拷貝搜囱,就能讓我們更安全的操作數(shù)據(jù)了,就不會(huì)出現(xiàn)原數(shù)據(jù)的破壞柑土。
從服務(wù)器fetch到數(shù)據(jù)之后我將其存放在store中,通過props傳遞給界面绊汹,然后我需要對(duì)這堆數(shù)據(jù)進(jìn)行修改稽屏,那涉及到修改就一定有保存和取消,所以我們需要將這堆數(shù)據(jù)拷貝到其他地方西乖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狐榔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子获雕,更是在濱河造成了極大的恐慌薄腻,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届案,死亡現(xiàn)場離奇詭異庵楷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)楣颠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門尽纽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人童漩,你說我怎么就攤上這事弄贿。” “怎么了矫膨?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵差凹,是天一觀的道長期奔。 經(jīng)常有香客問我,道長危尿,這世上最難降的妖魔是什么呐萌? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮脚线,結(jié)果婚禮上搁胆,老公的妹妹穿的比我還像新娘。我一直安慰自己邮绿,他們只是感情好渠旁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著船逮,像睡著了一般顾腊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挖胃,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天杂靶,我揣著相機(jī)與錄音,去河邊找鬼酱鸭。 笑死吗垮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹髓。 我是一名探鬼主播烁登,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔚舀!你這毒婦竟也來了饵沧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赌躺,失蹤者是張志新(化名)和其女友劉穎狼牺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礼患,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是钥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讶泰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咏瑟。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痪署,靈堂內(nèi)的尸體忽然破棺而出码泞,到底是詐尸還是另有隱情,我是刑警寧澤狼犯,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布余寥,位于F島的核電站领铐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宋舷。R本人自食惡果不足惜绪撵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祝蝠。 院中可真熱鬧音诈,春花似錦、人聲如沸绎狭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儡嘶。三九已至喇聊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹦狂,已是汗流浹背誓篱。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凯楔,地道東北人窜骄。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像摆屯,于是被迫代替她去往敵國和親啊研。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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