Louis's blog
GitHub
GitHub
  • 瀏覽器運作原理
  • 閉包
  • this
  • arguments 和 array-like
  • apply、call、bind
  • 函式程式設計
  • 物件和原型
  • 原型鏈和繼承
  • ES6 和 Class
  • ES6 中新增的數據類型
  • ES6 語法糖
  • var、let、const
  • ES7~ES12
  • Strict Mode
  • 補充
  • Proxy 和 Reflect
  • Promise
  • Iterator
  • 生成器
  • async、await
  • Event loop
  • 錯誤處理
  • 模塊化
  • 套件管理工具
  • JSON
  • WebStorage
  • IndexDB
  • Cookie
  • BOM
  • DOM
  • 防抖(debounce)和節流(throttle)
  • Deep copy
  • 事件總線

arguments 和 array-like

arguments 是函數中的一個由所有參數所合成的類陣列(array-like)物件。

Array-like 簡單介紹:

  • Array-like 並非一種陣列類型,而是一個物件。

  • Array-like 物件可以調用 length 獲取其長度,也可以透過索引(index)進行訪問,並且也能使迭代器(iterator)進行循環。

  • Array-like 不是陣列類型,所以不能使用陣列的方法,比如 forEach、map 等。

可以在函數中直接進行打印:

function foo(num1, num2, num3) {
  console.log(arguments)
}

foo(10, 20, 30, 40, 50)

輸出為:

Arguments(5) [10, 20, 30, 40, 50, callee: ƒ, Symbol(Symbol.iterator): ƒ]

將 arguments 轉化為 Array

前面提到過 arguments 並非一般的 Array 類型,而是一種類陣列(array-like)物件,所以有時候會將其轉成 Array 會更好操作。

進行 for 循環轉成陣列

function foo() {
  var newArr = []
  for (var i = 0; i < arguments.length; i++) {
    newArr.push(arguments[i])
  }
  console.log(newArr)
}

使用 Array 的原型方法 slice

function foo() {
  var newArr = Array.prototype.slice.call(arguments)
  console.log(newArr)
}

slice 的原理是將 this 作為指定的陣列進行 for 循環返回一個新的陣列,所以和前一種方法的實現原理是差不多的。

所以也可以直接這樣用:

function foo() {
  var newArr = [].slice.call(arguments)
  console.log(newArr)
}

透過 ES6 的語法 Array.from、展開運算符、for...of 等

Array.from

function foo() {
  var newArr = Array.from(arguments)
  console.log(newArr)
}

For...of

function foo() {
  var newArr = []
  for (let item of arguments) {
    newArr.push(item)
  }
  console.log(newArr)
}

展開運算符

function foo() {
  var newArr = [...arguments]
  console.log(newArr)
}

ES6 與 arguments

在 ES6 中的箭頭函數中不存在 arguments

var foo = () => {
  console.log(arguments)
}

如果在瀏覽器中打印會得到一個錯誤:

Uncaught ReferenceError: arguments is not defined

不過如果在 Nodejs 中打印出的結果會有所不同,由於 Nodejs 會將各個文件當作模塊,並放到一個函數中,所以箭頭函數中的 arguments 會向上找到這個函數中的 arguments,類似於以下的例子:

// 模擬noejs的機制
function foo() {
  var bar = () => {
    console.log(arguments)
  }
  bar()
}
foo(123)

在瀏覽器中執行,會打印出:

Arguments [123, callee: ƒ, Symbol(Symbol.iterator): ƒ]

可以使用其餘參數(rest parameter)獲取動態的參數

由於 es6 的箭頭函數中無法獲取 arguments 物件,所以現在通常不會推薦使用 arguments,而會使用新的 es6 語法——其餘參數(rest parameter),其餘參數(rest parameter) 語法可以讓我們表示不確定數量的參數,並將其視為一個陣列:

function foo(num1, num2, ...nums) {
  console.log(nums)
}

foo(10, 20, 30, 40, 50)

輸出為:

[30, 40, 50]
Edit this page
Last Updated:
Contributors: louis61619, louis
Prev
this
Next
apply、call、bind