我可以使用空字符串作为对象标识符吗?

ood*_*vid 32 javascript json

我一直在修补对象,看起来你可以将'(一个空字符串)作为属性名称,如下所示:

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

似乎工作得很好,但我很想知道,这真的有效吗?我已经戳了ECMA的规格,并问我们知识渊博的朋友谷歌的问题变化,我的结论是我不知道.

我的消息来源

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

jAn*_*ndy 27

是的,从技术上讲它完全有效,你可以安全地使用它.对象键需要是"字符串",不排除空字符串.

如果那是方便的,甚至是有用的另一个故事.

请参阅我应该使用空属性键吗?


由于'空字符串'是falsy valuesecmascript中的一个,请考虑以下示例:

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

Object.keys( foo ).forEach(function( key ) {
    if( key ) {
        console.log(key);
    }
});
Run Code Online (Sandbox Code Playgroud)

该片段只会记录:-)answer.这样做是一个陷阱.

  • @oodavid:事实上,`0`不会有问题.由于所有对象键都是**字符串**,结果将是"0",这也不是虚假值. (3认同)
  • 这有点人为,因为没有if(key)它会记录所有相关属性 (2认同)

pim*_*vdb 5

看起来不错(*)适用于您的情况):

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

PropertyName :
    IdentifierName
    (*) StringLiteral
    NumericLiteral

StringLiteral ::
    " DoubleStringCharacters opt "
    (*) ' SingleStringCharacters opt '
Run Code Online (Sandbox Code Playgroud)

由于字符是可选的,因此空字符串是有效的。

请注意IdentifierName(即没有'or ")不允许空字符串:

IdentifierName ::
    IdentifierStart
    IdentifierName IdentifierPart

IdentifierStart ::
    UnicodeLetter
    $
    _ 
    \ UnicodeEscapeSequence
Run Code Online (Sandbox Code Playgroud)

因此,{'': 123}有效而{: 123}无效。