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

时间:2012-01-06 11:31:45

标签: javascript json

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

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

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

我的来源

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

3 个答案:

答案 0 :(得分:24)

是的,从技术上讲它完全有效,你可以安全地使用它。对象键必须是“字符串”,不排除空字符串。

如果这很方便,甚至是有用的另一个故事。

请参阅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。所以这是做这件事的一个陷阱。

答案 1 :(得分:4)

Seems fine(*)适用于您的情况):

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}则无效。

答案 2 :(得分:0)

今天我在Chrome 33.0.1750.146中遇到了麻烦。

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

当我调试或执行此脚本时,条件始终为“True”。但是,如果我试图在控制台中检查(typeof obj [a] =='undefined')的值,我总是得到“假”。 很难找到麻烦。而且我认为你不必使用空键(我也是)。