中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS對象之淺克隆和深克隆的案例分析

發布時間:2020-12-04 14:09:21 來源:億速云 閱讀:166 作者:小新 欄目:web開發

這篇文章給大家分享的是有關JS對象之淺克隆和深克隆的案例分析的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

淺克隆

先看代碼:

/**
 * 淺克隆 克隆傳入對象,只克隆一層
 * @param {any} source
 */
function shallowClone(source) {
    var tiaget = createEctype(source);  //創建一個副本
    // 將原對象的所有屬性值賦值到新對象上
    for (var property in source) {
        if (source.hasOwnProperty(property)) {
            tiaget[property] = source[property];
        }
    }
    /**
    * 創建副本
    * @param {any} source
    */
    function createEctype(source) {
        var newObject = {};
        if (Array.isArray(source))
            newObject = [];
        return newObject;
    }

    return tiaget;
}

執行測試:

var a={a1:1,a2:2,a3:[1,2,3]};
 var b={b1:1,b2:2,b3:[4,5,6]}
 a.b=b;
 b.a=a;
 a.a4=[a,b];
 b.b4=[a,b];
 a.fn=function(){console.log(this.b);};
 
 var newa=shallowClone(a);

測試代碼定義了一個自我引用的對象

a===a.a4[0];    // true
a===a.b.a;    // true

執行 shallowClone 方法獲得了一個對象a的副本 newa

a === newa;              // false
newa ===  newa.a4[0];    // false
newa ===   newa.b.a;     // false
a === newa.a4[0];        // true
a === newa.b.a;          // true

測試執行速度:

/**
獲取傳入方法在規定時間內執行次數

示例:
var test = function(){

};
runTime(test,1)
表示test方法 在1秒中執行了6819005次
**/

/**
 * 獲取傳入方法在規定時間內執行次數
 * @param {any} fn 執行的方法
 * @param {any} time 規定的時間,單位為秒
 */
function runTime(fn, time) {
    var startTime = Date.now();
    var count = 0;
    while (Date.now() - startTime < time * 1000) {
        fn.call();
        count++;
    }
    return count;
}

JS對象之淺克隆和深克隆的案例分析

深度克隆

代碼:

/**
 * 深克隆
 * 
 * 示例:
 * var a={a1:1,a2:2,a3:[1,2,3]};
 * var b={b1:1,b2:2,b3:[4,5,6]}
 * a.b=b;
 * b.a=a;
 * a.a4=[a,b];
 * b.b4=[a,b];
 * a.fn=function(){console.log(this.b);return this.b;};
 * 
 * var newa=deepClone(a);
 * newa.a1=123;
 * newa.fn();
 */
function deepClone(source) {
    this.objKeyCache = [];      // 對象緩存
    this.objValueCache = [];    // 對象克隆緩存

    this.clone = function (source) {
        var target = createEctype.call(this, source);
        for (var property in source) {
            if (source.hasOwnProperty(property)) {
                var value = source[property];
                if (typeof value === "number"
                    || typeof value === "boolean"
                    || typeof value === "symbol"
                    || typeof value === "string"
                    || typeof value === "function"
                    || typeof value === "undefined"
                    || value === null)
                    target[property] = value;
                else if (typeof value === "object") {
                    // 如果源對象在對象緩存中存在,就用對象克隆緩存中的值賦值
                    var index = this.objKeyCache.indexOf(value);
                    if (index >= 0)
                        target[property] = this.objValueCache[index];   
                    else {
                        target[property] = this.clone( value);
                    }
                }
                else
                    throw "未知數據類型" + (typeof value);
            }
        }

        return target;
    };
    /**
     * 創建副本
     * @param {any} source
     */
    function createEctype(source) {
        var target = {};
        if (Array.isArray(source))
            target = [];
        this.objKeyCache.push(source);
        this.objValueCache.push(target);
        return target;
    }
    var newObject = this.clone(source);
    // 釋放緩存,防止內存溢出
    this.objKeyCache = [];
    this.objValueCache = [];
    return newObject;
}

執行測試:

var a={a1:1,a2:2,a3:[1,2,3]};
var b={b1:1,b2:2,b3:[4,5,6]}
a.b=b;
b.a=a;
a.a4=[a,b];
b.b4=[a,b];
a.fn=function(){console.log(this.b);return this.b;};

var newa=deepClone(a);
a === newa;            // false
newa === newa.a4[0]    // true
newa === newa.b.a;     // true
a === newa.a4[0];      // false
a === newa.b.a;        // false

JS對象之淺克隆和深克隆的案例分析

測試執行速度:

JS對象之淺克隆和深克隆的案例分析

感謝各位的閱讀!關于JS對象之淺克隆和深克隆的案例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新晃| 齐齐哈尔市| 朔州市| 繁昌县| 平昌县| 横山县| 黔江区| 当涂县| 高青县| 兴城市| 安康市| 吉木萨尔县| 密云县| 昭觉县| 神农架林区| 大丰市| 交口县| 邵阳县| 永清县| 天全县| 阿拉善左旗| 定日县| 栾城县| 白城市| 阳东县| 恩平市| 汝州市| 会昌县| 三门县| 武川县| 新竹市| 门源| 琼中| 耿马| 石河子市| 昭通市| 鸡西市| 志丹县| 阳西县| 迭部县| 滨海县|