В каком порядке выполняется следующий оператор? Выполняет ли это выполнение справа налево?Порядок Javascript для ссылок
length = i = test = output = null;
В каком порядке выполняется следующий оператор? Выполняет ли это выполнение справа налево?Порядок Javascript для ссылок
length = i = test = output = null;
Да, так как assignment expression не lefthand-side expression сам, то вложенности
(length = (i = (test = (output = null))));
Он выполнен из внешних в, решая ссылки слева направо (сначала получает переменную length
, а затем оценивает правую сторону, которая получает переменную i
и оценивает ...). Это означает, что output
- это первая переменная, которой присваивается значение, затем test
, затем i
и последние length
: «справа налево», если хотите. Поскольку оператор присваивания всегда дает свой правый операнд, всем будет присвоено то же самое (самое внутреннее, самое правое) значение: null
.
Это правильный ответ. Еще лучше, что вы связались со спецификацией. – zzzzBov
Да, это выполняется справа налево. Значение всего теперь равно нулю.
Это единственное назначение линии эквивалентно этому
output = null;
test = output;
i = test;
length = i;
Выполняет ли это выполнение справа налево?
Да.
foo = {
set a() {
console.log('a');
},
set b() {
console.log('b');
},
set c() {
console.log('c');
},
set d() {
console.log('d');
}
};
foo.a = foo.b = foo.c = foo.d = 'bar';
производит:
d
c
b
a
в консоли. Такой порядок необходим, потому что каждое задание зависит от возвращаемого значения предыдущего присвоения:
foo.a = foo.b = foo.c = foo.d = 'bar';
эквивалентно:
foo.a = (foo.b = (foo.c = (foo.d = 'bar')));
Однако это не эквивалентно:
foo.d = 'bar';
foo.c = foo.d;
foo.b = foo.c;
foo.a = foo.b;
Возвращаемое значение a = b
- b
. Это особенно важно помнить, если вы решите внедрить аксессоры и мутаторы.
Что это означает, что мой предыдущий пример эквивалентно:
foo.d = 'bar';
foo.c = 'bar';
foo.b = 'bar';
foo.a = 'bar';
Как бы вы проверить, в каком порядке это выполняется? (Или это действительно глупый вопрос, извините, это был очень длинный день (и ночь) ...) –
На самом деле нет способа «проверить» порядок, в котором они выполняются. Вы можете открыть консоль javascript (возможно, нажав Ctrl + Cmd + Shift + I в своем браузере прямо сейчас) и вставьте вышеуказанный код. Затем, когда вы проверили значения каждой переменной, вы найдете их равными нулю. Интересно, так как существует только один оператор («=»), и поскольку он работает справа налево, единственный способ, которым это могло бы работать, - быть справа налево, в противном случае все будет иметь значение длины, включая null ... чего ждать? –
Это было мое предположение, но я предполагал, что мне что-то не хватает (возможно) очевидно ... –