Страницы

Поиск по вопросам

Показаны сообщения с ярлыком browser. Показать все сообщения
Показаны сообщения с ярлыком browser. Показать все сообщения

понедельник, 28 января 2019 г.

console.log('hello',)

Не знал как назвать, кто придумает по умнее, буду признателен. Проблема в том, что PhpStorm не подчеркнул и я упустил из виду:
console.log('hello',)
Данная конструкция роняла сайт на windows машинах, когда на mac все работало. Не знаю как искать, но как по спецификации, допускается ли такое?
По мне дак вполне нормально, вторая переменная undefined


Ответ

Давайте откроем стандарт языка ECMA-262 7-редакция от июня 2016
Смотрим как вызываются у нас функции 12.3.4 Function Calls
Как видим при вызове функции ей передается объект Arguments. Который определяется следующим образом.
Arguments[Yield] : ( ) ( ArgumentList[?Yield] )
То есть он может быть либо пустым, либо передаваться как ArgumentList
ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression
Как видим список состоит из значений AssignmentExpression, которые разделены запятыми. Тут начинается самое сложное в стандарте, так как AssignmentExpression это целая куча различных вариантов значений.
AssignmentExpression: ConditionalExpression YieldExpression ArrowFunction LeftHandSideExpression LeftHandSideExpression AssignmentOperator AssignmentExpression
AssignmentOperator : one of *= /= %= += ‐= <<= >>= >>>= &= ^= |= **=
То есть мы может указывать просто кучу всяких видов параметров: условные выражения, стрелочные функции, различные комбинации выражений, итераторы и многое другое. Но в общем-то нас интересует простейший вариант: LeftHandSideExpression
LeftHandSideExpression: NewExpression CallExpression
Дальше идет целая вакханалия ссылок. Но в итоге все сводится либо к различным выражениям, либо в нашем случае к простейшим IdentifierName и Identifier. А они в свою очередь имеют такое определение:
IdentifierName :: IdentifierStart IdentifierName IdentifierPart
IdentifierStart :: UnicodeIDStart $ _ \ UnicodeEscapeSequenc
То есть в любом случае должны быть хотя бы одна буква Юникода и таким образом AssignmentExpression не может состоять из пустоты. Там обязательно должно идти хоть что-то, иначе было бы в стандарте AssignmentExpression помечен опционально (opt) для ArgumentList
P.S. - И пусть потом кто-то попробует сказать, что стандарты это легко.