2016-11-05 10 views
6

Bu eski bir soru olabilir ancak javascript'te bir ödev olarak başvurulan nesnelerin kopyalanmasının doğasını merak ediyorum. Ben javascript yeni tür kulüpler veHard Copy vs Sığ kopya javascript

var a = {}; 
var b = a; 
a.name = "Renato"; 
console.log(b); 
Object {name: "renato"} 

eğer bu gerçekten Nesne atama için varsayılan olarak sığ bir kopyasına sahip dikkatimi çekti o Anlamı

. Basılı bir kopyasını oluşturmak için bir mixin oluşturmanız gerektiğini araştırdım. Dönüşümün çok dolaysız olduğu için bu neden varsayılan olarak seçildi diye merak ediyordum. Teşekkürler!

+0

'niçin bu varsayılan olarak seçildi diye merak ediyordu. Çünkü çoğu durumda en iyi seçenek olurdu .. Javascript bir Çöp Toplanan ortam, güçlü yönlerinden biri, bellek hakkında endişelenmenize gerek kalmadan ilgili nesneleri geçirebiliyor sızıntıları. Ve diğer avantajı hız .. – Keith

+0

Ayrıca, derin kopyalar daha pahalı. Varsayılan olarak sığ kopya yapmak programcıya hangisini yapmak istediklerini açıkça belirtme özgürlüğü verir – Alex

cevap

11

Nesneler ve diziler aynı nesneye başvuru olarak kabul edilir. Nesneyi klonlamak istiyorsanız, bunu yapmanın birkaç yolu vardır. Daha sonra tarayıcılarda

, yapabileceğiniz:

var b = Object.assign({}, a); 

bir kitaplık için gitmek isterseniz, lodash _.clone sağlar (ve _.cloneDeep):

var b = _.clone(a); 

size istemiyorsanız Bu yöntemlerden herhangi birini yaparsanız, her bir anahtar ve değerle numaralandırıp yeni bir nesneye atayabilirsiniz. Çoğu zaman birden fazla işlevden geçerken referans olarak kabul edilmeleri çok değerlidir. Sayılar ve dizgiler gibi temel öğeler için durum böyle değildir, çünkü çoğu durumda bu oldukça mantıklı gelebilir.

+0

Ayrıca eski JSON.parse/stringify türünü de ekleyebilirsiniz .. 'var b = JSON.parse (JSON.stringify (a))' – Keith

+0

@Keith ayrıca başka bir fikir, ancak bu, işlevler gibi değerlere sahip nesneler için işe yaramaz. –

+0

Eğer {a: 'b', c: function() {}} 'varsa, '' '' {'a': 'b'} ''' '' –