Можно ли использовать пустую строку в качестве идентификатора объекта?
Я искал объекты и, казалось бы, у вас может быть '' (пустая строка) как имя свойства, например:
o = {
'': 'hello',
1: 'world',
'abc': ':-)',
};
console.log(o['']);
Кажется, все работает отлично, однако мне любопытно узнать, что действительно ли это действительно?. Я ткнул в спецификацию ECMA и спросил наших знакомых друг друга вариантов Google вопроса и мой вывод состоит в том, что я не знаю.
Мои источники
http://www.jibbering.com/faq/faq_notes/square_brackets.html
Ответы
Ответ 1
Да, технически это полностью действует, и вы можете безопасно его использовать. Ключ объекта должен быть "строкой", которая не исключает пустую строку.
Если это удобно и полезно, это еще одна история.
См. Должен ли я использовать пустой ключ свойства?
Так как "пустая строка" является одним из falsy values
в ecmascript, рассмотрим следующий пример:
var foo = {
':-)': 'face',
'answer': 42,
'': 'empty'
};
Object.keys( foo ).forEach(function( key ) {
if( key ) {
console.log(key);
}
});
Этот фрагмент будет записывать только :-)
и answer
. Так что это одна ошибка для этого.
Ответ 2
Кажется прекрасным ((*)
применимо к вашему делу):
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}
не является.
Ответ 3
Сегодня я столкнулся с проблемой в Chrome 33.0.1750.146.
obj = {
...
"": "some text",
...
};
...
var a = "";
if (typeof obj[a] == 'undefined') {
...
}
Когда я отлаживаю или выполняю это script, условие всегда "True". Но если я пытаюсь проверить значение (typeof obj [a] == 'undefined') в консоли, я всегда получаю "False".
Было очень трудно найти неприятности. И я думаю, вы не должны использовать пустые ключи (и меня тоже).