[英]Array.prototype.splice - help to understand a lesson
這是教程中的一個函數:
function add() {
var values = Array.prototype.splice.call(arguments, [1]),
total = 0;
for(var value of values) {
total += value;
}
return total;
}
表達式Array.prototype.splice.call(arguments, [1])
讓我困惑。
1
? [1]
? 如果我們傳遞1,它表示splice()
start
位置,所以它將跳過我們傳遞給add()
的第一個參數,因此它不會添加所有參數......
這是教程中的錯誤嗎?
是的,這個例子是錯的,如果你嘗試的代碼不起作用(它會忽略第一個參數),就像你說的那樣。 如果該行是:
var values = Array.prototype.slice.call(arguments),
要么
var values = Array.prototype.splice.call(arguments, 0),
我的猜測:這個例子是通過簡單地編寫另一個具有一個特殊參數的函數的代碼並在ES5語法中使用apply
而不是call
來實現的。
在本教程的另一部分中,討論了計算函數,其第一個參數確定了要執行的計算類型。 如果使用ES5語法編寫它們,則必須刪除第一個參數。 這解釋了為什么1 - 刪除第一個參數。 現在, 為什么括號 :JS中有兩個幾乎相同的函數: call
和apply
。 請參閱此關於apply
:
雖然這個函數的語法幾乎與call()的語法相同,但最根本的區別是call()接受一個參數列表,而apply()接受一個參數數組。
我認為計算函數的作者錯誤地使用了apply
的語法,因此使用了括號。
你是對的,用[1]
調用Array.prototype.splice可能是個錯誤。
根據MDN docs for splice ,這個方法的第一個參數應該是一個數字。 Chrome確實將[1]
解釋為1
並跳過第一個參數。
您應該檢查是否應該跳過第一個參數,否則最好直接在函數參數上進行for循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.