2014-12-03 101 views
-1

我瘋了嗎?JS克隆對象並刪除元素

我想克隆一個對象然後從它刪除一個元素,但它也從最初的對象中刪除。我覺得我不再理解生活!

var obj1 = { 
    'name' : 'bob', 
    'hair' : 'brown' 
} 

var obj2 = obj1; 
delete obj2.hair; 

This delete's obj1.hair。怎麼樣?什麼?爲什麼?

+1

那不是 「克隆」 – Kyslik 2014-12-03 02:22:41

回答

0

var obj2 = obj1;不克隆該對象。它只是使第二個變量指向完全相同的對象。在Javascript中,對象通過引用進行分配(而不是通過複製)。所以,這兩個變量都指向唯一的對象。

如果你真的想要一個克隆,那麼你必須實際做一個克隆。這不是JavaScript語言內置的功能,但您可以構建一個克隆功能。那裏有很多。

一些參考:

What is the most efficient way to deep clone an object in JavaScript?

How do I correctly clone a JavaScript object?

What is the most efficient way to deep clone an object in JavaScript?

How to Deep clone in javascript

+1

添加到各種克隆函數的引用。 – jfriend00 2014-12-03 02:26:10

0

obj2obj1指向同一個對象。您需要clone it或new瞭解具有相似值的對象的兩個不同引用。

function Obj(name, hairColor){ 
    this.name = name; 
    this.hair = hairColor; 
}; 

var obj1 = new Obj('bob', 'brown'); 
var obj2 = new Obj('bob', 'brown'); 

delete obj2.hair; 

Another alternative,如果限定如上述描繪的Obj功能,是不可行的,是編寫遍歷一個對象的屬性,並返回具有相同的值的新對象的函數。

+0

哦.. geeze。好的。我怎樣才能快速做到這一點,以便我可以使用「新」? – user3822370 2014-12-03 02:24:13

+0

搜索...多數民衆贊成如何https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new – Kyslik 2014-12-03 02:24:57

0
function clone(obj) { 
    if(obj == null || typeof(obj) != 'object') 
     return obj; 

    var temp = obj.constructor(); // changed 

    for(var key in obj) { 
     if(obj.hasOwnProperty(key)) { 
      temp[key] = clone(obj[key]); 
     } 
    } 
    return temp; 
} 

使用

var obj1 = { 
    'name' : 'bob', 
    'hair' : 'brown' 
} 

var obj2 = clone(obj1); 

一切歸功於這裏https://stackoverflow.com/a/122190/1564365

(我覺得這麼愚蠢回答這個問題。)