2016-07-01 3 views
0

Однажды я увидел определенный способ обмена элементами в массиве. Как это:Javascript. Элементы инициализации массива

var arr = [1,2,3]; 
arr[0] = [arr[1], arr[1] = arr[0]][0]; 

Очевидно, что этот метод предположить, что первое значение временного массива arr[1] будет рассчитываться перед тем второй arr[1] = arr[0].
В противном случае оба значения будут одинаковыми. Синтетический пример:

var x = 1; 
var arr = [x, x += 1, x += 1]; 
arr; // [1,2,3] or [3,3,2] or maybe [3,2,3]? 

Есть ли гарантии, что переводчик javascript не будет действовать таким образом?

ответ

1

JS инициализаторы массива гарантированно вычисляются слева направо

ArrayAccumulation (: СписокЭлементов, Elision [OPT] ВыражениеПрисваивания):

0,1. Пусть postIndex является результатом выполнения ArrayAccumulation для ElementList с массивом аргументов и nextIndex ...

.4. Пусть initResult будет результатом оценки AssignmentExpression.

@http://www.ecma-international.org/ecma-262/6.0/#sec-runtime-semantics-arrayaccumulation

Это лучше не полагаться на что, хотя.

+0

"* Лучше не полагаться на это, хотя. *" - А? Вы абсолютно можете положиться на это. – Bergi

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