JavaScript之arguments

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

概述

JavaScript中的函數與其餘面嚮對象語言有幾個不一樣的地方。java

  1. 沒有函數重載
  2. 有一個表示實參列表的類數組對象 arguments

1、函數重載

簡單來講,JAVA 同一個類中容許幾個函數有一樣的函數名稱,可是參數聲明不同,這就是函數重載。數組

可是 JS 不支持函數重載:閉包

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

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

foo(100);  // 300
複製代碼

若是 js 中定義了兩個相同名稱的函數,那麼該名字只屬於後定義的那個函數。app

2、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 屬性,和下標來索引元素。post

3、arguments 的屬性

lengthui

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

foo(1);  // [1]
複製代碼

length 屬性表示傳入函數的實際參數數量,而不是函數聲明時的形參數量。this

callee
callee 表示函數自己,咱們能夠在函數中經過 callee 調用自己。spa

複製代碼

4、轉化爲真數組

  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"]
複製代碼

5、嚴格模式

嚴格模式和非嚴格模式中,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 系列文章

  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
相關文章
相關標籤/搜索