国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入JavaScript中深拷貝和淺拷貝

TalkingData / 1953人閱讀

摘要:深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。

深拷貝和淺拷貝問題的本質還是不同數據類型的存儲方式差異,尤其是引用數據類型的特殊。

現分別對賦值、淺拷貝、深拷貝做深入研究:

1.賦值

原理:直接將對象指針直接賦值給另一個變量

代碼

let developer = {
    title: "Frontend",
    basic: {
        html: "5",
        css: "3",
        js: "es6"
    },
    frameworks: ["React", "Vue", "AngularJS"],
    summary: function(){
        console.log("I am FE developer");
    }
};

let newDeveloper = developer;

console.log(newDeveloper);

//基本類型:改變原對象
newDeveloper.title = "Frontend Leader";
console.log(developer.title); // Frontend Leader

//對象:改變原對象
newDeveloper.basic.http = "2.0";
console.log(developer.basic.http); // 2.0
newDeveloper.basic.js = "es5";
console.log(developer.basic.js); // es5

//數組:改變原對象
newDeveloper.frameworks.push("Angular");
console.log(developer.frameworks); // [ "React", "Vue", "AngularJS", "Angular" ]

//函數:改變原對象
newDeveloper.summary = function () {
    console.log("I like FE development");
};
developer.summary(); // I like FE development
2.淺拷貝

原理:遍歷對象的每個屬性進行逐個拷貝

實現方式

方式1:遍歷并復制

方式2:Object.assign()

代碼

let developer = {
    title: "Frontend",
    basic: {
        html: "5",
        css: "3",
        js: "es6"
    },
    frameworks: ["React", "Vue", "AngularJS"],
    summary: function(){
        console.log("I am FE developer");
    }
};

/*
* 方式1:逐個復制
*
* */
function cloneInShallow(source) {
    let target = {};

    for (prop in source){
        target[prop] = source[prop];
    }

    return target
}
let newDeveloper = cloneInShallow(developer);

/*
* 方式2:Object.assign()
*
* */
// let newDeveloper = Object.assign({}, developer);

console.log(newDeveloper);

//基本類型:不改變原對象
newDeveloper.title = "Frontend Leader";
console.log(developer.title); // Frontend

// 對象:改變原對象
newDeveloper.basic.http = "2.0";
console.log(developer.basic.http); // 2.0
newDeveloper.basic.js = "es5";
console.log(developer.basic.js); // es5

//數組:改變原對象
newDeveloper.frameworks.push("Angular");
console.log(developer.frameworks); // [ "React", "Vue", "AngularJS", "Angular" ]

//函數:不改變原對象
newDeveloper.summary = function () {
    console.log("I like FE development");
};
developer.summary(); // I am FE developer
3.深拷貝

原理:使用遞歸,遍歷每一個對象屬性進行拷貝

實現方式

方式1: 純手工打造回調函數

方式2: JSON.parse(JSON.stringify(obj))

方式3: 借助jQuery

方式4: 借助lodash

代碼

let developer = {
    title: "Frontend",
    basic: {
        html: "5",
        css: "3",
        js: "es6"
    },
    frameworks: ["React", "Vue", "AngularJS", {node: "express"}],
    summary: function(){
        console.log("I am FE developer");
    }
};

/*
* 方式1: 純手工打造
* */
function cloneInDeep(source) {
    if(source && typeof source === "object"){
        let target = {};
        for (let prop in source){
            let value = source[prop];

            if(Array.isArray(value)){
                let newArray = [];
                value.forEach(function (item, index) {
                    if(Array.isArray(item) || Object.getPrototypeOf(item) === Object.prototype){
                        newArray.push(cloneInDeep(item))
                    }else{
                        newArray.push(item)
                    }
                });

                target[prop] = newArray;
            }else if(Object.getPrototypeOf(value) === Object.prototype){
                target[prop] = cloneInDeep(value);
            }else{
                target[prop] = value;
            }
        }

        return target
    }else{
        throw new Error("source is not object!")
    }
}
let newDeveloper = cloneInDeep(developer);


/*
* 方式2: JSON.parse(JSON.stringify(obj))
* 弊端:會拋棄對象的constructor
* 適用:能夠被json直接表示的數據結構,對象中只包含number、string、boolean、array、扁平對象
* 不適用:含有function、regexp
* */
// let newDeveloper = JSON.parse(JSON.stringify(developer));


/*
* 方式3: jQuery
* */
let $ = require("jquery");
// let newDeveloper = $.extend({}, developer);

/*
* 方式4: lodash
* */
let _ = require("lodash");
// let newDeveloper = _.cloneDeep(developer);


console.log(newDeveloper);

//基本類型:不改變原對象
newDeveloper.title = "Frontend Leader";
console.log(developer.title); // Frontend

// 對象:不改變原對象
newDeveloper.basic.http = "2.0";
console.log(developer.basic.http); // undefined
newDeveloper.basic.js = "es5";
console.log(developer.basic.js); // es6

//數組:不改變原對象
newDeveloper.frameworks.push("Angular");
console.log(developer.frameworks); // [ "React", "Vue", "AngularJS" , { node: "express" } ]
newDeveloper.frameworks[3].node = "koa";
console.log(developer.frameworks); // [ "React", "Vue", "AngularJS" , { node: "express" } ]

//函數:不改變原對象
newDeveloper.summary = function () {
    console.log("I like FE development");
};
developer.summary(); // I am FE developer
涉及的知識點:

數據類型及存儲機制

for...in...遍歷,枚舉屬性

遞歸

對象和數組的判斷

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95365.html

相關文章

  • 淺談JavaScript 中深拷貝實現的方法

    摘要:相信人很多學習的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。中的深拷貝也是用類似方法實現。 相信人很多學習js的過程中都踩了深拷貝和淺拷貝的坑,深拷貝和淺拷貝的區別我就不再贅述了,今天我來寫一下我自己實現深拷貝的各種方法。 比較簡單的拷貝方式可以借用瀏覽器的Json對象去實現,先把對象轉化為json字符串,在解析回對...

    Vicky 評論0 收藏0
  • JS里深拷貝和淺拷貝的釋義

    摘要:本文解釋中深拷貝和淺拷貝的區別。深拷貝深拷貝指遞歸的復制對象的屬性給新對象。有些時候一層的深拷貝被認為是淺拷貝,比如的值是一個對象,淺拷貝出來的新對象直接引用了原對象的對象,所以也會相互影響的。 本文解釋javascript中深拷貝和淺拷貝的區別。 淺拷貝/Shallow Copy 淺拷貝指拷貝了引用值。 var original = {prop1 : Prop1, prop2 : p...

    zollero 評論0 收藏0
  • 一篇文章理解JS數據類型、深拷貝和淺拷貝

    摘要:接下來我們進入正片數據類型六種基本數據類型布爾值,和一個表明值的特殊關鍵字。一種數據類型,它的實例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進入正片: js 數據類型 六種 基本數據類型: Boolean. 布爾值,true 和 false. nu...

    EddieChan 評論0 收藏0
  • 一篇文章理解JS數據類型、深拷貝和淺拷貝

    摘要:接下來我們進入正片數據類型六種基本數據類型布爾值,和一個表明值的特殊關鍵字。一種數據類型,它的實例是唯一且不可改變的。在中是沒有方法是可以改變布爾值和數字的。參考資料深拷貝淺拷貝 前言 筆者最近整理了一些前端技術文章,如果有興趣可以參考這里:muwoo blogs。接下來我們進入正片: js 數據類型 六種 基本數據類型: Boolean. 布爾值,true 和 false. nu...

    enda 評論0 收藏0

發表評論

0條評論

TalkingData

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<