Tırnaklı ve tırnaksız nesne anahtarları arasındaki fark nedir?


209

Arasında herhangi bir fark var mı

obj = {'foo': 'bar'} 

ve

obj = {foo: 'bar'}

-Tırnakları kullanmadığım zaman anahtarda kullanamayacağınızı fark ettim . Ama aslında bir fark yaratıyor mu? Evet ise, hangisi?

Yanıtlar:


136

Hayır, tırnak işaretleri bir fark yaratmaz (belirttiğiniz gibi, geçerli bir JavaScript tanımlayıcısı olmayan bir anahtar kullanmak istemiyorsanız).

Bir yan not olarak, JSON veri alış biçimi yapar tanımlayıcılar çift tırnak gerektiren (ve yok değil tek tırnak izin verin).


88
Aslında, tırnak olabilir bir özellik adı olarak bir sayısal hazır kullanıyorsa bir fark yaratır. Örneğin, obj = { 12e34: true };ile aynı değildir obj = { '12e34': true };. Birincisi obj['1.2e+35'], kullanacağınız ikincisi için tesise üzerinden erişmenizi gerektirir obj['12e34']. Daha fazla ayrıntı için cevabıma bakın.
Mathias Bynens

1
Doğru ama az ilk karakter + alfa-sayısal verilen çift tırnak isteğe bağlı olsaydı parlak olurdu ve oldukça bazı beyaz boşluk hayranları görünmez alanlar veya sekmeler olarak adlandırılabilir? derinden iç içe olmayan veriler için harika.
Jason Sebring

124

Gönderen Öncelenmemiş özellik adları / JavaScript Nesne anahtarları , benim yazma-up konuda:

Tırnaklar yalnızca özellik adı sayısal bir değişmezse veya geçerli bir tanımlayıcı adı ise atlanabilir .

[...]

Köşeli ayraç notasyonu tüm mülk adları için güvenle kullanılabilir.

[...]

Nokta gösterimi yalnızca özellik adı geçerli bir tanımlayıcı adı olduğunda kullanılabilir.

Ayrılmış kelimelerin ES5'te alıntılanmamış özellik adları olarak kullanılmasına izin verildiğini unutmayın. Ancak, ES3 ile geriye dönük uyumluluk için, onları yine de alıntılamayı öneririm.

Ayrıca, herhangi bir özellik adının tırnak işaretleri olmadan ve / veya nokta gösterimi ile kullanılıp kullanılamayacağını anlatacak bir araç yaptım. Mothereff.in/js-properties adresinde deneyin .

Ekran görüntüsü


Bu araç hayat kurtarıcıydı. Bunu gönderdiğiniz için teşekkürler.
Chris Christensen

Bir uçurumdan iniyordum, çok dik bir yokuştan aşağı düşmek üzereydim, belirli, mutlak, kanlı bir ölüme doğru toplanıyordum; ama ne yazık ki, cevabınızda çok basit bir JS aracı olan bir bağlantıyı tıkladım, bu uçurumdan düşmemi engelledi. Bu araç hayat kurtarıcıydı.
Andrew

8

Burada bir fark yok. Sadece bir tarz meselesi. Bunu yapmanın nedenlerinden biri, 'süper' veya 'sınıf' ı anahtar olarak kullanabilmeleridir, çünkü bunlar ayrılmış anahtar kelimelerdir.

Bazı insanlar boşluk içeren bir dizeye geçmeye cazip gelebilir ve o ['boşluk alabilirim'] deyin. Ama ben buna kötü uygulama diyebilirim.


3

Hayır, javascript için değil. Ancak, bazı JSON ayrıştırıcıları, anahtarların etrafındaki tırnak işaretleri bulunmadığında başarısız olur.


35
Tırnak işaretleri olmayan anahtarlar JSON'da geçersiz.
Ned Batchelder

1

Farklı oldukları bazı durumlar vardır. Örneğin, jQuery kullanıyorsanız ve bir öğe oluşturmak için jQuery $ () komutunu çağırırken geçirilecek parametrelerin bir listesini yapıyorsanız, tırnak içine alınmış kelimeler parametrelere ve tırnaksız kelimeler işlevlere dönüştürülür. Örneğin, "boyut", nesnenin boyut niteliğini ayarlar ve boyut (tırnak işaretleri olmadan), nesne üzerindeki boyut () işlevini çağırır. En alttaki jQuery () işlevine bakın :

İkinci argüman uygun olsa da, esnekliği istenmeyen <input>boyutlara neden olmak yerine .size () yöntemini çağırmak gibi istenmeyen sonuçlara (ör. $ (" ", {Size: "4"}) yol açabilir. Böylece önceki kod bloğu aşağıdaki gibi yazılabilir:


Bu örneğin söylediklerini söylediğini sanmıyorum. Alıntıladığınız sorun, jQuery'nin boyut adı verilen bir yöntemi olması ve yöntem boyutu ile öznitelik boyutu arasındaki çakışma, yöntem seçilerek çözülmesidir. JQuery'de, bir değeri dize veya başka bir tür olarak geçirmenin davranışta bir değişikliğe neden olduğu, ancak tırnak içinde değil, tırnak içinde geçerli bir özellik adına sahip bir özelliği tanımlamaması gereken durumlar vardır.
Alex Weitzer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.