2012-03-13 26 views
18

Javascript nesneleri harita olarak kullanılabilir. ... yanlışGeçerli bir javascript özellik adı null mı?

var x = {}; 
x.a = 1; 
x['b'] = 2; // the same as x.b = 2; 
x[3] = 3; // x.3 won't work, but this syntax works fine. Also, x[3] == x['3']. 
x['What, this works too?!?!?'] = 'Yup, it does!'; 

Ama bugün ... iş gibi görünüyor bir dava test, ama anlaşıldığından kafamda bazı uyarı bayrakları yükseltir: Aşağıdaki tüm geçerli bir koddur

x[null] = 42; 

Şimdi, beklendiği gibi çalışsaydı (o zamanlar bir sürü kodu tekrar yazmam gerekmeyecek) çok havalı olurdu, ama buna güvenebilir miyim? Ya da belki de bu sadece tüm modern tarayıcılarda çalışmak için olan bazı belgelenmemiş davranışlardır, ancak bir sonraki Google Chrome sürümünde çalışmayı bırakabilir mi?

+1

Dizin oluşturma argümanı, herhangi bir işlem gerçekleştirilmeden önce bir dizeye dönüştürülür. Son görevinizden sonra console.log (x ["null"]) 'ı deneyin. “3” altyazısıyla uğraşırken fark ettiniz. –

+1

Ayrıca eğlenceli: 'x [x] = 1 ', teknik olarak x' '[object Object]']' olarak indekslenir ve x [{}] 'ile aynı değer. Ve başka insanlardan nefret ederseniz: 'x [x [x]] = 2'. – Deestan

cevap

17

şey bir dizeye dönüştürülür. null, geçerli bir özellik olan "null" olur. Bir yanıt yarattı yüzden yorum yapamaması

+0

George, haklısın! Harika, benim için çalışıyor! :) –

+1

@ Vilx- PS. 'var d = {}; d [{}] = 1; JSON.stringify (d)' '{" [object Object] ":" "}' ve 'var x = {}; x [{toString: fonksiyonunu gösterir.() {return 123}}] = 1; Object.keys (x) '123’ü içerir. –

+0

Ayrıca, null'un dize temsiline sahip olduğu hakkında derin bir tartışma için http://stackoverflow.com/a/10362142 adresine bakın. – bebbi

0
x['null'] = 42; 

Şaşkınlıktan kaçınmak için yine de şiddetle tavsiye ediyorum.

Özellik adları dizelerdir. Her dizge, ayrılmış tanımlayıcıları temsil edenler bile çalışır. (Nesnenin toString() yöntemini çağırarak) bir dize bir dizeye dönüştürülecektir değil

herşey: özelliği destekleri arasındaki

a = ['FOO']; // an array 
o = {};  // an object 
o[a] = 'foo'; // using a as the property name 

// o now is: 
{ 
    FOO: 'foo' 
} 
+0

Benim durumumda, indeksler bir özel "boş" indeksi hariç, sayısal. Bunun bir karışıklığa neden olacağını sanmıyorum. –

+0

Eh, 'undefined' yeniden tanımlamak gibi kokuyor. Sayısal indeksler de sokağa dönüştürülür. – Tomalak

+0

Hm? Ben hiçbir şeyi yeniden tanımlamıyorum. Sanki ... bir sürü veri nesnesi var ve onları özelliklerinden biri ile gruplandırmam gerekiyor (bu özellik aslında DB'de bir sayısal kimlik). Bugün, başka bir veri kaynağından veri eklemem gereken bir durumla karşılaştım, ancak bu kaynaktan gelen veri nesneleri bu mülk için bir kimlik içermiyor. Orijinal eşyaların oluşturduğu gruplara ait değiller, aksine hepsine aittirler. Yani bu nesneleri işaretlemek için özel bir değere ihtiyacım var ve null hoş bir uyum gibi görünüyor. –

-1

...

Rob W onun cevabı doğru olsa biraz yanıltıcı. Köşeli parantezler arasındaki öğe, ToString() kullanılarak bir dizeye dönüştürülür. Yani, bir [boş] sadece eşit bir [ 'sıfır'] ToString (null) örneğin == 'sıfır'

almak

var a = 1; 
var x = {} 

x[a] = 20; 
x['1'] = 30; -- this is exactly the same as the previous line and now x[a] == 30 
1

Bu geçerli ECMAScript 5, ama sorunlar yaratmaya çünkü Internet Explorer'ın bazı sürümleri.

Bu

hepsi iyi:

x.null 
// Error: Expected identifier 

x = {null: 42} 
// Expected identifier, string or number 

(Chrome'da yukarıdaki çalışmanın Hem bile:

x = {}; 
x[null] = 42; 
x[null]; 
// 42 

x = {"null": 42}; 
x[null]; 
// 42 

Ancak IE8 ayrılmış tür null sözlerle aşağıdaki kabul etmez "use strict" etkin.)

0

Ortamınız ES6'yı destekliyorsa ve null için bir değer depolayabilmeniz gerekiyorsa herhangi bir keyfi dizenin yanı sıra Map'u kullanabilirsiniz.

const a = new Map(); 

a.set(null, 'foo') 
a.set('null', 'bar') 

// Map { null => 'foo', 'null' => 'bar' } 
İlgili konular