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

Can I use an empty string as an object identifier?

本文关键字:字符串 对象标识符 一个 可以使 我可以      更新时间:2023-09-26

我一直在修改对象,似乎可以将"(一个空字符串)作为属性名,如下所示:

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

看起来工作得很好,但我很好奇,这真的有效吗我研究了ECMA的规格,并向我们知识渊博的朋友谷歌询问了这个问题的变体,我的结论是我不知道

我的来源

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

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

如果这很方便,甚至有用,那就另当别论了。

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


由于"空字符串"是ecmascript中的falsy values之一,请考虑以下示例:

var foo = {
    ':-)': 'face',
    'answer': 42,
    '': 'empty'
};
Object.keys( foo ).forEach(function( key ) {
    if( key ) {
        console.log(key);
    }
});

该片段将只记录:-)answer。所以这是做这件事的一个陷阱。

看起来不错((*)适用于您的案例):

PropertyAssignment :
    (*) PropertyName : AssignmentExpression
    get PropertyName ( ) { FunctionBody } 
    set PropertyName ( PropertySetParameterList ) { FunctionBody }
PropertyName :
    IdentifierName
    (*) StringLiteral
    NumericLiteral
StringLiteral ::
    " DoubleStringCharacters opt "
    (*) ' SingleStringCharacters opt '

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

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

IdentifierName ::
    IdentifierStart
    IdentifierName IdentifierPart
IdentifierStart ::
    UnicodeLetter
    $
    _ 
    ' UnicodeEscapeSequence

因此,{'': 123}是有效的,而{: 123}不是。