对于 [arr[left], arr[right]] = [arr[right--], arr[left++]]; 的疑惑

发布时间 2023-08-25 23:23:33作者: Delusional_man

如题,当时博主正在写leetcode,要求原地改变数组

故声明双指针 left 和 right,对数组进行交换,即

 [arr[left], arr[right]] = [arr[right--], arr[left++]]; 

但是未得到预期的结果,随后进行了测试:

1 let arr = [1, 2, 3, 4, 5];
2 let left = 1, right = 3;
3 [arr[left], arr[right]] = [arr[right--], arr[left++]];
4 console.log(arr);
5 console.log(left, right);

预期结果:

 但运行结果:

 

分析:

1、left++ 和 right-- 均正常执行,那么可能是解构赋值的问题?

随即寻找解构赋值的原理,但未果。

后来仔细琢磨,感觉这玩意也比较简单,其实并没有什么深奥的原理,仅仅是对应位置的赋值罢了

2、既然如此,那就debugger,在第2行后插入 debugger; 

发现在左侧变量赋值之前,left 和 right 就已经改变了,那这么一来就很明了了

1 let arr = [1, 2, 3, 4, 5];
2 let left = 1, right = 3;
3 [arr[left++], arr[right--]] = [arr[right], arr[left]];
4 console.log(arr);
5 console.log(left, right);

 

真相:

赋值运算符是从右往左运行的,故指针的值先于数组改变

将 -- 和 ++ 放在赋值运算符左侧即可