2013-08-28 2 views
1

В каком порядке выполняется следующий оператор? Выполняет ли это выполнение справа налево?Порядок Javascript для ссылок

length = i = test = output = null; 
+0

Как бы вы проверить, в каком порядке это выполняется? (Или это действительно глупый вопрос, извините, это был очень длинный день (и ночь) ...) –

+0

На самом деле нет способа «проверить» порядок, в котором они выполняются. Вы можете открыть консоль javascript (возможно, нажав Ctrl + Cmd + Shift + I в своем браузере прямо сейчас) и вставьте вышеуказанный код. Затем, когда вы проверили значения каждой переменной, вы найдете их равными нулю. Интересно, так как существует только один оператор («=»), и поскольку он работает справа налево, единственный способ, которым это могло бы работать, - быть справа налево, в противном случае все будет иметь значение длины, включая null ... чего ждать? –

+0

Это было мое предположение, но я предполагал, что мне что-то не хватает (возможно) очевидно ... –

ответ

6

Да, так как assignment expression не lefthand-side expression сам, то вложенности

(length = (i = (test = (output = null)))); 

Он выполнен из внешних в, решая ссылки слева направо (сначала получает переменную length, а затем оценивает правую сторону, которая получает переменную i и оценивает ...). Это означает, что output - это первая переменная, которой присваивается значение, затем test, затем i и последние length: «справа налево», если хотите. Поскольку оператор присваивания всегда дает свой правый операнд, всем будет присвоено то же самое (самое внутреннее, самое правое) значение: null.

+1

Это правильный ответ. Еще лучше, что вы связались со спецификацией. – zzzzBov

2

Да, это выполняется справа налево. Значение всего теперь равно нулю.

1

Это единственное назначение линии эквивалентно этому

output = null; 
test = output; 
i = test; 
length = i; 
+0

Хорошо, но как это ответить на вопрос? – j08691

+0

@ j08691: Я ожидаю, что этот многострочный скрипт станет более четким, каков порядок выполнения ... –

+0

Как это не отвечает на вопрос? – ps2goat

2

Выполняет ли это выполнение справа налево?

Да.

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'; 
Смежные вопросы