JavaScript中的arguments對象

 

arguments 是一個相似數組的對象, 對應於傳遞給函數的參數。數組

語法

arguments

描述

arguments對象是全部函數中可用的局部變量。你可使用arguments對象在函數中引用函數的參數。此對象包含傳遞給函數的每一個參數的條目,第一個條目的索引從0開始。例如,若是一個函數傳遞了三個參數,你能夠參考它們以下:app

arguments[0]
arguments[1]
arguments[2]


參數也能夠被設置:函數

arguments[1] = 'new value';

arguments對象不是一個 Array 。它相似於數組,但除了 長度以外沒有任何數組屬性。例如,它沒有 pop 方法。可是它能夠被轉換爲一個真正的數組::優化

let args = Array.prototype.slice.call(arguments); 

let args = [].slice.call(arguments);

你還可使用 Array.from()方法或 spread 運算符將 arguments 轉換爲真正的數組:spa

let args = Array.from(arguments);
let args = [...arguments];

對參數使用slice會阻止某些JavaScript引擎中的優化 (好比 V8 引擎)。prototype

若是你關心它們,嘗試經過遍歷arguments對象來構造一個新的數組。rest

另外一種方法是使用 被忽視的/鄙視/輕視,/看不起 Array構造函數做爲一個函數:code

let args = (
arguments.length === 1 ? 
[arguments[0]] : 
Array.apply(null, arguments)
);

若是 Array generics 可用的話,下面的代碼能夠做爲替代:對象

var args = Array.slice(arguments);
  • arguments 對象僅在函數內部有效,在函數外部調用 arguments 對象會出現一個錯誤。blog

  • arguments的typeof返回'object'。

  • console.log(typeof arguments); // 'object'

  • 可使用索引來肯定各個arguments的類型。

console.log(typeof arguments[0]); 
//這將返回單個參數的typeof。

若是你調用一個函數,當這個函數的參數數量比它顯式聲明的參數數量更多的時候,你就可使用 arguments 對象。這個技術對於參數數量是一個可變量的函數來講比較有用。 你能夠用 arguments.length 來獲得參數的數量,而後能夠用 arguments object 來對每一個參數進行處理。 (想要獲得函數簽名的參數數量, 請使用 Function.length 屬性。)

屬性

arguments.callee
// 指向當前執行的函數。

arguments.caller 
// 指向調用當前函數的函數。

arguments.length
// 指向傳遞給當前函數的參數數量。

例子

定義一個鏈接幾個字符串的函數

這個例子定義了一個函數來鏈接字符串。這個函數惟一正式聲明瞭的參數是一個字符串,該參數指定一個字符做爲銜接點來鏈接字符串。該函數定義以下:

function myConcat(separator) {
  var args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

你能夠傳遞任意數量的參數到該函數,而後該函數會將每一個參數做爲一個條目來建立一個列表。

myConcat(", ", "red", "orange", "blue");
// returns "red, orange, blue"

myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// returns "elephant; giraffe; lion; cheetah"

myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
// returns "sage. basil. oregano. pepper. parsley"

定義一個建立HTML列表的方法

這個例子定義了一個函數經過一個字符串來建立HTML列表。這個函數惟一正式聲明瞭的參數是一個字符。當該參數爲 "u" 時,建立一個無序列表 (項目列表);當該參數爲 "o" 時,則建立一個有序列表 (編號列表)。該函數定義以下:

function list(type) {
  var result = "<" + type + "l><li>";
  var args = Array.prototype.slice.call(arguments, 1);
  result += args.join("</li><li>");
  result += "</li></" + type + "l>"; // end list

  return result;
}

你能夠傳遞任意數量的參數到該函數,而後該函數會將每一個參數做爲一個條目添加到第一個參數指定類型的列表當中。

var listHTML = list("u", "One", "Two", "Three");

/* listHTML is:

"<ul><li>One</li><li>Two</li><li>Three</li></ul>"

*/

注意

ES6中的箭頭函數沒有本身的 arguments 對象,不過在大多數情形下,rest參數能夠給出一個解決方案:

let a;
const fn = (...rest) => Array.prototype.slice.call(rest, 1);
a = fn(1, 2); // [2]
相關文章
相關標籤/搜索