Страницы

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

суббота, 4 января 2020 г.

console.log('hello',)

#javascript #windows #console #браузер


Не знал как назвать, кто придумает по умнее, буду признателен.
Проблема в том, что PhpStorm не подчеркнул и я упустил из виду:

console.log('hello',)

Данная конструкция роняла сайт на windows машинах, когда на mac все работало.
Не знаю как искать, но как по спецификации, допускается ли такое?  

По мне дак вполне нормально, вторая переменная undefined.
    


Ответы

Ответ 1



Давайте откроем стандарт языка 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. - И пусть потом кто-то попробует сказать, что стандарты это легко.

Комментариев нет:

Отправить комментарий