"Eval ()" ve "JSON.parse ()" teknikleri, birbirini dışlayan biçimleri kullanır.
- "Eval ()" ile parantez gereklidir .
- "JSON.parse ()" ile parantez yasaktır .
Dikkat edin, "eval" biçimini üreten "stringify ()" işlevleri vardır. Ajax için yalnızca JSON formatını kullanmalısınız.
"Eval" tüm JavaScript dilini içerirken JSON, dilin yalnızca küçük bir alt kümesini kullanır. JavaScript dilindeki "eval" un tanıması gereken yapılar arasında "Blok deyimi" (diğer adıyla "bileşik ifade") bulunur ; bu, içinde bazı ifadeler bulunan bir çift veya kaşlı ayraç "{}". Ancak, nesne değişmezlerinin sözdiziminde küme parantezleri de kullanılır. Yorum, kodun göründüğü bağlama göre farklılık gösterir. Bir şey size gerçek bir nesne gibi görünebilir, ancak "eval" bunu bileşik bir ifade olarak görecektir.
JavaScript dilinde, nesne değişmezleri bir atamanın sağında yer alır.
var myObj = { ...some..code..here... };
Nesne değişmezleri kendi başlarına oluşmaz.
{ ...some..code..here... }
OP'nin 2008'de sorulan orijinal sorusuna geri dönerek, "eval ()" de aşağıdakilerin neden başarısız olduğunu sordu:
{ title: "One", key: "1" }
Cevap, bileşik bir ifade gibi görünmesidir. Bunu bir nesneye dönüştürmek için, onu bileşik bir ifadenin imkansız olduğu bir bağlama koymalısınız. Bu, etrafına parantez koyarak yapılır
( { title: "One", key: "1" } ) // not a compound statment, so must be object literal
Benzer bir açıklama neden OP de sorulan yaptım başarıyla eval:
[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]
Aynı cevap geçerlidir - küme parantezleri bir bileşik ifadenin imkansız olduğu bir bağlamdadır. Bu bir dizi bağlamıdır, "[...]
" ve diziler nesneler içerebilir ancak ifade içeremezler.
"Eval ()" 'den farklı olarak, JSON yetenekleri açısından çok sınırlıdır. Sınırlama kasıtlıdır. JSON tasarımcısı, yalnızca bir atamanın sağ tarafında görünebilen sözdizimini kullanarak minimalist bir JavaScript alt kümesi tasarladı. Yani, JSON'da doğru bir şekilde ayrıştıran bir kodunuz varsa ...
var myVar = JSON.parse("...some...code...here...");
... bu, bunun gibi bir ödevin sağ tarafında da yasal olarak ayrıştırılacağı anlamına gelir ..
var myVar = ...some..code..here... ;
Ancak JSON'daki tek kısıtlama bu değil. JSON için BNF dil şartname çok basittir. Örneğin, dizeleri belirtmek için tek tırnakların kullanılmasına izin vermez (JavaScript ve Perl gibi) ve tek bir karakteri bayt olarak ifade etmenin bir yolu yoktur ('C'nin yaptığı gibi). Ne yazık ki, yorumlara da izin vermiyor (bu, yapılandırma dosyalarını oluştururken gerçekten iyi olurdu). Tüm bu sınırlamaların iyi yanı, JSON'un ayrıştırılmasının hızlı olması ve kod yerleştirme (bir güvenlik tehdidi) için hiçbir fırsat sunmamasıdır.
Bu sınırlamalar nedeniyle, JSON'un parantez için kullanımı yoktur. Sonuç olarak, bir JSON dizesindeki bir parantez geçersiz bir karakterdir.
Aşağıdaki nedenlerden dolayı, ajax ile her zaman JSON formatını kullanın:
- JSON için tipik bir ajax işlem hattı yapılandırılacaktır.
- "Eval ()" kullanımı bir güvenlik riski olarak eleştirilecektir.
Ajax ardışık düzenine bir örnek olarak, bir Node sunucusu ve bir jQuery istemcisi içeren bir programı düşünün. İstemci programı, forma sahip bir jQuery çağrısı kullanır $.ajax({dataType:'json',...etc.});
. JQuery, daha sonra kullanılmak üzere bir jqXHR nesnesi oluşturur, ardından ilişkili isteği paketler ve gönderir. Sunucu isteği kabul eder, işler ve ardından yanıt vermeye hazırdır. Sunucu programı res.json(data)
, yanıtı paketlemek ve göndermek için yöntemi çağıracaktır . İstemci tarafında, jQuery yanıtı kabul eder, ilişkili jqXHR nesnesine danışır ve JSON formatlı verileri işler. Bunların tümü, manuel veri dönüştürmeye gerek kalmadan çalışır. Yanıt, Node sunucusunda JSON.stringify () öğesine hiçbir açık çağrı ve istemcide JSON.parse () öğesine açık çağrı içermez; hepsi sizin için halledildi.
"Eval" kullanımı, kod yerleştirme güvenlik riskleriyle ilişkilidir. Bunun olmasının bir yolu olmadığını düşünebilirsiniz, ancak bilgisayar korsanları oldukça yaratıcı olabilir. Ayrıca, Javascript optimizasyonu için "eval" sorunludur.
Kendinizi bir "stringify ()" işlevi kullanırken bulursanız, bu ada sahip bazı işlevlerin JSON ile değil "eval" ile uyumlu dizeler oluşturacağını unutmayın. Örneğin, Düğüm'de, aşağıdakiler size "eval" uyumlu biçimde dizeler oluşturan işlev verir:
var stringify = require('node-stringify');
Bu yararlı olabilir, ancak belirli bir ihtiyacınız yoksa, muhtemelen istediğiniz şey bu değildir.