Когда играл с JavaScript синтаксиса он ударил меня, что следующий код будет сгенерировано сообщение об ошибке в двигателях Spidermonkey и V8:Однозначного приращение и добавление приводит к ошибке
var a = 1, b = 1;
a++++b;
Для меня это странно, так как в следующих работах прекрасно:
var a = 1, b = 1;
a+++b; // = 2; (Add a and b, then increase a)
// now a == 2 and b == 1
a+++-b; // = 1; (add a and -b, then increase a)
// now a == 3 and b == 1
Кроме того, следующий будет бессмысленный код:
var a = 1, b = 1;
a++ ++b; // throws an error
Мой аргумент теперь, что если a+++b
эквивалентно a++ + b
, а не a+ ++b
и a+++-b
эквивалентно a++ + -b
, то a++++b
можно интерпретировать только как a++ + +b
для того, чтобы быть действительным кодом JavaScript. Вместо этого двигатели настаивают на том, что a++++b
интерпретируется как a++ ++b
, по operator precedence.
Это для меня отличие от логики, которую двигатели реализуют с помощью символа /
, as explained here, чтобы различать деление и регулярные выражения. Пример
var e = 30, f = 3, g = 2;
e/f/g; // == 5
e
/f/g; // == 5
/f/g; // is equivalent to new RegExp("f","g")
Здесь аргумент состоит в том, потому что /f/g
не имеет смысла, как деление на последней строке, то она интерпретируется как регулярное выражение.
Очевидно, что символ /
получает специальное обращение, чтобы различать деление и регулярные выражения. Но тогда почему ++
и --
не получают особой обработки? (Т. Е. Внешний оператор)
Второй вопрос: почему приоритет оператора не называется только, когда код имеет несколько действительных интерпретаций.
Да, '+' также используется для "casting" - например '+" 10 "' преобразует этот тип 'string' в тип' number' – iSkore
@CoryG Не могли бы вы рассказать о своем ответе? Я не понимаю, как это отличается от того, что я уже обсуждал в своем вопросе. – TrenchCode
@TrenchCode Извините, если я был кратким, я писал синтаксический анализатор, токенизатор и абстрактную синтаксическую древовидную систему для пользовательского языка, который очень сильно моделировался с JS в течение последних нескольких месяцев, поэтому я склонен считать само собой разумеющимся, сколько PitA это было сначала обернуть голову вокруг приоритета. JS предназначен для анализа на ходу очень быстро, в результате у вас нет четкого приоритета, как на многих других языках, этот список примерно так же хорош, как и без просеивания через спецификацию. Такие вещи, как '//' комментарии и преобразователи типа '+', анализируются до и после этого всего списка (продолжение) – CoryG