JavaScript中的arguments
對象是一個奇怪的疣-在大多數狀況下它的行爲就像一個數組,但實際上不是數組對象。 因爲它實際上徹底是另一回事 ,所以它沒有Array.prototype
有用的功能,例如forEach
, sort
, filter
和map
。 git
使用一個簡單的for循環從arguments對象構造新數組很是容易。 例如,此函數對其參數進行排序: github
function sortArgs() { var args = []; for (var i = 0; i < arguments.length; i++) args[i] = arguments[i]; return args.sort(); }
可是,僅得到訪問極其有用的JavaScript數組函數所要作的事情是至關可憐的。 是否有使用標準庫的內置方法? 數組
這是一個很是老的問題,可是我認爲我有一個比之前的解決方案更易於鍵入而且不依賴外部庫的解決方案: app
function sortArguments() { return Array.apply(null, arguments).sort(); }
對我來講,少許參數的最佳解決方案是: 函數
function sortArgs (){ var q = []; for (var k = 0, l = arguments.length; k < l; k++){ q[k] = arguments[k]; } return q.sort(); }
對於其餘狀況: 優化
function sortArgs (){ return Array.apply(null, arguments).sort(); }
採用: spa
function sortArguments() { return arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments).sort(); }
Array(arg1, arg2, ...)
返回[arg1, arg2, ...]
prototype
Array(str1)
返回[str1]
code
Array(num1)
返回具備num1
元素的數組
您必須檢查參數數量!
Array.slice
版本(較慢):
function sortArguments() { return Array.prototype.slice.call(arguments).sort(); }
Array.push
版本(慢於切片):
function sortArguments() { var args = []; Array.prototype.push.apply(args, arguments); return args.sort(); }
移動版本(速度較慢,但尺寸較小則更快):
function sortArguments() { var args = []; for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i]; return args.sort(); }
Array.concat
版本(最慢):
function sortArguments() { return Array.prototype.concat.apply([], arguments).sort(); }
還值得參考這個Bluebird Promise庫Wiki頁面 ,該頁面顯示瞭如何以使函數在V8 JavaScript引擎下可優化的方式將arguments
對象管理爲數組:
function doesntLeakArguments() { var args = new Array(arguments.length); for(var i = 0; i < args.length; ++i) { args[i] = arguments[i]; } return args; }
使用此方法有利於var args = [].slice.call(arguments);
。 做者還展現了構建步驟如何幫助減小冗長程度。
另外一個答案。
使用黑魔法:
function sortArguments() { arguments.__proto__ = Array.prototype; return arguments.slice().sort(); }
Firefox,Chrome,Node.js,IE11均可以。