我瘋了嗎?JS克隆對象並刪除元素
我想克隆一個對象然後從它刪除一個元素,但它也從最初的對象中刪除。我覺得我不再理解生活!
var obj1 = {
'name' : 'bob',
'hair' : 'brown'
}
var obj2 = obj1;
delete obj2.hair;
This delete's obj1.hair。怎麼樣?什麼?爲什麼?
我瘋了嗎?JS克隆對象並刪除元素
我想克隆一個對象然後從它刪除一個元素,但它也從最初的對象中刪除。我覺得我不再理解生活!
var obj1 = {
'name' : 'bob',
'hair' : 'brown'
}
var obj2 = obj1;
delete obj2.hair;
This delete's obj1.hair。怎麼樣?什麼?爲什麼?
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?
添加到各種克隆函數的引用。 – jfriend00 2014-12-03 02:26:10
obj2
和obj1
指向同一個對象。您需要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
功能,是不可行的,是編寫遍歷一個對象的屬性,並返回具有相同的值的新對象的函數。
哦.. geeze。好的。我怎樣才能快速做到這一點,以便我可以使用「新」? – user3822370 2014-12-03 02:24:13
搜索...多數民衆贊成如何https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new – Kyslik 2014-12-03 02:24:57
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
(我覺得這麼愚蠢回答這個問題。)
那不是 「克隆」 – Kyslik 2014-12-03 02:22:41