2013-03-12 5 views
0

У меня есть вопрос, который действительно прослушивал меня довольно долгое время, и я не могу найти ресурсы, которые охватывают тему. Как имена свойств в JavaScript должны быть строковыми литералами или числовыми литералами?Имена свойств в JavaScript

var obj = { 
    "bar": "foobar", 
    "foo": function() { return bar; } 
} 

Эта тема прослушивала меня с тех пор, как я узнал об этом несколько лет назад. Я не знаю, где получить более подробную информацию или что это даже называется. Я не смущен тем, как это настроено, поскольку я знаю, что с объектами создается новый объект, bar & foo, а затем его назначается переменной obj.

Вы не можете создать переменную типа var "bar" = "foobar"; потому что вы получите синтаксическую ошибку. Как это справедливо для объектных литералов? Любая помощь в этом была бы очень оценена.

+0

'var bar = 'foobar';' не может работать в вашем случае? – Raptor

+2

Вот как работает синтаксис. – SLaks

+0

Синтаксис 'obj ['property']' требует этого. –

ответ

7

В JavaScript, имена свойств Строка значения - любая Струнные значения. Именно так задан язык.

Соответствующая продукция:

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

Если идентификатор или числовой литерал подается, он преобразуется в значение строки (SV).

См: http://ecma-international.org/ecma-262/5.1/#sec-11.1.5

Так, например:

var obj = { 
    foo: true, // the name of this property becomes 'foo' 
    'bar': true, // the name of this property becomes 'bar' 
    123: true // the name of this property becomes '123' 
}; 

Вы даже можете использовать пустую строку в качестве имени свойства:

var obj = { 
    '': 'foo' 
}; 

obj[''] // 'foo' 
+0

Я думаю, что ты что-то делаешь. Я пытаюсь понять это лучше. Имена свойств автоматически принимаются как строковые значения независимо от того, передаете ли вы идентификатор, который он будет автоматически указывать языком. Почему вы всегда указываете свойства при записи jSON? Это из-за того, как другие языки читают его? – W3Geek

+0

@ W3Geek Если вы предоставите идентификатор, в качестве имени свойства будет использовано его соответствующее строковое значение. Здесь нет кавычек, поскольку кавычки существуют только в строковых * литералах * (исходный код), тогда как здесь идентификатор преобразуется в строку * значение * (память) напрямую. *** JSON более ограничительна по разным причинам. –

2

Буквы объектов JavaScript являются реализациями хэш-карт: т. Е. Парами ключ-значение. Клавиши могут быть представлены либо в кавычках, либо без кавычек.

Тем не менее, если вы хотите получить доступ к свойству в виде строки, используйте приведенный ниже синтаксис:

obj[str]

Но если вы хотите получить доступ к свойству по его имени, вы используете

obj.name

1

Для того, чтобы увидеть, что это абсолютно справедливо, вам просто нужно вспомнить, что объекты являются ассоциативными массивами, то есть

foo.bar === foo['bar'] 

В этом случае ключи ассоциативного массива представляют собой любые строки.

2

Литеральный синтаксис объекта, который вы используете is just part of JavaScript's syntax. Вы можете использовать числовой или строковый литерал как имя свойства, а также любое допустимое имя переменной в качестве имени свойства. Обратите внимание, что недопустимые имена переменных должны быть заключены в кавычки, но все равно могут быть именами свойств (числовые литералы являются исключением).

То есть у вас может быть obj = {'"': value}, т. Е. Цитата, как действительное имя свойства объекта. Однако, если вы остановились на апострофе, это будет синтаксическая ошибка.

Синтаксис имени переменной, например. {nameWithoutQuotes: "value"} разрешено, насколько я могу судить, для удобства. Он не имеет особого значения и рассматривается как имя свойства строки. Было бы очень странно иметь " всюду в определении литерала объекта, и это также имеет смысл при использовании аналогичного синтаксиса доступа. Например:

obj = {"with quotes": "q", withoutQuotes: "x"}; 
obj["with quotes"]; 
obj.withoutQuotes; 

Обратите внимание, что метод доступа с именем свойства, которое требует кавычек также требует кавычек, тогда как, когда кавычки не требуется доступ может быть сделано без них.

Что касается причины, почему "obj" = "string" не допускается, за исключением того факта, что это недействительный синтаксис, то есть потому, что литерал "obj" не создает ссылку в памяти, которой можно назначить. Обозначение obj = {} создает ссылку, которая хранится в obj, и память выделяется для каждого из ее свойств, как описано в синтаксисе литерала. Вы могли бы сделать подобное заявление о obj = "string";


Он также не может быть стоит ничего, что котировки не могут быть исключены из JSON строки для имен свойств. Многие парсеры этого не допустят.

+0

Я думаю, что многие парсеры не позволят этого, потому что идентификаторы в JavaScript предназначены строго для языка JavaScript ... если вы понимаете, что я имею в виду. – W3Geek

+0

Если какой-либо анализатор JSON допускает отсутствие котировок, этот анализатор не реализует стандарт JSON. –

Смежные вопросы