Подтвердить что ты не робот

Можно ли использовать пустую строку в качестве идентификатора объекта?

Я искал объекты и, казалось бы, у вас может быть '' (пустая строка) как имя свойства, например:

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

Кажется, все работает отлично, однако мне любопытно узнать, что действительно ли это действительно?. Я ткнул в спецификацию ECMA и спросил наших знакомых друг друга вариантов Google вопроса и мой вывод состоит в том, что я не знаю.

Мои источники

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

4b9b3361

Ответ 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". Было очень трудно найти неприятности. И я думаю, вы не должны использовать пустые ключи (и меня тоже).