在群里看到这样一个问题
出于好奇,进行了结构的尝试。
- 代码如下:
let a = [1,2,3,4,5];
for(let i = 0;i<a.length/2;i++){
[ a[i] , a[a.length -1 -i] ] = [ a[a.length-1-i] , a[i] ]
}
console.log(a,"reverse")
首先按照图中说的,不需要第三个变量的参与,如果解构不用 数组 []嵌套,会解析为多个变量,so 忽略这两个数组。
虽然这样,运行起来还是会报错。 大意是 5没办法赋值给 undefined, 显然 =左边的已经不是变量,而是一个常量了。实际变为
[1,5] = [5,1]
解析器当然不知道把5给谁基于上边猜想,进行验证,代码如下
let m = 1,n = 2;
[m,n]= [n,m]
console.log("m = ",m,"n=",n)
- 这段代码跑起来完全正常,那么大致可以印证猜想。为了排除其他可能性,用python再跑一遍:
a = [1,2,3,4,5]
for i in range(len(a)):
[ a[i], a[len(a)-1-i] ] = [ a[len(a)-1-i], a[i] ]
print a
- 运行结果并没有变化,实际上说明一旦把变量放在 []中,会把变量的值放到相应位置,如果 不加 [], 又会解析为一个赋值和三个变量
m,n = n,m
//这就是废代码 啥都没有做
- 关键的问题其实在于,换位赋值 能不能实现,后来查到一种方法
参考链接
var a=1,b=2;
a=[b,b=a][0];
console.log(a,b)
- 试着跑一下,反转成功,但没有进行性能测试,最终代码如下
let a = [1,2,3,4,5];
for(let i = 0;i<a.length/2;i++){
a[i] = [ a[a.length-1-i], a[a.length-1-i] = a[i] ][0];
}
console.log(a,"reverse")
虽然反转成功,但这里有个问题:
虽然省下来了存储变量的开销,但实际上每个长度都要实时获取,在不改变数组长度的情况下,这也是一种浪费,对处理机时长的浪费。
数组长度不大的时候,这种做法完全可以理解,数组长度大了 或者 数组是批量的,这是不是又不实用了?