主頁 > 企業開發 > ES6

ES6

2022-11-27 07:37:44 企業開發

變數let、const

ES5 中,使用 var 定義變數( var 是 variable 的簡寫),

ES6 中,新增了 let 和 const 來定義變數:

  • let:定義變數,替代 var,

  • const:定義常量(定義后,不可修改),

1、let:定義變數

舉例 1:

{
    let a = 'hello';
}
console.log(a); // 列印結果報錯:Uncaught ReferenceError: a is not defined

上方代碼,列印報錯,

舉例 2:

var a = 2;
{
    let a = 3;
}

console.log(a); // 列印結果:2

通過上面兩個例子可以看出,用塊級作用域內, 用let 宣告的變數,只在區域起作用

經典面試題

let 可以防止資料污染,我們來看下面這個 for 回圈的經典面試題,

1、用 var 宣告變數:

for (var i = 0; i < 10; i++) {
    console.log('回圈體中:' + i);
}

console.log('回圈體外:' + i);

上方代碼的最后一行可以正常列印結果,且最后一行的列印結果是 10,說明回圈體外定義的變數 i,是全域作用域下的 i,

2、用 let 宣告變數:

for (let i = 0; i < 10; i++) {
    console.log('回圈體中:' + i); // // 每回圈一次,就會在 { } 所在的塊級作用域中,重新定義一個新的變數 i
}

console.log('回圈體外:' + i);

上方代碼的關鍵在于:每次回圈都會產生一個塊級作用域,每個塊級作用域中會重新定義一個新的變數 i

另外,上方代碼的最后一行,列印會報錯,因為用 let 定義的變數 i,只在{ }這個塊級作用域里生效,

總結:我們要習慣用 let 宣告,減少 var 宣告帶來的污染全域空間

為了進一步強調 let 不會帶來污染,需要說明的是:當我們定義了let a = 1時,如果我們在同一個作用域內繼續定義let a = 2,是會報錯的,

2、const:定義常量

在程式開發中,有些變數是希望宣告后,在業務層就不再發生變化,此時可以用 const 來定義常量,常量就是值(記憶體地址)不能變化的量,

舉例:

const name = 'smyhvae'; //定義常量

用 const 宣告的常量,只在區域(塊級作用域內)起作用;而且,用 const 宣告常量時,必須賦值,否則報錯,

let 和 const 的特點【重要】

  • 不屬于頂層物件 Window

  • 不允許重復宣告

  • 不存在變數提升 必須先定義后使用

  • 暫時性死區 當內部變數與外部你變數同名時,內部變數屏蔽外部變數

  • 支持塊級作用域 該變數在該作用域不會消失

相反, 用var宣告的變數:存在變數提升、可以重復宣告、沒有塊級作用域

var/let/const 的共同點

  • 全域作用域中定義的變數,可以在函式中使用,

  • 函式中宣告的變數,只能在函式及其子函式中使用,外部無法使用,

this 指向

this:是函式體內的內置物件(this只能出現在函式體內)

1、以函式的形式(包括普通函式、定時器函式、立即執行函式)呼叫時,this 的指向永遠都是 window,比如fun();相當于window.fun();

2、以方法的形式呼叫時,this 指向呼叫方法的那個物件

3、以建構式的形式呼叫時,this 指向實體物件

4、以事件系結函式的形式呼叫時,this 指向系結事件的物件

5、使用 call 和 apply 呼叫時,this 指向指定的那個物件

第 1 條的舉例

function fun() {
    console.log(this);
    console.log(this.name);
}

var obj1 = {
    name: 'smyh',
    sayName: fun,
};

var obj2 = {
    name: 'vae',
    sayName: fun,
};

var name = '全域的name屬性';

//以函式形式呼叫,this是window
fun(); //可以理解成 window.fun()

列印結果:

    Window
    全域的name屬性

上面的舉例可以看出,this 指向的是 window 物件,所以 this.name 指的是全域的 name,

第 2 條的舉例

function fun() {
    console.log(this);
    console.log(this.name);
}

var obj1 = {
    name: 'smyh',
    sayName: fun,
};

var obj2 = {
    name: 'vae',
    sayName: fun,
};

var name = '全域的name屬性';

//以方法的形式呼叫,this是呼叫方法的物件
obj2.sayName();

列印結果:

    Object
    vae

上面的舉例可以看出,this 指向的是 物件 obj2 ,所以 this.name 指的是 obj2.name,

ES6 箭頭函式中 this 的指向

ES6 中的箭頭函式并不使用上面的準則,而是會繼承外層函式呼叫的 this 系結(無論 this 系結到什么),

bind() 方法

bind() 方法的作用

bind() 方法不會呼叫函式,但是可以改變函式內部的 this 指向,

把call()、apply()、bind()這三個方法做一下對比,你會發現:實際開發中, bind() 方法使用得最為頻繁,如果有些函式,我們不需要立即呼叫,但是又想改變這個函式內部的this指向,此時用 bind() 是最為合適的,

語法:

新函式 = fn1.bind(想要將this指向哪里, 函式實參1, 函式實參2);

引數:

  • 第一個引數:在 fn1 函式運行時,指定 fn1 函式的this 指向,如果不需要改變 this 指向,則傳 null,

  • 其他引數:fn1 函式的實參,

解釋:它不會呼叫 fn1 函式,但會回傳 由指定this 和指定實參的原函式拷貝,可以看出, bind() 方法是有回傳值的,

箭頭函式

定義箭頭函式的語法

語法:

(引數1, 引數2 ...) => { 函式體 }

解釋:

  • 如果有且僅有 1 個形參,則()可以省略

  • 如果函式體內有且僅有 1 條陳述句,則{}可以省略,但前提是,這條陳述句必須是 return 陳述句,

    舉例

    寫法 1、定義和呼叫函式:(傳統寫法)

    function fn1(a, b) {
        console.log('haha');
        return a + b;
    }
    
    console.log(fn1(1, 2)); //輸出結果:3
    

    寫法 2、定義和呼叫函式:(ES6 中的寫法)

    const fn2 = (a, b) => {
        console.log('haha');
        return a + b;
    };
    
    console.log(fn2(1, 2)); //輸出結果:3
    

    上面的兩種寫法,效果是一樣的,

    從上面的箭頭函式中,我們可以很清晰地看到變數名、引數名、函式體,

    【重要】在箭頭函式中,如果方法體內只有一句話,且這句話是 return 陳述句,那就可以把 {}省略,寫法如下:

    const fn2 = (a, b) => a + b;
    
    console.log(fn2(1, 2)); //輸出結果:3
    

    在箭頭函式中,如果形參只有一個引數,則可以把()省略,寫法如下:

    const fn2 = (a) => {
        console.log('haha');
        return a + 1;
    };
    
    console.log(fn2(1)); //輸出結果:2
    

    箭頭函式的 this 的指向

    ES6 之前的普通函式中:this 指向的是函式被呼叫的物件(也就是說,誰呼叫了函式,this 就指向誰),

    而 ES6 的箭頭函式中:箭頭函式本身不系結 this,this 指向的是箭頭函式定義位置的 this(也就是說,箭頭函式在哪個位置定義的,this 就跟這個位置的 this 指向相同),

    const obj = { name: '123' };
    
    function fn1() {
        console.log(this); // 第一個 this
        return () => {
            console.log(this); // 第二個 this
        };
    }
    
    const fn2 = fn1.call(obj);
    fn2();
    

    列印結果:

    obj
    obj
    

    代碼解釋:

    上面的代碼中,箭頭函式是在 fn1()函式里面定義的,所以第二個 this 跟 第一個 this 指向的是同一個位置,又因為,在執行 fn1.call(obj)之后,第一個 this 就指向了 obj,所以第二個 this 也是指向 了 obj,

變數的解構賦值

解構賦值:ES6 允許我們,按照一一對應的方式,從陣列或者物件中提取值,再將提取出來的值賦值給變數,

解構:分解資料結構;賦值:給變數賦值,

解構賦值在實際開發中可以大量減少我們的代碼量,并且讓程式結構更清晰,

陣列的解構賦值

陣列的結構賦值:將陣列中的值按照位置提取出來,然后賦值給變數,

語法

在 ES6 之前,當我們在為一組變數賦值時,一般是這樣寫:

var a = 1;
var b = 2;
var c = 3;

或者是這樣寫:

var arr = [1, 2, 3];

var a = arr[0];
var b = arr[1];
var c = arr[2];

現在有了 ES6 之后,我們可以通過陣列解構的方式進行賦值:(根據位置進行一一對應)

let [a, b, c] = [1, 2, 3];

二者的效果是一樣的,但明顯后者的代碼更簡潔優雅,

物件的解構賦值

物件的結構賦值:將物件中的值按照屬性匹配的方式提取出來,然后賦值給變數,

語法

在 ES6 之前,我們從介面拿到 json 資料后,一般這么賦值:

var name = json.name;

var age = json.age;

var sex = json.sex;

上面這種寫法,過于麻煩了,

現在,有了 ES6 之后,我們可以使用物件解構的方式進行賦值,舉例如下:

const person = { name: 'qianfan', age: 25, sex: '男' };
let { name, age, sex } = person; // 物件的結構賦值

console.log(name); // 列印結果:qianguyihao
console.log(age); // 列印結果:28
console.log(sex); // 列印結果:男

上方代碼可以看出,物件的解構與陣列的結構,有一個重要的區別:陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,是根據鍵來取值的,

圓括號的使用

如果變數 foo 在解構之前就已經定義了,此時你再去解構,就會出現問題,下面是錯誤的代碼,編譯會報錯:

	let foo = 'haha';
	{ foo } = { foo: 'smyhvae' };
	console.log(foo);

要解決報錯,只要在解構的陳述句外邊,加一個圓括號即可:

let foo = 'haha';
({ foo } = { foo: 'smyhvae' });
console.log(foo); //輸出結果:smyhvae

字串解構

字串也可以解構,這是因為,此時字串被轉換成了一個類似陣列的物件,舉例如下:

const [a, b, c, d] = 'hello';
console.log(a);
console.log(b);
console.log(c);

console.log(typeof a); //輸出結果:string

列印結果:

h
e
l
string

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/538478.html

標籤:其他

上一篇:web系統添加盲水印

下一篇:Nginx同域名下配置多個Vue專案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more