避免修改或傳送 arguments 到其他函式 - 它會影響優化
背景
在 JavaScript 的函式,變數名稱 arguments
讓你可以存取所有傳送到函式的參數。arguments
是一個 類陣列物件;arguments
可以使用陣列表示來存取,而且它有 length 屬性,但不具備陣列的 filter
和 map
以及 forEach
的方法。以下程式碼是轉換 arguments
到陣列相當普遍的做法。
var args = Array.prototype.slice.call(arguments);
將 arguments
傳送到 Array
原型的上的 slice
方法;slice
方法回傳淺拷貝的 arguments
當作新的陣列物件。一般常見的簡寫方法:
var args = [].slice.call(arguments);
在這個情況下,只是呼叫一個空陣列陣列,而不是從 Array
原型上呼叫 slice
方法。
優化
不幸的是,傳送到任何函式呼叫的 arguments
,造成在 Chrome 和 Node 跳過 JavaScript V8 引擎的優化功能,這可能會導致性能降低。參考這篇 optimization killers 文章。傳送 arguments
到函式稱為 leaking arguments
。
相反的,假設你需要包含參數的陣列,你可以藉助這個方法:
var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
雖然程式碼更冗長,但是在上線環境增進了效能的優化,所以是值得的。
Use the 100 answers in this short book to boost your confidence and skills to ace the interviews at your favorite companies like Twitter, Google and Netflix.
GET THE BOOK NOWA short book with 100 answers designed to boost your knowledge and help you ace the technical interview within a few days.
GET THE BOOK NOW