如何在JavaScript中將「參數」對象轉換爲數組?

想要改善這篇文章嗎? 提供此問題的詳細答案,包括引文和爲何答案正確的解釋。 答案不夠詳細的答案可能會被編輯或刪除。

JavaScript中的arguments對象是一個奇怪的疣-在大多數狀況下它的行爲就像一個數組,但實際上不是數組對象。 因爲它實際上徹底是另一回事 ,所以它沒有Array.prototype有用的功能,例如forEachsortfiltermapgit

使用一個簡單的for循環從arguments對象構造新數組很是容易。 例如,此函數對其參數進行排序: github

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

可是,僅得到訪問極其有用的JavaScript數組函數所要作的事情是至關可憐的。 是否有使用標準庫的內置方法? 數組


#1樓

這是一個很是老的問題,可是我認爲我有一個比之前的解決方案更易於鍵入而且不依賴外部庫的解決方案: app

function sortArguments() {
  return Array.apply(null, arguments).sort();
}

#2樓

這是將參數轉換爲數組的幾種方法的基準jsp

對我來講,少許參數的最佳解決方案是: 函數

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(); }

#3樓

採用: 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();
}

#4樓

還值得參考這個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); 。 做者還展現了構建步驟如何幫助減小冗長程度。


#5樓

另外一個答案。

使用黑魔法:

function sortArguments() {
  arguments.__proto__ = Array.prototype;
  return arguments.slice().sort();
}

Firefox,Chrome,Node.js,IE11均可以。

相關文章
相關標籤/搜索