JavaScript之arguments

南波發表於2018-10-22

本文共 635 字,讀完只需 3 分鐘

概述

JavaScript中的函式與其他面嚮物件語言有幾個不同的地方。

  1. 沒有函式過載
  2. 有一個表示實參列表的類陣列物件 arguments

一、函式過載

簡單來說,JAVA 同一個類中允許幾個函式有同樣的函式名稱,但是引數宣告不一樣,這就是函式過載。

但是 JS 不支援函式過載:

function foo(num) {
    console.log(num + 100)
}

function foo(num) {
    console.log(num + 200)
}

foo(100);  // 300
複製程式碼

如果 js 中定義了兩個相同名稱的函式,那麼該名字只屬於後定義的那個函式。

二、arguments 類陣列

函式 arguments 物件是所有(非箭頭)函式中都可用的區域性變數, 是一個類似陣列的物件。你可以使用arguments物件在函式中引用函式的(實際)引數。

function foo() {
    console.log(arguments);
}

foo(1, "foo", false, {name: "bar"}); // [1, "foo", false, object]
複製程式碼
function foo() {
    console.log(typeof arguments);
}

foo(1, "foo", false, {name: "bar"}); // object
複製程式碼

所以,arguments 是一個具有陣列樣式的物件,有 length 屬性,和下標來索引元素。

JavaScript之arguments

三、arguments 的屬性

length

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

foo(1);  // [1]
複製程式碼

length 屬性表示傳入函式的實際引數數量,而不是函式宣告時的形引數量。

callee
callee 表示函式本身,我們可以在函式中通過 callee 呼叫本身。


複製程式碼

四、轉化為真陣列

  1. slice

arguments 物件不支援陣列的其他方法,但是可以用 Function.call 來間接呼叫。

function sayHi() {
	console.log(Array.prototype.slice.call(arguments, 0))
}
sayHi("hello", "你好", "bonjour")  //["hello", "你好", "bonjour"]
複製程式碼
  1. splice
function sayHi() {
	console.log(Array.prototype.splice.call(arguments, 0));
}
sayHi("hello", "你好", "bonjour")  //["hello", "你好", "bonjour"]
複製程式碼
  1. Array.from
function sayHi() {
	console.log(Array.from(arguments));
}
sayHi("hello", "你好", "bonjour")  //["hello", "你好", "bonjour"]
複製程式碼
  1. 擴充套件運算子
function sayHi(...arguments) {
	console.log(arguments);
}
sayHi("hello", "你好", "bonjour")  //["hello", "你好", "bonjour"]
複製程式碼

五、嚴格模式

嚴格模式和非嚴格模式中,arguments 的表現顯示不相同。

// 嚴格模式
function foo(a, b) {
    "use strict";
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
    b = 30;
    console.log(b, arguments[1])
}
foo(1);
輸出:
1 1
10 1
10 20
30 undefined

// 非嚴格模式
function foo(a, b) {
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
    b = 30;
    console.log(b, arguments[1]);
}
foo(1);
輸出:
1 1
10 10
20 20
30 undefined
複製程式碼

在非嚴格模式中,傳入的引數,實參和 arguments 的值會共享,當沒有傳入時,實參與 arguments 值不會共享。

而在嚴格模式中,實參和 arguments 的值不會共享。

歡迎關注我的個人公眾號“謝南波”,專注分享原創文章。

JavaScript之arguments

掘金專欄 JavaScript 系列文章

  1. JavaScript之變數及作用域
  2. JavaScript之宣告提升
  3. JavaScript之執行上下文
  4. JavaScript之變數物件
  5. JavaScript原型與原型鏈
  6. JavaScript之作用域鏈
  7. JavaScript之閉包
  8. JavaScript之this
  9. JavaScript之arguments
  10. JavaScript之按值傳遞
  11. JavaScript之例題中徹底理解this
  12. JavaScript專題之模擬實現call和apply

相關文章