JavaScript-在没有push语句的情况下更改了输入数组

JavaScript-在没有push语句的情况下更改了输入数组,javascript,arrays,Javascript,Arrays,我的电话号码是283 给定一个数组nums,编写一个函数将所有0移到它的末尾 同时保持非零元素的相对顺序 输入:[0,1,0,3,12] 输出:[1,3,12,0,0] 有人能解释一下下面的代码吗 var moveZeroes = function(nums) { // nums is [0,1,0,3,12] var len = nums.length; for (let lastNonZero = 0, cur = 0; cur < len; cur++) {

我的电话号码是283

给定一个数组nums,编写一个函数将所有0移到它的末尾 同时保持非零元素的相对顺序

输入:[0,1,0,3,12] 输出:[1,3,12,0,0]

有人能解释一下下面的代码吗

var moveZeroes = function(nums) {     // nums is [0,1,0,3,12]
  var len = nums.length;
  for (let lastNonZero = 0, cur = 0; cur < len; cur++) {
    if (nums[cur] !== 0) {
      [nums[lastNonZero], nums[cur]] = [nums[cur], nums[lastNonZero]];    // what exactly happened here
      lastNonZero++;
    }
  }
  return nums;
};
for循环是如何工作的,nums数组是如何重新排列的?

[nums[lastNonZero],nums[cur]=[nums[cur],nums[lastNonZero]]只需进行交换即可

让[a,b]=[b','a']
console.loga,b我相信

[nums[lastNonZero], nums[cur]] = [nums[cur], nums[lastNonZero]];
是的缩写

nums[lastNonZero] = nums[cur];
// and
nums[cur] = nums[lastNonZero];
但同时我们也在做

const tempCurrent = nums[cur];
const tempLastNonZero = nums[lastNonZero];
nums[lastNonZero] = tempCurrent;
nums[cur] = tempLastNonZero;
编辑:

destructuring是此语法的名称,这要归功于

这一行[nums[lastNonZero],nums[cur]=[nums[cur],nums[lastNonZero]]只是一个替换。如果您有[1,2]并使用此代码,那么最终将得到[2,1]。您提供的函数将在循环中运行,并向右移动0,向左移动下一个数字,直到到达[0,0]。

[nums[lastNonZero],nums[cur]=[nums[cur],nums[lastNonZero]

这是一个es6语法,叫做去结构化,这里发生的只是一个交换

对象分解示例

obj = { 'a': 1, 'b': 2}
const { a, b } = obj;
现在,您不必到处访问obj.a,只需使用a,它作为局部变量被销毁

同样让我们考虑数组

arr = [1,2,3];
const [a,b,c] = arr;

console.log(a) will result in 1;

实际上,数组中的第一个元素被分配给数组中的第一个变量。
希望澄清。

OP要求对给定代码进行解释,而不是替代解决方案。即使我更喜欢这个解决方案,你也可以看看解构关键字这个语法被称为。我不会想到用它来交换,这是个聪明的把戏。