javascript深拷貝

javascript的淺拷貝和深拷貝是老生長談的問題了。淺拷貝是內存引用,修改一個會引起另一個跟着改變,當然只對object類型生效。今天看到一個深拷貝的方法:

var cloneObj = function(obj){
    var str, newobj = obj.constructor === Array ? [] : {};
    if(typeof obj !== 'object'){
        return;
    } else if(window.JSON){
        str = JSON.stringify(obj), //系列化對象
        newobj = JSON.parse(str); //還原
    } else {
        for(var i in obj){
            newobj[i] = typeof obj[i] === 'object' ? 
            cloneObj(obj[i]) : obj[i]; 
        }
    }
    return newobj;
};
深拷貝一般有兩種方式:一種是新建一個對象,然後循環賦予屬性和值,另外一種呢,利用JSON的stringify和parse方法實現。

迭代一個object的屬性值,可以用for in 循環,更好的方法是用Object.keys()方法。Object.keys方法返回一個對象可枚舉的屬性名的數組。它與for in循環的不同之處在於,for in會把_proto_裏的屬性名也迭代進去。所以,for in循環裏包含了hasOwnProperty爲false的屬性名。來看個例子

var Obj = function(){
  this.a=1;
}
Obj.prototype.b=2;
var newObj = new Obj();
console.log(Object.keys(newObj)); //['a']
for(var i in newObj){
  console.log(i); // a,b
  if (newObj.hasOwnProperty(i)){
    console.log(i); // a
  }
}
另個附一個各種深拷貝的性能測試地址:https://jsperf.com/deep-copy-vs-json-stringify-json-parse/5#
發佈了97 篇原創文章 · 獲贊 18 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章