JS實現值復制


在JS中對象一般都是傳地址,后續修改也會影響原始數據。例如這樣。

var a={
    b:"b"
};
 
var c=a;
c.b="c";
 
console.log(a);
console.log(c);

會發現a.b也變成了"c"。 

以下是網上一位高手寫的JS實現值復制,獨立復制一個對象,避免雙向修改。

//值復制
function clone(obj) {
    //判斷是對象,就進行循環復制
    if (typeof obj === 'object' && typeof obj !== 'null') {
        // 區分是數組還是對象,創建空的數組或對象
        var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {};
        for (var k in obj) {
            // 如果屬性對應的值為對象,則遞歸復制
            if(typeof obj[k] === 'object' && typeof obj[k] !== 'null'){
                o[k] = clone(obj[k])
            }else{
                o[k] = obj[k];
            }
        }
    }else{ //不為對象,直接把值返回
        return obj;
    }
    return o;
}

上述代碼有一個bug,就是針對null的處理,null在js中的類型是object,上述代碼會將null復制成{}。根本的問題在於高手在條件“typeof obj === 'object' && typeof obj !== 'null'”的時候做了錯誤的判斷,試想類型是object了肯定類型就不是null了吧。以下是修正后的方法:

//值復制
function clone(obj) {
    //判斷是對象,就進行循環復制
    if (typeof obj === 'object' && obj!=null) {
        // 區分是數組還是對象,創建空的數組或對象
        var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {};
        for (var k in obj) {
            // 如果屬性對應的值為對象,則遞歸復制
            if(typeof obj[k] === 'object' && obj[k]!=null){
                o[k] = clone(obj[k])
            }else{
                o[k] = obj[k];
            }
        }
    }else{ //不為對象,直接把值返回
        return obj;
    }
    return o;
}

 

更多個人技術文章請訪問:http://88gis.cn/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM