2017-01-22 2 views
1

Когда играл с 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 не имеет смысла, как деление на последней строке, то она интерпретируется как регулярное выражение.

Очевидно, что символ / получает специальное обращение, чтобы различать деление и регулярные выражения. Но тогда почему ++ и -- не получают особой обработки? (Т. Е. Внешний оператор)

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

ответ

2

В коде a++++b у вас есть два отличных отчёта: a++ и ++b ни с чем не сочетать их. Оператор + в контексте a++ + +b фактически представляет собой преобразователь типа (предназначенный для преобразования строк в числа) и имеет другой order of precedence, который следует за другими в списке.

+1

Да, '+' также используется для "casting" - например '+" 10 "' преобразует этот тип 'string' в тип' number' – iSkore

+0

@CoryG Не могли бы вы рассказать о своем ответе? Я не понимаю, как это отличается от того, что я уже обсуждал в своем вопросе. – TrenchCode

+0

@TrenchCode Извините, если я был кратким, я писал синтаксический анализатор, токенизатор и абстрактную синтаксическую древовидную систему для пользовательского языка, который очень сильно моделировался с JS в течение последних нескольких месяцев, поэтому я склонен считать само собой разумеющимся, сколько PitA это было сначала обернуть голову вокруг приоритета. JS предназначен для анализа на ходу очень быстро, в результате у вас нет четкого приоритета, как на многих других языках, этот список примерно так же хорош, как и без просеивания через спецификацию. Такие вещи, как '//' комментарии и преобразователи типа '+', анализируются до и после этого всего списка (продолжение) – CoryG

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