目錄
JS可變參數的實作一:arguments
JS可變參數的實作二:rest 參數(...)
首頁 web前端 js教程 詳解JavaScript函數如何實現可變參數? (總結分享)

詳解JavaScript函數如何實現可變參數? (總結分享)

Aug 04, 2022 pm 02:35 PM
javascript 函數 可變參數

js是弱型別語言,不能像C#那樣使用param關鍵字來宣告形參是一個可變參數。那麼js中,如何實現這種可變參數呢?以下這篇文章就來聊聊JavaScript函數可變參數的實作方法,希望對大家有幫助!

詳解JavaScript函數如何實現可變參數? (總結分享)

JS可變參數的實作一:arguments

什麼是arguments?怎麼實現可變參數?

arguments 是一個對應於傳遞給函數的參數的類別陣列物件。

在ES5中可以使用arguments物件實現可變參數。

arguments物件的長度是由實參個數而不是形參個數決定的。形參是函數內部重新開啟記憶體空間儲存的變量,但是其與arguments物件記憶體空間並不重疊。對於arguments和值都存在的情況下,兩者值是同步的,但是針對其中一個無值的情況下,對於此無值的情形值不會得以同步。

<script>
function dynamicArgs() {
	var info = "今日签到的学生有:";
	for (let i = 0; i < arguments.length ; i ++) {
		if (i > 0) {
			info += ",";
		}
		info += arguments[i];
	}
	
	console.log(info);
}

dynamicArgs("张三", "李四");
dynamicArgs("张三", "李四", "王五", "马六");
dynamicArgs(["张三", "李四", "王五", "马六", "jack", "rose"]);
</script>
登入後複製
  • 參數不確定,那乾脆不寫了。

  • 呼叫時可以寫N多個參數,也可以直接傳個陣列。

執行效果:

詳解JavaScript函數如何實現可變參數? (總結分享)

#總結:

1、從函數定義可以看出,函數中如果使用可變參數arguments ,則不需要寫形參

2、在呼叫函數時,可以直接向函數中傳遞多個實參

arguments 對象是所有(非箭頭)函數中都可用的局部變數。你可以使用arguments 物件在函數中引用函數的參數。此物件包含傳遞給函數的每個參數,第一個參數在索引0處。例如,如果一個函數傳遞了三個參數,你可以如下引用他們:

arguments[0]
arguments[1]
arguments[2]
登入後複製

參數也可以被設定:

arguments[0] = &#39;value&#39;;
登入後複製

arguments 是一個對象,不是一個Array 。它類似於Array ,但除了length屬性和索引元素之外沒有任何Array 屬性。例如,它沒有 pop 方法。但是它可以被轉換為一個真正的Array :

所以常常可以看到這樣的程式碼:

// 由于arguments不是 Array,所以无法使用 Array 的方法,所以通过这种方法转换为数组
 
var args = [].slice.call(arguments);  // 方式一
var args = Array.prototype.slice.call(arguments); // 方式二
 
// 下面是 es6 提供的语法
let args = Array.from(arguments)   // 方式一
let args = [...arguments]; // 方式二
登入後複製

arguments<span style="font-size: 16px;">#上的屬性</span>

  • arguments.callee:指向目前執行的函數(在嚴格模式下,第5版ECMAScript (ES5 ) 禁止使用 a<strong>rguments.callee()</strong>
  • argunments.length:指向傳遞給目前函數的參數數量
  • #arguments. caller:已移除

arguments與剩餘參數、預設參數和解構賦值參數的結合使用

##1)在嚴格模式下,剩餘參數、預設參數和解構賦值參數的存在不會改變 

arguments物件的行為,但是在非嚴格模式下就有所不同了

function func(a) { 
  arguments[0] = 99;   // 更新了arguments[0] 同样更新了a
  console.log(a);
}
func(10); // 99

// 并且

function func(a) { 
  a = 99;              // 更新了a 同样更新了arguments[0] 
  console.log(arguments[0]);
}
func(10); // 99
登入後複製

2)當非嚴格模式中的函數

沒有包含剩餘參數、預設參數和解構賦值,那麼arguments物件中的值追蹤參數的值(反之亦然) 。看下面的程式碼:

function func(a = 55) { 
  arguments[0] = 99; // updating arguments[0] does not also update a
  console.log(a);
}
func(10); // 10

//

function func(a = 55) { 
  a = 99; // updating a does not also update arguments[0]
  console.log(arguments[0]);
}
func(10); // 10


function func(a = 55) { 
  console.log(arguments[0]);
}
func(); // undefined
登入後複製

JS可變參數的實作二:rest 參數(...)

在ES6標準中引入了rest 參數(形式為

…變數名稱),用於取得函數的多餘參數。 rest 參數搭配的變數是一個數組,該變數將多餘的參數放入數組中。非常適合處理變長參數的情況。

Rest就是為解決傳入的參數數量不一定,它表示將多餘的參數接受並放到一個數組裡; Rest參數 本身就是數組,數組的相關的方法都可以用。

可變參數的實作語法:

function f(a, b, ...theArgs) {
  // ...
}
登入後複製

  • #theArgs以「…」開頭,它是一個數組,它的值來自於實際呼叫者傳入[0,theArgs.length)  (索引的範圍:0到theArgs.length-1)

##注意

#:rest 參數之後不能再有其他參數(即只能是最後一個參數),否則會報錯。

function f(arg1, ...rest, arg2) { // arg2 after ...rest ?!
  // error
}
登入後複製

詳解JavaScript函數如何實現可變參數? (總結分享)

區分rest參數和參數(arguments)物件

    rest參數不會為每個變數給一個單獨的名稱,參數物件包含所有參數傳遞給函數
  • 參數物件不是真正的數組,rest參數是真實的數組實例。例如陣列sort、map、forEach、pop的方法都可以直接使用
  • 參數物件有他自己額外的特性(例如callee 屬性)

Rest参数的引入减少样式代码

//以前函数
function f(a, b) {
  var args = Array.prototype.slice.call(arguments, f.length);
 
  // …
}
 
// 等效于现在
 
function f(a, b, ...args) {
  
}
登入後複製

Rest参数可以被解构(通俗一点,将rest参数的数据解析后一一对应)不要忘记参数用[] 括起来,因为它数组嘛

function f(...[a, b, c]) {
  return a + b + c;
}
 
f(1)          //NaN 因为只传递一个值,其实需要三个值
f(1, 2, 3)    // 6
f(1, 2, 3, 4) // 6 (第四值没有与之对应的变量名)
登入後複製

示例

1、计算参数和

function sumAll(...args) { // args 是数组的名称
  let sum = 0;
 
  for (let arg of args) sum += arg;
 
  return sum;
}
 
console.log( sumAll(1) ); // 1
console.log( sumAll(1, 2) ); // 3
console.log( sumAll(1, 2, 3) ); // 6
登入後複製

詳解JavaScript函數如何實現可變參數? (總結分享)

2、每个参数乘以2

function multiply(multiplier, ...theArgs) {
  return theArgs.map(function(element) {
    return multiplier * element;
  });
}
 
var arr = multiply(2, 1, 2, 3); 
console.log(arr); // [2, 4, 6]
登入後複製

詳解JavaScript函數如何實現可變參數? (總結分享)

3、排序

function sortRestArgs(...theArgs) {
  var sortedArgs = theArgs.sort();
  return sortedArgs;
}
//好像一位和两位混合不能进行排序,这需要看一下为甚?主要第一个为主
console.log(sortRestArgs(5, 3, 7, 1)); // shows 1, 3, 5, 7
登入後複製

詳解JavaScript函數如何實現可變參數? (總結分享)

对比:参数对象arguments不能排序

function sortArguments() {
  //arguments是参数对象不能直接使用sort()方法,因为不是数组实例,需要转换
  var sortedArgs = arguments.sort(); 
  return sortedArgs; // this will never happen
}
 
// 会抛出类型异常,arguments.sort不是函数
console.log(sortArguments(5, 3, 7, 1));
登入後複製

詳解JavaScript函數如何實現可變參數? (總結分享)

【相关推荐:javascript学习教程 、编程视频

以上是詳解JavaScript函數如何實現可變參數? (總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

golang函數動態建立新函數的技巧 golang函數動態建立新函數的技巧 Apr 25, 2024 pm 02:39 PM

Go語言提供了兩種動態函數創建技術:closures和反射。 closures允許存取閉包作用域內的變量,而反射可使用FuncOf函數建立新函數。這些技術在自訂HTTP路由器、實現高度可自訂的系統和建置可插拔的元件方面非常有用。

C++ 函數命名中參數順序的考慮 C++ 函數命名中參數順序的考慮 Apr 24, 2024 pm 04:21 PM

在C++函數命名中,考慮參數順序至關重要,可提高可讀性、減少錯誤並促進重構。常見的參數順序約定包括:動作-物件、物件-動作、語意意義和遵循標準函式庫。最佳順序取決於函數目的、參數類型、潛在混淆和語言慣例。

如何在Java中寫出高效和可維護的函數? 如何在Java中寫出高效和可維護的函數? Apr 24, 2024 am 11:33 AM

編寫高效且可維護的Java函數的關鍵在於:保持簡潔。使用有意義的命名。處理特殊情況。使用適當的可見性。

excel函數公式大全 excel函數公式大全 May 07, 2024 pm 12:04 PM

1. SUM函數,用於對一列或一組單元格中的數字進行求和,例如:=SUM(A1:J10)。 2、AVERAGE函數,用於計算一列或一組儲存格中的數字的平均值,例如:=AVERAGE(A1:A10)。 3.COUNT函數,用於計算一列或一組單元格中的數字或文字的數量,例如:=COUNT(A1:A10)4、IF函數,用於根據指定的條件進行邏輯判斷,並返回相應的結果。

C++ 函式預設參數與可變參數的優缺點比較 C++ 函式預設參數與可變參數的優缺點比較 Apr 21, 2024 am 10:21 AM

C++函數中預設參數的優點包括簡化呼叫、增強可讀性、避免錯誤。缺點是限制靈活性、命名限制。可變參數的優點包括無限彈性、動態綁定。缺點包括複雜性更高、隱式型別轉換、除錯困難。

自訂 PHP 函數和預定義函數之間有什麼區別? 自訂 PHP 函數和預定義函數之間有什麼區別? Apr 22, 2024 pm 02:21 PM

自訂PHP函數與預定義函數的差異在於:作用域:自訂函數僅限於其定義範圍,而預定義函數可在整個腳本中存取。定義方式:自訂函數使用function關鍵字定義,而預先定義函數則由PHP核心定義。參數傳遞:自訂函數接收參數,而預先定義函數可能不需要參數。擴充性:自訂函數可以根據需要創建,而預定義函數是內建的且無法修改。

C++ 函式異常進階:客製化錯誤處理 C++ 函式異常進階:客製化錯誤處理 May 01, 2024 pm 06:39 PM

C++中的異常處理可透過自訂異常類別增強,提供特定錯誤訊息、上下文資訊以及根據錯誤類型執行自訂操作。定義繼承自std::exception的異常類,提供特定的錯誤訊息。使用throw關鍵字拋出自訂異常。在try-catch區塊中使用dynamic_cast將捕獲到的異常轉換為自訂異常類型。在實戰案例中,open_file函數會拋出FileNotFoundException異常,捕捉並處理該異常可提供更具體的錯誤訊息。

golang可變參數是否可以用於泛型函數? golang可變參數是否可以用於泛型函數? Apr 29, 2024 pm 02:06 PM

在Go中,變參可以用於泛型函數,允許建立可接受可變數量參數且適用於多種類型的泛型函數。例如,您可以建立泛型函數Mode,它會尋找給定清單中出現次數最多的元素:Mode接受可變數量的T類型元素。它透過為每個元素建立counts來統計元素計數。然後它找出出現次數最多的元素,並將其作為mode返回。在main函數中,可以為字串列表和整數列表呼叫Mode函數,它將分別傳回出現次數最多的字串和數字。

See all articles