2014-11-18 7 views
3

Я написал следующий кодМассив Notation Порядок операций

o[s += "a"] = o[s += "b"] = o[s += "c"] = 0; 

мне было любопытно, почему переменная s заканчивается хранение «ABC», а не «СВА». Похоже, что код будет проще выполнять справа налево.

Кажется, что исполнитель выбирает и индексирует для хранения, а затем решает, что там происходит, но это делает звук медленнее, так как в стек будет столько состояний и памяти. Может кто-нибудь объяснить, почему это имеет смысл для выполнения кода в том порядке, который есть?

Я включил скрипку с несколькими примерами. http://jsfiddle.net/eggrdtuk/3/

+1

Я считаю, что утверждения между [], (например, при использовании '()') будут выполняться сначала, в том порядке, в котором его видит синтаксический анализатор. поэтому в конце вы получите 'o [" a "] = o [" ab "] = o [" abc "] = 0;' который затем будет выполняться справа налево. – Luke

+0

Я не уверен, что выполнение этого права слева направо, а не слева направо будет иметь смысл. Индексы должны вычисляться сначала, прежде чем он сможет выполнять любые задания. –

+0

@MattBurland Я думал, что это начнется с правой стороны, определит, что собирается хранить, тогда где, а не наоборот ... я бы подумал, что есть значительная экономия как во времени, так и в пространстве. –

ответ

4

Комментарий Люка является правильным. Мы можем посмотреть на MDN page для приоритета оператора.

Учетного доступа к члену имеет приоритет 1 и приоритет присвоения 16. Таким образом, сначала вычисляются выражения доступа к свойствам, а затем операции присваивания. Кроме того, Computed Member Access имеет ассоциацию слева направо, в то время как Assignment имеет ассоциативность слева направо.

Таким образом, мы можем думать о первом шаге, разбор выражений доступа к свойствам слева направо:

o["a"] = o["ab"] = o["abc"] = 0 

и второй шаг, как делать assigments справа налево:

(o["a"] = (o["ab"] = (o["abc"] = 0))) 
(o["a"] = (o["ab"] = 0)) 
(o["a"] = 0) 

Я не вижу, как изменение ассоциативности для любого шага изменило бы производительность. Но если есть причина, я бы с удовольствием узнал :)

Смежные вопросы