Статьи

JavaScript Quiz # 4

Понимание 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). »