2012-01-06 57 views
27

我一直在擺弄的對象,看似你可以有「」(空字符串)作爲屬性名稱,像這樣:我可以使用空字符串作爲對象標識符嗎?

o = { 
    '': 'hello', 
    1:  'world', 
    'abc': ':-)', 
}; 
console.log(o['']); 

似乎工作得很好,不過我很好奇,想知道, 這真的有效嗎?我捅了ECMA規格,並要求我們的知識淵博的朋友谷歌變異的問題和我的結論是,我不知道

我的消息來源

http://www.jibbering.com/faq/faq_notes/square_brackets.html

+1

我認爲它是有效的,因爲它也是一個字符串,所以不管字符串是否包含某些內容。但我認爲這不是依靠這樣的事情,因爲最終有一天這可能會改變...... – evotopid 2012-01-06 11:34:28

回答

21

是的,理論上其完全有效的,你可以放心地使用它。對象鍵需要是一個「字符串」,它不排除空字符串。

如果這是方便和有用的是另一回事。

Should I use an empty property key?


因爲 '空字符串' 是ECMAScript中的falsy values之一,請看下面的例子:

var foo = { 
    ':-)': 'face', 
    'answer': 42, 
    '': 'empty' 
}; 

Object.keys(foo).forEach(function(key) { 
    if(key) { 
     console.log(key); 
    } 
}); 

片斷代碼將只記錄:-)answer。所以這是做這件事的一個陷阱。

+0

非常真實,如屬性數字0 – oodavid 2012-01-06 11:45:04

+1

這是有點人爲的,因爲無/如果(鍵)它記錄所有有問題的屬性 – OnTheFly 2012-01-06 11:46:05

+3

@oodavid:infact,'0'不會成爲問題。由於所有對象鍵都是**字符串**,結果將爲「0」,這也不是虛假值。 – jAndy 2012-01-06 11:46:44

4

Seems fine(在(*)適用於您的情況):

PropertyAssignment : 
    (*) PropertyName : AssignmentExpression 
    get PropertyName () { FunctionBody } 
    set PropertyName (PropertySetParameterList) { FunctionBody } 

PropertyName : 
    IdentifierName 
    (*) StringLiteral 
    NumericLiteral 

StringLiteral :: 
    " DoubleStringCharacters opt " 
    (*) ' SingleStringCharacters opt ' 

由於字符是可選的,一個空字符串是有效的。

只需注意IdentifierName(即沒有0​​或")不允許爲空字符串:

IdentifierName :: 
    IdentifierStart 
    IdentifierName IdentifierPart 

IdentifierStart :: 
    UnicodeLetter 
    $ 
    _ 
    \ UnicodeEscapeSequence 

所以,{'': 123}是有效的,而{: 123}不是。

0

今天我在Chrome 33.0.1750.146遇到了麻煩。

obj = { 
    ... 
    "": "some text", 
    ... 
}; 
... 
var a = ""; 
if (typeof obj[a] == 'undefined') { 
    ... 
} 

當我調試或執行此腳本時,條件始終爲「真」。但如果我試圖檢查(typeof obj [a] =='undefined')在控制檯中的值,我總是會得到「False」。 這很難找到麻煩。我認爲你不必使用空鍵(也是我)。

+0

至少在36.0.1985.125中不會發生) – 2014-08-09 21:25:54

相關問題