Array.prototype.slice.apply(arguments)
這段 JavaScript 程式碼的作用是將類陣列物件 arguments
轉換為一個真正的陣列。
讓我們分解一下:
-
arguments
: 在非箭頭函式中,arguments
是一個特殊的類陣列物件,包含了傳遞給函式的所有引數。它看起來像陣列,擁有length
屬性,可以透過索引訪問元素,但它缺少陣列的原型方法,例如push
、pop
、slice
等。 -
Array.prototype.slice
:slice
是陣列的一個方法,用於建立一個新的陣列,其中包含原陣列的一部分。當不帶引數呼叫slice()
時,它會 effectively 複製整個陣列。 -
apply
:apply
是一個函式方法,允許你以指定的this
值和引數列表呼叫一個函式。 它的第一個引數是this
的值,第二個引數是一個陣列(或類陣列物件),其元素將作為函式的引數。
因此,Array.prototype.slice.apply(arguments)
的作用是:
- 獲取
Array.prototype.slice
方法。 - 使用
apply
方法呼叫slice
。 - 將
arguments
作為this
值傳遞給slice
。 雖然slice
通常在陣列上呼叫,這裡利用了slice
的內部機制,即使arguments
不是真正的陣列,slice
仍然可以按預期工作。 - 不傳遞任何引數給
slice
,這意味著它會複製整個arguments
物件。 - 返回一個包含
arguments
所有元素的新陣列。
為什麼要這樣做?
在ES6之前,將類陣列物件 arguments
轉換為真正的陣列是一種常見的做法,因為這樣就可以使用陣列的方法來操作函式的引數。 ES6 引入了 rest 語法 (...args
),提供了一種更簡潔、更易讀的方式來實現相同的功能。
示例:
function myFunction() {
// 舊方法:將 arguments 轉換為陣列
const argsArray = Array.prototype.slice.apply(arguments);
console.log(Array.isArray(argsArray)); // true
console.log(argsArray);
// ES6 方法:使用 rest 引數
function myFunction2(...args) {
console.log(Array.isArray(args)); // true
console.log(args);
}
}
myFunction(1, 2, 3);
myFunction2(1, 2, 3);
現在,使用 rest 引數 (...args
) 通常是首選方法,因為它更清晰、更簡潔。 但是,理解 Array.prototype.slice.apply(arguments)
的工作原理仍然有助於理解舊程式碼以及 JavaScript 中 apply
方法的強大功能。