簡體   English   中英

我需要創建一個 function 獲取未知數量的參數並返回它們的乘法。 但是我得到的結果是不確定的

[英]I need to create a function which gets an unknown number of parameters and returns their multiplication. However the result which I get is undefined

我創建了一個 object 並將 function 放入其中,然后使用綁定方法給 function 一些參數,但在控制台中未定義。

let numObj = {
    multyAll(...args) {
        for (let i = 0; i < args.length; i++) {
            if (typeof args === Number) {
                arguments *= arguments[i]
                return arguments
            }
        }
    }
    }

const result = numObj.multyAll.bind(1, 2, 3)
console.log(result());

我嘗試了另一種方法,但我仍然不知道為什么我認為 function 會忽略for循環並返回我在開頭給出的mul的值

let numObj = {
multyAll(...args) {
    let mul = 1
    for (arg of args) {
        if (typeof arg === Number) {
            mul *= arg
        }
        return mul
    }
    console.log(mul);
}
}

const result = numObj.multyAll.bind(1, 2, 3)
console.log(result());

一些問題:

  • 在第一個版本中,您使用arguments ,它是一個使用 function arguments 自動初始化的變量。 因此,將它用於您的產品不會很好地用於 go。 第二個版本通過使用不同的變量mul解決了這一點,該變量已正確初始化為 1。

  • 在第一個版本中, typeof args正在測試錯誤的變量。 您想要獲取的不是args類型,而是args[i]的類型。 在第二個版本中,這個問題得到了解決。

  • typeof操作符總是返回一個字符串,比如 "string", "number", "boolean", ... 所以它永遠不會等於Number ,它是一個原生的 function object,而不是一個字符串。

  • return不應該在循環內,因為這將立即停止循環。 您需要在返回之前訪問所有arguments,因此return必須在循環之后發生。

  • bind將在 function 調用期間應該用作this的值作為第一個參數。 另一個 arguments 將是正常的 arguments,將在調用期間傳遞。 因此,您需要在第一個位置插入一個額外的參數,例如null

  • 您應該 scope 您的變量,而不是將它們隱式定義為全局變量。 第二個版本中的arg就是這種情況。 在那里插入一個letconst

  • 盡管 JavaScript 引擎會自動為您插入分號,但此規則有時可能很棘手。 更好的做法是自己控制它並用分號分隔語句。

這是您的第二個版本(這是更好的版本),其中包含提到的更正:

 const numObj = { multyAll(...args) { let mul = 1; for (const arg of args) { if (typeof arg === "number") { mul *= arg; } } return mul; } }; const result = numObj.multyAll.bind(null, 1, 2, 3); console.log(result());

最后,這個任務非常適合用reduce來解決:

 const numObj = { multyAll(...args) { return args.reduce((mul, arg) => mul * (typeof arg === "number"? arg: 1), 1 ); } }; const result = numObj.multyAll.bind(null, 1, 2, 3); console.log(result());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM