在 javascript 中定义函数时,有没有办法将数组作为参数传递?

Is there a way to pass an array as an argument when defining a function in javascript?

const validateCred = arr => {
    let checkableArr = arr.pop();
    for (let i = arr.length - 1; i >= 0; i--) {
        arr[i]
        checkableArr.push(arr[i])
    }

}

当我 运行 代码时,我收到一条错误消息说 .push() 不是函数,这是因为 checkableArr 不是数组,(我认为)但 checkableArr 是arr(调用函数时将传递的参数)并且函数无法知道 arr 将成为一个数组,有什么办法可以解决这个问题吗?

是的,我们使用 call/apply 方法将数组作为参数传递。在您的代码中,当您使用 arr.pop() 时,它会根据您指定的数组类型转换为 number/string,我在下面指定了整数值,因此 checkableArr 现在是整数,因此您是出现错误。

更正后的代码在这里。只需将您的代码替换为:

let checkableArr = arr; //arr.pop();

你得到那个错误,因为你没有确定传递的数组 (arr) 的 last 项本身是一个数组,但是你函数的逻辑要求它是一个数组。

有多种方法可以解决这个问题,其中一些已经被其他人 (@hungerstar) 概述过。

检查arr

的最后一个元素

一种尝试是确保 arr 中的最后一个 element/item 是一个数组,如果不是则退出。

const validateCred = arr => {
  let lastItem = arr.pop();
  if (!Array.isArray(lastItem)) {
    throw new Error('validateCred :: Last item of passed array must be an array itself');
  }
  // ... rest of your code ...
}

尽管这不能解决根本原因,但它可以确保您获得有关问题所在的体面且描述性的消息。可以通过定义 后备数组 改进 以防最后一项不是数组本身。像这样:

const validateCred = arr => {
  let lastItem = arr.pop();
  let checkableArr = Array.isArray(lastItem) ? lastItem : [];
  // ... rest of your code ...
}

需要注意的一点:如果最后一项可能是一个数组,其中包含一个值,您必须将该值复制到新数组中!

const validateCred = arr => {
  let lastItem = arr.pop();
  let checkableArr = Array.isArray(lastItem) ? lastItem : [lastItem]; // <--
  // ... rest of your code ...
}

提示:以下答案基于猜测。名称 validateCred 让我假设您使用它来验证凭据。然而,这只是猜测,因为所有提供的代码所做的就是获取最后一项,然后将 arr 的其余内容反向推入其中(=反转和展平)

反转平整

如果你想用 validateCred 做的只是反转和扁平化(并且你只针对支持环境),你可以使用 one-liner:

轻松做到这一点
// impure version
const validateCred = arr => arr.reverse().flat();

// pure version
const validateCred = arr => arr.flat().reverse();

为了也支持较旧的环境,您可以使用 .reduce.concat 而不是 .flat:

// impure version
const validateCred = arr => arr.reverse().reduce((acc, x) => acc.concat(x), []);

// pure version
const validateCred = arr => arr.reduce((acc, x) => acc.concat(x), []).reverse();