Youtube использует «default» в качестве имени для свойства объекта - PullRequest
3 голосов
/ 27 мая 2011

Я использую json api на YouTube для создания нового месива.
Где-то в ответе вы можете найти следующее:

{
"player":
  {
  "default":"http://www.youtube.com/watch?v\u003deH5Iysm417U"
  }
}

Я всегда учился не использовать слова, упомянутые в разделе зарезервированных слов стандарта ECMAScript , в качестве идентификаторов. Так что, насколько я знаю, нельзя использовать имя «default» в качестве имени свойства. Почему Youtube это делает?

player.default

Если честно, приведенный выше код прекрасно работает в браузере. Но мне пришлось изменить его на код ниже, чтобы не было ошибок компиляции при использовании компилятора Google Closure.

player["default"]

Это просто неправильно.
Самый важный вопрос здесь, могу ли я что-нибудь с этим сделать?

Ответы [ 2 ]

6 голосов
/ 27 мая 2011

Identifier - это не то же самое, что PropertyName.

PropertyName нужно только не состоит из зарезервированных слов при объявлении без кавычек. При объявлении в кавычках все строки являются действительными, даже " ".

Вот список действительных производств:

 PropertyName :    
     Identifier    
     StringLiteral    
     NumericLiteral

http://www.ecma -international.org / публикации / файлы / ECMA-ST-ARCH / ECMA-262,% 203rd% 20edition,% 20 декабря декабрь% 201999.pdf , 11.1.15

Вы не можете изменить ответ от Youtube, и, хотя в player.default нет ничего плохого, вам просто нужно использовать аксессор [], если вы хотите избежать этой ошибки в компиляторе закрытия.

Но на самом деле это ошибка компилятора, а не javascript.

1 голос
/ 27 мая 2011

Компилятор может пометить это из-за проблем совместимости между браузерами.

Недавно я столкнулся с тем же и с default, и с extends при создании библиотеки шаблонов, в которой вместо синтаксического анализа используется кодтекст.Код работал просто отлично, но компилятор Closure жаловался на эти ключевые слова при использовании в качестве свойств ... затем я попробовал это в IE:

>>> var o = {default: 'test'}
SyntaxError: Expected identifier, string or number
>>> var o = {'default': 'test'}
>>> o.default
SyntaxError: Expected identifier
...