深入理解javascript函數系列第四篇——ES6函數擴展

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/08/05/5738523.html
-Advertisement-
Play Games

[1]參數預設值 [2]rest參數 [3]擴展運算符 [4]箭頭函數 ...


×
目錄
[1]參數預設值 [2]rest參數 [3]擴展運算符[4]箭頭函數

前面的話

  ES6標準關於函數擴展部分,主要涉及以下四個方面:參數預設值、rest參數、擴展運算符和箭頭函數

 

參數預設值

  一般地,為參數設置預設值需進行如下設置

function log(x, y) {
  y = y || 'World';
  console.log(x, y);
}

  但這樣設置實際上是有問題的,如果y的值本身是假值(包括false、undefined、null、''、0、-0、NaN),則無法取得本身值

function log(x, y) {
  y = y || 'World';
  console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', NaN) // Hello World

  ES6允許為函數的參數設置預設值,即直接寫在參數定義的後面

function log(x, y = 'World') {
  console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', NaN) // Hello NaN

  [註意]參數變數是預設聲明的,所以不能用let或const再次聲明

function foo(x = 5) {
  let x = 1; //SyntaxError: Identifier 'x' has already been declared
  const x = 2; //SyntaxError: Identifier 'x' has already been declared
}

尾參數

  通常情況下,定義了預設值的參數,應該是函數的尾參數。因為這樣比較容易看出來,到底省略了哪些參數。如果非尾部的參數設置預設值,實際上這個參數是沒法省略的

function f(x = 1, y) {
  return [x, y];
}
f() // [1, undefined]
f(2) // [2, undefined])
f(, 1) // 報錯
f(undefined, 1) // [1, 1]

  如果傳入undefined,將觸發該參數等於預設值,null則沒有這個效果

function foo(x = 5, y = 6) {
  console.log(x, y);
}
foo(undefined, null)// 5 null

length

  指定了預設值以後,函數的length屬性,將返回沒有指定預設值的參數個數

(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2

  [註意]如果設置了預設值的參數不是尾參數,那麼length屬性也不再計入後面的參數了

(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1

作用域

  【1】如果參數預設值是一個變數,則該變數所處的作用域,與其他變數的作用域規則是一樣的,即先是當前函數的作用域,然後才是全局作用域

var x = 1;
function f(x, y = x) {
  console.log(y);
}
f(2) // 2

  【2】如果函數調用時,函數作用域內部的變數x沒有生成,則x指向全局變數

var x = 1;
function f(y = x) {
  var x = 2;
  console.log(y);
}
f() // 1

應用

  利用參數預設值,可以指定某一個參數不得省略,如果省略就拋出一個錯誤

function throwIfMissing() {
  throw new Error('Missing parameter');
}
function foo(mustBeProvided = throwIfMissing()) {
  return mustBeProvided;
}
foo()// Error: Missing parameter

  [註意]將參數預設值設為undefined,表明這個參數可以省略

function foo(optional = undefined) {
    //todo
}

 

rest參數

  ES6引入rest參數(形式為“...變數名”),用於獲取函數的多餘參數,這樣就不需要使用arguments對象了。rest參數搭配的變數是一個數組,該變數將多餘的參數放入數組中

function add(...values) {
  var sum = 0;
  for (var val of values) {
    sum += val;
  }
  return sum;
}
add(2, 5, 3) //10

  rest參數中的變數代表一個數組,所以數組特有的方法都可以用於這個變數

  下麵是一個利用rest參數改寫數組push方法的例子

function push(array, ...items) {
  items.forEach(function(item) {
    array.push(item);
    console.log(item);
  });
}
var a = [];
push(a, 1, 2, 3);

  函數的length屬性不包括rest參數

(function(a) {}).length  // 1
(function(...a) {}).length  // 0
(function(a, ...b) {}).length  // 1

  [註意]rest參數之後不能再有其他參數

//Uncaught SyntaxError: Rest parameter must be last formal parameter
function f(a, ...b, c) {
  //todo
}

 

擴展運算符

  擴展運算符(spread)是三個點(...)。它好比rest參數的逆運算,將一個數組轉為用逗號分隔的參數序列

console.log(...[1, 2, 3])// 1 2 3
console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5
[...document.querySelectorAll('div')]// [<div>, <div>, <div>]

  該運算符主要用於函數調用

function add(x, y) {
  return x + y;
}
var numbers = [4, 38];
add(...numbers) // 42

  Math.max方法簡化

// ES5
Math.max.apply(null, [14, 3, 77])

// ES6
Math.max(...[14, 3, 77])

//等同於
Math.max(14, 3, 77)

  push方法簡化

// ES5
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);

  擴展運算符可以將字元串轉為真正的數組

[...'hello']// [ "h", "e", "l", "l", "o" ]

 

箭頭函數

  關於箭頭函數的詳細介紹移步至此

 

參考資料

  《ECMAScript 6入門》 阮一峰


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • QStatusBa,狀態欄是位於主視窗的最下方,提供一個顯示工具提示等信息的地方。QMainWindow類裡面就有一個statusBar()函數,用於實現狀態欄的調用。以下例子都在QMainWindow的視窗前提下運行。 1.狀態欄添加 QLabel QLabel *msgLabel = new Q ...
  • QWhatsThis,為任何widget提供簡單的描述,回答"What's This?"這個問題。 示例:(在MainWindow下運行) 定義全局變數 QAction *newAct; QMenu *fileMenu; void MainWindow::creatActions() { newAc ...
  • 開發和測試向來就是一對冤家,再加上產品再添一把火,不吵才是奇跡呢。所以一般我們開發的時候儘可能的減少一些小的失誤,比如說獲取的數值為空,判定條件不充分、當然還有面對測試人員測試時將軟體暴力測試,出現一些網路解析數據的延遲有時也是無法避免的。可是這些確實是一些困擾。但是為了提高開發的效率,犯這些小錯誤 ...
  • 本文為原創文章,轉載請註明出處,謝謝 數據的發佈與訂閱 1、應用 服務端監聽數據改變,客戶端創建/更新節點數據,客戶端提供數據,服務端處理 2、原理 客戶端監控節點數據改變事件(例如配置信息,下圖的config節點),啟動時在伺服器節點下創建臨時節點(圖中servers下節點) 服務端監聽工作伺服器 ...
  • 1.定義 定義對象間一種一對多的依賴關係,使得當每一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新。 2.類圖 3.代碼示例 我們定義一個場景:熱水壺在燒開水,小孩和媽媽都關註燒開水的過程,各自有其處理方法。用while死迴圈一直輪詢雖然可以實現這樣的場景,但性能上讓人無法接受。 為方便 ...
  • ajax簡介 AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。Ajax不是一種新的編程語言,而是使用現有標準的新方法。AJAX可以在不重新載入整個頁面的情況下,與伺服器交換數據。這種非同步交互的 ...
  • soChange一款多很經典的幻燈片的jQuery插件。 實例預覽 引入文件 複製 使用方法 複製 複製 soChange參數 複製 soChange 即 simple object change ,對象切換插件,充分發揮css樣式的靈活性,不僅僅適用於圖片相冊,也適用於選項卡或文字類型的切換,以上 ...
  • js代碼: 游戲的對象 ,食物,蛇 ,游戲控制思路如下 (完整代碼在https://github.com/774044859yf/ObjectSnakeGame下載) var snake = { ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...