![](/img/trans.png)
[英]using this keyword as a way to pass an argument to a function in 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])
}
}
當我運行代碼時,我收到一條錯誤消息,說 that.push() 不是 function,這是因為 checkableArr 不是數組,(我認為)但 checkableArr 是 arr 的變體(當function 被調用)並且 function 無法知道 arr 將成為一個數組,有什么辦法可以解決這個問題嗎?
您收到該錯誤,因為您沒有確保傳遞的數組 ( arr
) 的最后一項是數組本身,但是您的函數邏輯要求它是一個數組。
有多種方法可以解決這個問題,其中一些已經被其他人概述過(@hungerstar)。
檢查arr
的最后一個元素
一種嘗試是確保arr
中的最后一個元素/項目是一個數組,如果不是,則退出。
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
內容的 rest 反向推入其中(= 反轉和展平)
反轉和展平
如果您想要對validateCred
做的只是反轉和展平(並且您只針對支持環境),您可以使用單行輕松做到這一點:
// 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();
是的,我們使用 call/apply 方法將數組作為參數傳遞。 在您的代碼中,當您使用arr.pop()
時,它會根據您指定的數組類型轉換為數字/字符串,我在 integer 值下方指定,所以checkableArr
現在是 integer ,因此您會收到錯誤消息。
更正的代碼在這里。 只需在您的代碼中替換,例如:
let checkableArr = arr; //arr.pop();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.