我正在學習 ES6 基本課程并嘗試函式的默認引數和休息運算子。我sayHi用默認引數定義了一個函式,然后是rest運算子,它沒有給出所需的輸出。
const sayHi = (greetings, ...names) => {
names.forEach(item => {
console.log(`${greetings} ${item}`);
});
}
sayHi('Hi', 'Ahsan', 'Awais', 'Haseeb');
上面的代碼片段按需要作業。但是當我嘗試為greetings變數設定默認引數值時,它可以作業但給出了不需要的結果,即變數'Ahsan'采用了greetings值。
const sayHi = (greetings = ' Hi', ...names) => {
names.forEach(item => {
console.log(`${greetings} ${item}`);
});
}
sayHi('Ahsan', 'Awais', 'Haseeb');
有沒有辦法可以在rest運算子之前在上面的函式中設定默認引數?
uj5u.com熱心網友回復:
你不能,不。rest 引數僅選取未被任何先前形式引數消耗的引數的“其余”,因此greeting將始終接收第一個引數的值。
另外,由于名稱和問候語具有相同的型別,如果您想以這種方式接受名稱,則根本無法提供默認值。
幾個選項供您選擇:
咖喱函式
您可以有一個函式來接受問候語并回傳一個函式,該函式將它與您傳遞的任何內容一起使用:
const greet = (greeting = "Hi") => (...names) => {
for (const name of names) {
console.log(`${greeting} ${name}`);
}
};
greet()("Ahsan", "Awais", "Haseeb");
greet("Hello")("Ahsan", "Awais", "Haseeb");
請注意我們如何呼叫它:
greet()("Ahsan", "Awais", "Haseeb");
greet()使用默認問候語創建函式。然后我們通過("Ahsan", "Awais", "Haseeb")在其上使用來呼叫該函式。greet("Hello")創建一個使用問候語的函式"Hello"(然后我們呼叫它)。
(我也冒昧地使用for..of而不是forEach,但這是一個風格問題。)
將名稱作為陣列
另一種選擇是接受名稱作為陣列。這樣,我們可以在函式內部判斷是否收到了問候語:
const greet = (greeting, names) => {
if (Array.isArray(greeting)) {
names = greeting;
greeting = "Hi";
}
for (const name of names) {
console.log(`${greeting} ${name}`);
}
};
greet(["Ahsan", "Awais", "Haseeb"]);
greet("Hello", ["Ahsan", "Awais", "Haseeb"]);
uj5u.com熱心網友回復:
你只需要在第一個引數中傳遞 undefined 來跳過可選的 arg
把它想成這樣greetings = typeof greetings != 'undefined' ? greetings : "hi",這意味著檢查greetings它的值,如果它是未定義的(未提供)使用默認值
編輯:這里是代碼片段
const sayHi = (greetings = ' Hi', ...names) => {
names.forEach(item => {
console.log(`${greetings} ${item}`);
});
}
sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb');
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/370578.html
上一篇:如何在JavaScript中將嵌套陣列轉換為“鍵控”陣列?
下一篇:為什么axios沒有正確回傳
