zoukankan      html  css  js  c++  java
  • 关于解构赋值能不能反转数组

    在群里看到这样一个问题

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

    • 代码如下:
    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")
    
    
    • 虽然反转成功,但这里有个问题:

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

  • 相关阅读:
    NIO简述
    函数式编程
    ReadWriterLock读写锁
    Semaphore工具类使用
    CyclicBarrier工具类使用
    CountDownLatch工具类使用
    创建VUE+Element-UI项目
    <slot>插板使用
    Spring面试题
    实现定时任务的几种方式
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/10641408.html
Copyright © 2011-2022 走看看