使用解构赋值时遇到的一点小问题

    今天做题,思路有了,唰唰唰写完,然后样例测试,嗯!?结果不对啊。
function findRepeat(array){
    if(array instanceof Array){
        let i=0,
            len=array.length;
        while(i<len){
            if(array[i] !== i){
                if(array[i] === array[array[i]]){
                    return array[i];
                }
                [array[i],array[array[i]]] = [array[array[i]],array[i]];
            }else{
                i += 1;
            }
        }
    }
    return false;
}

    苦苦思考半天,思路没问题啊?然后多番调试,原来是解构赋值那里有问题,还是老老实实改成老方法吧。

function findRepeat1(array){
    if(array instanceof Array){
        let i=0,
            len=array.length;
        while(i<len){
            if(array[i] !== i){
                if(array[i] === array[array[i]]){
                    return array[i];
                }
                let temp = array[i];
                array[i] = array[temp];
                array[temp] = temp;
            }else{
                i += 1;
            }
        }
    }
    return false;
}

    代码是跑通了,但是不能止于此啊,要知道为啥啊?

    想了想,虽然不知道对不对,但还是记录下来比较好。

    解构赋值的操作,说白了是“模式匹配”+“赋值”的操作,在赋值的时候,JS是从右往左运算,所以在下面这个结构赋值的语句中,右侧式子先执行,然后左侧式子才赋值。

[array[i],array[array[i]]] = [array[array[i]],array[i]]

    例如当i=0时,右侧可以顺利获取array[array[0]]和array[0]的值,但是在左侧赋值时就存在问题了,array[0]的值可以顺利赋值为右侧array[array[0]]的值,而左侧的array[array[0]]首先获取array[0]的值,此时,array[0]的值已经变了,取到的值和理想值不同,于是出现了问题。

    上面说的还是比较模糊,举个具体的例子。


    在上面这个例子中,右侧array[array[0]]取值为2,array[0]取值为4,左侧赋值时array[0]的值被赋值为2,注意,这里就开始出问题了,array[array[0]]--->array[2],array[0]取到的是改变后的值,所以数组中下标为2的值被修改了。

    上面的代码也还是可以用解构赋值的方式,不过要用临时变量保存array[0]的初始值,但还是引入了临时变量,所以和使用老办法区别不大。

function findRepeat1(array){
    if(array instanceof Array){
        let i=0,
            len=array.length;
        while(i<len){
            if(array[i] !== i){
                if(array[i] === array[array[i]]){
                    return array[i];
                }
                let temp = array[i];
                [array[i],array[temp]] = [array[temp],array[i]];
            }else{
                i += 1;
            }
        }
    }
    return false;
}

    上面的代码还有点小问题。。。。用例不是全部通过

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/80565655