Понимание JavaScript на примере полезно для быстрого освоения различных концепций языка. В этом тесте я проиллюстрирую, как операторы JavaScript работают вместе. Предположим, что у нас есть следующий код JavaScript:
var object1 = {
valueOf: function () {
return 1;
},
toString: function () {
return "object1";
}
};
var object2 = {
valueOf: function () {
return 2;
},
toString: function () {
return "object2";
}
};
alert((object2 > object1 +-- object1) + true); //What is the output of the alert?
Вопрос : каков вывод предупреждения?
* Напишите свой ответ на листе бумаги, а затем прочитайте ответ. *
Ответ:
Вывод предупреждения 2 . Чтобы понять, почему мы имеем такой результат, мы должны знать, как различные операторы JavaScript работают вместе. Давайте проанализируем этот тест.
В следующем выражении:
(object2 > object1 +-- object1) + true
У нас есть две основные части: первая часть — это выражение в скобках, а вторая — логический true
операнд. Посмотрим, как будет оцениваться первая часть.
object2 > object1 +-- object1
В этом выражении у нас есть три основных оператора:
1.> оператор.
2. + оператор.
3. — префиксный оператор.
Порядок выполнения будет следующим:
1. — префиксный оператор.
2. + оператор.
3.> Оператор.
Чтобы получить полный список приоритетов операторов, проверьте https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence .
Порядок выполнения означает, что оценка выражения начнется с:
-- object1
Будет применен оператор префикса object1
, в результате чего будет вызван valueOf
метод object1
, что означает, что результатом будет 1 — 1 = 0.
Затем оценка продолжается, добавляя object1
к предыдущему результату:
object1 + 0
valueOf
Метод object1
вызывается снова, что означает , что результат будет 1 + 0 = 1.
Тогда сравнение будет выполнено следующим образом:
object2 > 1
Чтобы выполнить сравнение, вызывается valueOf
метод object2
, что означает, что результатом будет 2> 1 = true.
Тогда, наконец, у нас будет следующее:
true + true
Согласно Ecma-262, если у нас есть арифметический оператор плюс, и ни один из его операндов не имеет типа String
, тогда оба операнда будут преобразованы в числа, и операция сложения будет выполнена. В JavaScript, когда true
конвертируется в число, результат будет 1 (а false
конвертируется в 0).
Исходное правило сложения в соответствии со спецификацией Ecma-262 для справки выглядит следующим образом:
«Оператор сложения выполняет либо конкатенацию строк, либо числовое сложение.
Производство AdditiveExpression: AdditiveExpression + MultiplicativeExpression оценивается следующим образом:
1. Пусть lref будет результатом оценки AdditiveExpression.
2. Пусть lval будет GetValue (lref).
3. Пусть rref будет результатом вычисления MultiplicativeExpression.
4. Пусть rval будет GetValue (rref).
5. Пусть lprim будет ToPrimitive (lval).
6. Пусть rprim будет ToPrimitive (rval).
7. Если Тип (lprim) равен String или Тип (rprim) равен String, то
a. Вернуть строку, которая является результатом конкатенации ToString (lprim), за которой следует ToString (rprim)
8. Вернуть результат применения операции сложения к ToNumber (lprim) и ToNumber (rprim). »