成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript中淺拷貝和深拷貝的區(qū)別和實(shí)現(xiàn)

wenshi11019 / 3445人閱讀

摘要:要理解中淺拷貝和深拷貝的區(qū)別,首先要明白的數(shù)據(jù)類型有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型基礎(chǔ)數(shù)據(jù)類型保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段,有,,,,引用數(shù)據(jù)類型,對(duì)象,保存在堆內(nèi)存空間中存放在棧內(nèi)存中與變量名與內(nèi)存地址存儲(chǔ)在棧內(nèi)存中,與作為對(duì)象存

要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型

JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型引用數(shù)據(jù)類型

基礎(chǔ)數(shù)據(jù)類型:保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段 ,有undefined,boolean,number,string,null
引用數(shù)據(jù)類型:Array,對(duì)象,F(xiàn)unction 保存在堆內(nèi)存空間中

var a1 = 0; var a2 = "this is str"; var a3 = null 存放在棧內(nèi)存中
var c =[1,2,3] 與 var d = {m:20} 變量名與內(nèi)存地址存儲(chǔ)在棧內(nèi)存中,[1,2,3]與{m:20} 作為對(duì)象存儲(chǔ)在堆內(nèi)存中

基礎(chǔ)數(shù)據(jù)類型的復(fù)制(如var a = 20 var b = a)

引用數(shù)據(jù)類型的復(fù)制 ( var m ={a:10, b:20} var n = m)

解釋:
m與n指向同一個(gè)內(nèi)存空間,當(dāng)m或者n改變時(shí),另一個(gè)也跟著改變
如m.a = 80 ; console.log(n.a) // 80

怎么樣使引用數(shù)據(jù)類型有各自獨(dú)立的內(nèi)存空間?

一、采用遞歸的方法復(fù)制拷貝對(duì)象

    function deepclone(obj) {
        let objClone = Array.isArray(obj) ? [] : {};
        if (obj && typeof obj === "object") {
            for (key in obj) {
                //if (obj.hasOwnProperty(key)) {   //也可以不加
                    if (obj[key] && obj[key] === "object") {
                        objClone[key] = deepclone(obj[key])
                    } else {
                        objClone[key] = obj[key]
                    }
                //}
            }
        }
        return objClone
    }
    var a = [1, 2, 3, 4];
    var b = deepclone(a);
    a[0] = 8
    console.log(a, b);

   Array.isArray(obj):ECMAScript 5.1 (ECMA-262)   考慮到的兼容性,可以用下面的方法實(shí)現(xiàn)較好的兼容
   if (!Array.isArray) {
      Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === "[object Array]";
     };
}

二、用JSON.stringify把對(duì)象轉(zhuǎn)成字符串,再用JSON.parse把字符串轉(zhuǎn)成新的對(duì)象。

   function deepclone(obj){
      var _obj = JSON.stringify(obj);
      var cloneObj = JSON.parse(_obj);
      return cloneObj
    }
    var a =[1,2,3,4];
    var b= deepclone(a);
    a[0]=8
    console.log(a,b);
    //可以用JSON.stringify與JSON.parse實(shí)現(xiàn)深拷貝的原因是JSON.stringify(obj)轉(zhuǎn)換成字符串,變成基本數(shù)據(jù)類型,基本類型拷貝是直接在棧內(nèi)存新開空間,直接復(fù)制一份名-值,不影響之前的對(duì)象

總結(jié):

淺拷貝(shallow copy):只復(fù)制指向某個(gè)對(duì)象的指針,而不復(fù)制對(duì)象本身,新舊對(duì)象共享一塊內(nèi)存; ??

深拷貝(deep copy):復(fù)制并創(chuàng)建一個(gè)一摸一樣的對(duì)象,不共享內(nèi)存,修改新對(duì)象,舊對(duì)象保持不變;實(shí)現(xiàn)深拷貝主要有2種方法

(1)遞歸

(2)JSON.stringify結(jié)合JSON.parse

微信公眾號(hào):前端之攻略
發(fā)布前端與設(shè)計(jì)有關(guān)的內(nèi)容,請(qǐng)掃描下面二維碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98031.html

相關(guān)文章

  • 關(guān)于JavaScript拷貝拷貝

    摘要:引用類型值引用類型值是保存在堆內(nèi)存中的對(duì)象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類型值的時(shí)候,其實(shí)只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型。JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。js的基本類型:undefined,null,string,boolean,number,s...

    shenhualong 評(píng)論0 收藏0
  • js中拷貝拷貝深入理解

    摘要:舉個(gè)例子來說明一下什么是淺拷貝什么是深拷貝淺拷貝得出的結(jié)果可以看出是淺拷貝非對(duì)象的屬性值一個(gè)改變不影響另一個(gè)的值對(duì)象屬性是引用賦值所以一個(gè)改變會(huì)影響另一個(gè)的改變出現(xiàn)這種情況的本質(zhì)是對(duì)象是按引用賦值的深拷貝指的是拷貝一個(gè)對(duì)象,改變一個(gè)值不影響 舉個(gè)例子來說明一下什么是淺拷貝什么是深拷貝 淺拷貝 var x = { a: 1, b: {f: { g: 1 ...

    lastSeries 評(píng)論0 收藏0
  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評(píng)論0 收藏0
  • JavaScript系列--淺析JavaScript解析賦值、淺拷貝拷貝區(qū)別

    摘要:它將返回目標(biāo)對(duì)象。有些文章說是深拷貝,其實(shí)這是不正確的。深拷貝相比于淺拷貝速度較慢并且花銷較大??截惽昂髢蓚€(gè)對(duì)象互不影響。使用深拷貝的場(chǎng)景完全改變變量之后對(duì)沒有任何影響,這就是深拷貝的魔力。 一、賦值(Copy) 賦值是將某一數(shù)值或?qū)ο筚x給某個(gè)變量的過程,分為: 1、基本數(shù)據(jù)類型:賦值,賦值之后兩個(gè)變量互不影響 2、引用數(shù)據(jù)類型:賦址,兩個(gè)變量具有相同的引用,指向同一個(gè)對(duì)象,相互之間有...

    laznrbfe 評(píng)論0 收藏0
  • JavaScript之淺、深拷貝

    摘要:前言里面淺拷貝和深拷貝是非常關(guān)鍵的知識(shí)點(diǎn),今天就來通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。對(duì)象的拷貝又分為淺拷貝和深拷貝。印證了上述所說的對(duì)于所有的基本類型,簡(jiǎn)單的賦值已經(jīng)是實(shí)現(xiàn)了深拷貝。 前言 JavaScript里面淺拷貝和深拷貝是非常關(guān)鍵的知識(shí)點(diǎn),今天就來通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。 深淺拷貝的區(qū)別 拷貝:其實(shí)就是一個(gè)對(duì)象復(fù)制給另外...

    leanxi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<