=JavaScript'teki operatörün ne yaptığını ve yapmadığını anlamak önemlidir .
=Operatör bir yapmaz kopya verilerinin.
=Operatör yeni yaratır başvuru için aynı verilere.
Orijinal kodunuzu çalıştırdıktan sonra:
var a = $('#some_hidden_var').val(),
b = a;
ave bşimdi aynı nesne için iki farklı isim var .
Bu nesnenin içeriğinde yaptığınız herhangi bir değişiklik, ister adeğişken ister değişken üzerinden başvuruyor olun, aynı şekilde görülecektir b. Aynı nesnelerdir.
Dolayısıyla, daha sonra bu kodla borijinal anesneye "geri dönmeyi" denediğinizde :
b = a;
Kod aslında hiçbir şey yapmaz , çünkü ave btamamen aynı şeydir. Kod, yazdığınızla aynıdır:
b = b;
ki belli ki hiçbir şey yapmayacak.
Yeni kodunuz neden çalışıyor?
b = { key1: a.key1, key2: a.key2 };
Burada, {...}nesne değişmeziyle yepyeni bir nesne yaratıyorsunuz . Bu yeni nesne, eski nesnenizle aynı değil. Yani şimdi istediğinizi byapan bu yeni nesneye referans olarak ayarlıyorsunuz .
Herhangi bir rastgele nesneyi işlemek için, Armand'ın cevabında listelenen gibi bir nesne klonlama işlevini kullanabilirsiniz veya jQuery'yi kullandığınız için yalnızca $.extend()işlevi kullanın . Bu işlev, bir nesnenin basit bir kopyasını veya derin bir kopyasını oluşturur. (Bunu , nesneleri değil, DOM öğelerini kopyalamak için kullanılan $().clone()yöntemle karıştırmayın .)
Sığ bir kopya için:
b = $.extend( {}, a );
Veya derin bir kopya:
b = $.extend( true, {}, a );
Sığ kopya ile derin kopya arasındaki fark nedir? Yüzeysel bir kopya, bir nesne değişmeziyle yeni bir nesne oluşturan kodunuza benzer. Orijinal nesneyle aynı özelliklere referanslar içeren yeni bir üst düzey nesne oluşturur.
Nesneniz yalnızca sayılar ve dizeler gibi ilkel türleri içeriyorsa, derin bir kopya ve yüzeysel bir kopya tam olarak aynı şeyi yapacaktır. Ancak nesneniz başka nesneler veya içinde yuvalanmış diziler içeriyorsa, sığ bir kopya bu yuvalanmış nesneleri kopyalamaz , yalnızca onlara referanslar oluşturur. Böylece, üst düzey nesnenizde yaşadığınız iç içe nesnelerle aynı sorunu yaşayabilirsiniz. Örneğin, bu nesne verildiğinde:
var obj = {
w: 123,
x: {
y: 456,
z: 789
}
};
Bu xnesnenin basit bir kopyasını yaparsanız , yeni nesnenizin özelliği xorijinalle aynı nesnedir:
var copy = $.extend( {}, obj );
copy.w = 321;
copy.x.y = 654;
Şimdi nesneleriniz şöyle görünecek:
var copy = {
w: 321,
x: {
y: 654,
z: 789
}
};
var obj = {
w: 123,
x: {
y: 654,
z: 789
}
};
Bunu derin bir kopya ile önleyebilirsiniz. Derin kopya, üst düzey nesnenin bir kopyasını oluşturduğu şekilde bu nesnelerin kopyalarını oluşturmak için her yuvalanmış nesneye ve diziye (ve Armand'ın kodundaki Tarih) yinelenir. Yani değişiklik copy.x.yetkilemeyecek obj.x.y.
Kısa cevap: Şüpheniz varsa, muhtemelen derin bir kopya istersiniz.
agelen kuruldu.val()bu doğru - Öyle olmadığını bir nesne JSON (bir dize), olduğunu varsayalım?JSON.parse(a)Bir noktada gerçek bir nesne elde etmek için kullanıyor musunuz ?