我一直在修补对象,似乎你可以将'(一个空字符串)作为属性名称,如下所示:
o = {
'': 'hello',
1: 'world',
'abc': ':-)',
};
console.log(o['']);
似乎工作得很好,但是我很想知道,这真的有效吗?我已经戳了ECMA的规格,并问我们知识渊博的朋友谷歌的问题变体和我的结论是我不知道。
我的来源
答案 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')的值,我总是得到“假”。 很难找到麻烦。而且我认为你不必使用空键(我也是)。