2013-03-13 40 views
9

JSON serileştirilebilir nesneler için derin karşılaştırma ve kopyalama için çeşitli uygulamaları denemeden sonra, en hızlı sık fark ettik sadece şunlardır:Derin karşılaştırmalar ve klonlama için JSON.stringify kullanmak güzel midir?

function deep_clone(a){ 
    return JSON.parse(JSON.stringify(a)); 
}; 
function is_equal(a,b){ 
    return JSON.stringify(a) === JSON.stringify(b); 
}; 

ben hile böyle hissediyorum ama. Gelecekte beni rahatsız edecek bazı problemler bulacağım gibi. Bunları kullanmak güzel mi?

+1

Sadece JSON serileştirilebilir nesneleri kullanıyorum. – MaiaVictor

+1

FWIW makalesi, 'JSON nesnesi' demek ve 'JSON nesnesi' diye bir şey olmadığını belirtmekle ilgili sıkıdır. Http://benalman.com/news/2010/03/theres-no-such-thing-as-a- json/ – DanC

+0

@BenjaminGruenbaum tam olarak yinelenmez, ancak bu adamlar zaten eski JSON lib'i kullanıyor. – MaiaVictor

cevap

9

JavaScript, anahtarların siparişini garanti etmez.

Aynı sırayla girilirlerse, bu yaklaşım çoğu zaman işe yarayacaktır, ancak güvenilir olmaz.

Ayrıca, Anahtarları farklı bir sırayla girildi derin eşit, ama nesneler için yanlış döndürür:

JSON.stringify ({a: 1 b: 2}) === "{ "a": 1, "b": 2} "

JSON.stringify ({b: 2, a: 1}) ===" {"b": 2, "a": 1} "

+1

Doğru. Bu diğer cevabı yanlış yapar. İncelendi. – MaiaVictor

2

Anahtar/değer çiftleri her zaman aynı sırada olduğu sürece, evet, derin eşitlik operatörü (===) kullanarak karşılaştırmak için stringify kullanabilirsiniz.

4

Bunun eski bir soru olduğunu anlıyorum, ancak cevaplara biraz daha eklemek istedim, çünkü birisi bu sayfadan başka bir şekilde uzaklaşabiliyor, yanlışlıkla karşılaştırma ve klonlama için JSON.stringify'u kullanmanın sorun olmadığı sürece sorunsuzca çalışacağını düşünüyorum nesneleri karşılaştırmak/klonlamak için kullanılır. Üyeler sıralanmamıştır. (Kabul edilen yanıtın adil olması için, 'un'u düşünmemeleri gerektiğini düşünürler; "Eğer üyeler aynı sırayla girilirse, bu yaklaşım çoğu zaman çalışacaktır.")

Kod muhtemelen en iyi potansiyel hıçkırık göstermektedir:

JSON.stringify(NaN) === JSON.stringify(null) 
// => true 

JSON.stringify(Infinity) === JSON.stringify(null) 
// => true 

// or, to put it all together: 
JSON.stringify({ val1: (1/0), val2: parseInt("hi there"), val3: NaN }) === JSON.stringify({ val1: NaN, val2: null, val3: null }) 
// => true 

// and here's the same example with "cloning" rather than comparison: 
JSON.parse(JSON.stringify({ val1: (1/0), val2: parseInt("hi there"), val3: NaN })) 
// => Object {val1: null, val2: null, val3: null} 

Bunlar sipariş (diğerleri söylediler, o olabilen,) bir sorun olmasa bile soruna yol açabilir tuhaflıklar vardır. Muhtemelen çoğu zaman bu tuhaflıkların çirkin kafalarını geri getirmesi pek muhtemel değildir, fakat bunların farkına varmak iyi bir şeydir, çünkü bazı hatalar bulmak zor olabilir.

+0

Ek için teşekkürler! – MaiaVictor