'5' - 3 === 2 // (1)
'5' + 3 === '53' // (2)
'5' - '4' === 1 // (3)
'5' + + '5' === '55' // (4)
'foo' + + 'foo' === 'fooNaN' // (5)
'5' + - '2' === '5-2' // (6)
'5' + - + - - + - - + + - + - + - + - - - '-2' === '52' // (7)
let x = 3;
'5' + x - x === 50 // (8)
'5' - x + x === 5 // (9)
- Оператор
- является числовым, строка '5' переводится в число и получается 5 - 3.
- Оператор
+ используется для строковых и математических операций, он имеет левую ассоциативность, и из-за этого 3 становится строкой и получается '5' + '3'.
- Оператор
- является числовым, строки преобразуются в числа, и получается 5 - 4.
- Приоритет у операторов
+ одинаковый, из-за этого происходит следующее: берётся первая часть '5' + и ожидается результат вычисления + '5' (перевод строки в число). Получается '5' + 5, что в итоге даёт 55.
- Идея такая же, как и в предыдущем выражении, но тут во второй части
+ 'foo' происходит попытка преобразовать 'foo' в число, что даёт NaN.
- Всё тот же принцип, но в этом примере вторая часть
- '2' преобразовывается в число -2. В итоге получается '5' + -2 = '5-2'.
- Сначала идёт строка
'5', к которой добавляется результат вычисления следующего за ней выражения. В нём идут унарные операторы + и -. Унарный + просто приводит строку в число, а унарный - приводит строку в число и меняет знак на противоположный. То есть унарный + в данном выражении можно не учитывать, а просто посчитать количество - - выходит 11 знаков, что является нечётным числом и в конечном итоге даёт один - (если бы было чётное число, то был бы +). Далее вычисляем - '-2' и получаем в итоге '5' + 2 = '52'.
'5' + 3 = '53' строковое сложение, далее '53' - 3.
'5' - 3 = 2 математическое вычитание, далее 2 + 3.