[英]Javascript wrongfully changes the result of a simple multiplication. How can I fix it?
[英]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
就是這種情況。 在那里插入一個let
或const
。
盡管 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.