2012-01-06 58 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

相关问题