关于解构赋值能不能反转数组

在群里看到这样一个问题

出于好奇,进行了结构的尝试。

  • 代码如下:
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")

  • 虽然反转成功,但这里有个问题:

虽然省下来了存储变量的开销,但实际上每个长度都要实时获取,在不改变数组长度的情况下,这也是一种浪费,对处理机时长的浪费。
数组长度不大的时候,这种做法完全可以理解,数组长度大了 或者 数组是批量的,这是不是又不实用了?

原文地址:https://www.cnblogs.com/chengyunshen/p/10641408.html