Javascript。数组初始化顺序的元素
Javascript. Elements of array initialization order
有一天我看到了一种交换数组元素的方法。像这样:
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 口译员不会以这种方式行事?
JS 数组初始值设定项保证从左到右计算
ArrayAccumulation(ElementList : ElementList , Elision[opt] AssignmentExpression):
.1. Let postIndex be the result of performing ArrayAccumulation for ElementList with arguments array and nextIndex...
.4. Let initResult be the result of evaluating AssignmentExpression.
@http://www.ecma-international.org/ecma-262/6.0/#sec-runtime-semantics-arrayaccumulation
不过最好不要依赖它。
有一天我看到了一种交换数组元素的方法。像这样:
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 口译员不会以这种方式行事?
JS 数组初始值设定项保证从左到右计算
ArrayAccumulation(ElementList : ElementList , Elision[opt] AssignmentExpression):
.1. Let postIndex be the result of performing ArrayAccumulation for ElementList with arguments array and nextIndex...
.4. Let initResult be the result of evaluating AssignmentExpression.
@http://www.ecma-international.org/ecma-262/6.0/#sec-runtime-semantics-arrayaccumulation
不过最好不要依赖它。