成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ES6的常用語法

gougoujiang / 1932人閱讀

摘要:和命令和類似于中的的使用都是用來聲明變量的,只是都存在各自的特殊用法。解構(gòu)數(shù)組和對象是中最常用也是最重要表示形式。實例生成以后,可以用方法分別指定狀態(tài)和狀態(tài)的回調(diào)函數(shù)。這個迭代器對象擁有一個叫做的方法來幫助你重啟函數(shù)并得到下一個值。

let和const命令

let和const類似于javascript中的var的使用,都是用來聲明變量的,只是都存在各自的特殊用法。

在javascript中只有全局作用域和函數(shù)作用域,例如:

var name = "one";//全局變量
while(true){
     name  = "two";
     console.log(name);//two,內(nèi)層變量覆蓋了外層變量
     break;
}
console.log(name);//two,

不出意料,兩次輸出結(jié)果都是two。

而ES6帶來的一個新特性:

let:為javascript添加一個塊級作用域

使用let聲明的變量,只作用于使用了let命令的代碼塊:

var name = "one";//全局變量
while(true){
     let name  = "two";
     console.log(name);//two,
     break;
}
console.log(name);//one

const :聲明一個只讀的常量。一旦聲明,常量的值就不能改變

const PI = Math.PI;
console.log(PI); //3.141592653589793
PI = 666; //報錯Module build failed: SyntaxError: "PI" is read-only
模板字符串

es6模板字符簡直是開發(fā)者的福音,解決了ES5在字符串功能上的痛點。

基本的字符串格式化,將表達式嵌入字符串中進行拼接。用${}來界定。例如:

 //es5 
var name = "Archer"
console.log("hello" + name)

//es6
const name = "Archer"
console.log(`hello ${name}`) //hello Archer

在ES5時我們通過反斜杠()來做多行字符串或者字符串一行行拼接。ES6反引號(``)直接搞定。

// es5
var msg = "Hi 
Archer!
"

// es6
const template = `
hello Archer
`

對于字符串es6當然也提供了很多厲害的方法,列舉幾個常用的:

// includes:判斷是否包含然后直接返回布爾值
let str = "hahay"
console.log(str.includes("y")) // true

// repeat: 獲取字符串重復n次
let s = "ha"
console.log(s.repeat(3)) // "hahaha"
箭頭函數(shù)

ES6很有意思的一部分就是函數(shù)的快捷寫法,也就是箭頭函數(shù),箭頭函數(shù)最直觀的三個特點:

不需要function關(guān)鍵字來創(chuàng)建函數(shù)

省略return關(guān)鍵字

繼承當前上下文的 this 關(guān)鍵字

let arr = [1,2,3];

arr.map(item => item + 1)
//等同于
arr.map(function(item){
    return item + 1
})

當函數(shù)有且僅有一個參數(shù)的時候,是可以省略掉(),當函數(shù)返回有且僅有一個表達式的時候可以省略{};例如:

//參數(shù)name就沒有括號
var people = name => "hello" + name
函數(shù)的默認值

ES6 之前,不能直接為函數(shù)的參數(shù)指定默認值,只能采用變通的方法。例如:

function log(x, y) {
    y = y || "Archer";
    console.log(x, y);
}

log("Hello") // Hello Archer
log("Hello", "China") // Hello China
log("Hello", "") // Hello Archer

上面代碼檢查函數(shù)log的參數(shù)y有沒有賦值,如果沒有,則指定默認值為Archer。這種寫法的缺點在于,如果參數(shù)y賦值了,但是對應的布爾值為false,則該賦值不起作用。就像上面代碼的最后一行,參數(shù)y等于空字符,結(jié)果被改為默認值。

現(xiàn)在 ES6 允許為函數(shù)的參數(shù)設(shè)置默認值,即直接寫在參數(shù)定義的后面,為賦值提供了簡便的方法。例如:

function log(x, y = "Archer") {
    console.log(x, y);
}

log("Hello") // Hello Archer
log("Hello", "China") // Hello China
log("Hello", "") // Hello

可以看到,ES6 的寫法比 ES5 簡潔許多,而且非常自然。下面是另一個例子。

function Point(x = 0, y = 0) {
    this.x = x;
    this.y = y;
}

const p = new Point();
p // { x: 0, y: 0 }
展開運算符

...展開運算符,有兩種層面

展開運算符(spread operator)作用是和字面意思一樣,就是把東西展開。可以用在array和object上都行。例如:

let a = [1,2,3];  
let b = [0, ...a, 4]; // [0,1,2,3,4]  
  
let obj = { a: 1, b: 2 };  
let obj2 = { ...obj, c: 3 }; // { a:1, b:2, c:3 }  
let obj3 = { ...obj, a: 3 }; // { a:3, b:2 }  

剩余操作符(rest operator)是解構(gòu)的一種,意思就是把剩余的東西放到一個array里面賦值給它。一般只針對array的解構(gòu)。例如:

let a = [1,2,3];  
let [b, ...c] = a;  
b; // 1  
c; // [2,3]  
  
// 也可以  
let a = [1,2,3];  
let [b, ...[c,d,e]] = a;  
b; // 1  
c; // 2  
d; // 3  
e; // undefined  
  
// 也可以  
function test(a, ...rest){  
  console.log(a); // 1  
  console.log(rest); // [2,3]  
}  
  
test(1,2,3) 
對象的擴展

對象初始化簡寫

ES5我們對于對象都是以鍵值對的形式書寫,是有可能出現(xiàn)鍵值對重名的。例如:

function people(name, age) {
    return {
        name: name,
        age: age
    };
}

鍵值對重名,ES6可以簡寫如下:

function people(name, age) {
    return {
        name,
        age
    };
}

ES6 同樣改進了為對象字面量方法賦值的語法。ES5為對象添加方法:

const people = {
    name: "lux",
    getName: function() {
        console.log(this.name)
    }
}

ES6通過省略冒號與 function 關(guān)鍵字,將這個語法變得更簡潔:

const people = {
    name: "lux",
    getName () {
        console.log(this.name)
    }
}

ES6 對象提供了Object.assign()這個方法來實現(xiàn)淺復制。Object.assign()可以把任意多個源對象自身可枚舉的屬性拷貝給目標對象,然后返回目標對象。第一參數(shù)即為目標對象。在實際項目中,我們?yōu)榱瞬桓淖冊磳ο?。一般會把目標對象傳為{}。

const obj = Object.assign({}, objA, objB)
解構(gòu)

數(shù)組和對象是JS中最常用也是最重要表示形式。為了簡化提取信息,ES6新增了解構(gòu),這是將一個數(shù)據(jù)結(jié)構(gòu)分解為更小的部分的過程。

ES5我們提取對象中的信息形式如下:

const people = {
    name: "Archer",
    age: 28
}

const name = people.name
const age = people.age
console.log(name + " --- " + age) //"Archer --- 28"

在ES6之前我們就是這樣獲取對象信息的,一個一個獲取?,F(xiàn)在,解構(gòu)能讓我們從對象或者數(shù)組里取出數(shù)據(jù)存為變量。例如:

 //對象
const people = {
    name: "Archer",
    age: 28
}
const { name, age } = people
console.log(`${name} --- ${age}`)
//數(shù)組
const color = ["red", "blue"]
const [first, second] = color
console.log(first) //"red"
console.log(second) //"blue"
import 和 export

import導入模塊、export導出模塊

//全部導入
import people from "./example"

//有一種特殊情況,即允許你將整個模塊當作單一對象進行導入
//該模塊的所有導出都會作為對象的屬性存在
import * as example from "./example.js"
console.log(example.name)
console.log(example.age)
console.log(example.getName())

//導入部分
import {name, age} from "./example"

// 導出默認, 有且只有一個默認
export default App

// 部分導出
export class App extend Component {};

導入的時候有沒有大括號的區(qū)別是什么。下面是我在工作中的總結(jié):

當用export default people導出時,就用 import people 導入(不帶大括號)

一個文件里,有且只能有一個export default。但可以有多個export。

當用export name 時,就用import { name }導入(記得帶上大括號)

當一個文件里,既有一個export default people, 又有多個export name 或者 export
age時,導入就用 import people, { name, age }

當一個文件里出現(xiàn)n多個 export 導出很多模塊,導入時除了一個一個導入,也可以用import * as example

Promise

在promise之前代碼過多的回調(diào)或者嵌套,可讀性差、耦合度高、擴展性低。通過Promise機制,扁平化的代碼機構(gòu),大大提高了代碼可讀性;用同步編程的方式來編寫異步代碼,保存線性的代碼邏輯,極大的降低了代碼耦合性而提高了程序的可擴展性。

Promise對象有以下兩個特點:

對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失?。V挥挟惒讲僮鞯慕Y(jié)果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。

一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果,這時就稱為
resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對Promise對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監(jiān)聽,是得不到結(jié)果的。

說白了就是用同步的方式去寫異步代碼,下面代碼創(chuàng)造了一個Promise實例:

const promise = new Promise(function(resolve, reject) {
    if (/* 異步操作成功 */){
        resolve(value);
    } else {
        reject(error);
    }
});

Promise構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject。它們是兩個函數(shù),由 JavaScript 引擎提供,不用自己部署。

resolve函數(shù)的作用是,將Promise對象的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸?pending 變?yōu)?resolved),在異步操作成功時調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去;reject函數(shù)的作用是,將Promise對象的狀態(tài)從“未完成”變?yōu)椤笆 保磸?pending 變?yōu)?rejected),在異步操作失敗時調(diào)用,并將異步操作報出的錯誤,作為參數(shù)傳遞出去。

Promise實例生成以后,可以用then方法分別指定resolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù)。

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

下面是一個Promise對象的簡單例子,timeout方法返回一個Promise實例,表示一段時間以后才會發(fā)生的結(jié)果。過了指定的時間(ms參數(shù))以后,Promise實例的狀態(tài)變?yōu)閞esolved,就會觸發(fā)then方法綁定的回調(diào)函數(shù)。:

function timeout(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms, "done");
    });
}

timeout(100).then((value) => {
    console.log(value);
});
Generators

生成器( generator)是能返回一個迭代器的函數(shù)。生成器函數(shù)也是一種函數(shù),最直觀的表現(xiàn)就是比普通的function多了個星號*,在其函數(shù)體內(nèi)可以使用yield關(guān)鍵字,有意思的是函數(shù)會在每個yield后暫停。

這里生活中有一個比較形象的例子。咱們到銀行辦理業(yè)務時候都得向大廳的機器取一張排隊號。你拿到你的排隊號,機器并不會自動為你再出下一張票。也就是說取票機“暫停”住了,直到下一個人再次喚起才會繼續(xù)吐票。

說說迭代器。當你調(diào)用一個generator時,它將返回一個迭代器對象。這個迭代器對象擁有一個叫做next的方法來幫助你重啟generator函數(shù)并得到下一個值。next方法不僅返回值,它返回的對象具有兩個屬性:done和value。value是你獲得的值,done用來表明你的generator是否已經(jīng)停止提供值。繼續(xù)用剛剛?cè)∑钡睦?,每張排隊號就是這里的value,打印票的紙是否用完就這是這里的done。

// 生成器
function *createIterator() {
    yield 1;
    yield 2;
    yield 3;
}

// 生成器能像正規(guī)函數(shù)那樣被調(diào)用,但會返回一個迭代器
let iterator = createIterator();

console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3

那生成器和迭代器又有什么用處呢?

圍繞著生成器的許多興奮點都與異步編程直接相關(guān)。異步調(diào)用對于我們來說是很困難的事,我們的函數(shù)并不會等待異步調(diào)用完再執(zhí)行,你可能會想到用回調(diào)函數(shù),(當然還有其他方案比如Promise比如Async/await)。

生成器可以讓我們的代碼進行等待。就不用嵌套的回調(diào)函數(shù)。使用generator可以確保當異步調(diào)用在我們的generator函數(shù)運行一下行代碼之前完成時暫停函數(shù)的執(zhí)行。

那么問題來了,咱們也不能手動一直調(diào)用next()方法,你需要一個能夠調(diào)用生成器并啟動迭代器的方法。就像這樣子的:

function run(taskDef) { //taskDef即一個生成器函數(shù)
    // 創(chuàng)建迭代器,讓它在別處可用
    let task = taskDef();

    // 啟動任務
    let result = task.next();

    // 遞歸使用函數(shù)來保持對 next() 的調(diào)用
    function step() {

        // 如果還有更多要做的
        if (!result.done) {
            result = task.next();
            step();
        }
    }

    // 開始處理過程
    step();

}

生成器與迭代器最有趣、最令人激動的方面,或許就是可創(chuàng)建外觀清晰的異步操作代碼。你不必到處使用回調(diào)函數(shù),而是可以建立貌似同步的代碼,但實際上卻使用 yield 來等待異步操作結(jié)束。

總結(jié)

ES6的特性遠不止于此,但對于我們?nèi)粘5拈_發(fā)開說,這已經(jīng)是夠夠的了,還有很多有意思的方法。比如for of,Iterator...等等。

來都來了點一下贊吧,你的贊是對我最大的鼓勵^_^

希望更全面了解es6伙伴們可以去看阮一峰所著的電子書ECMAScript 6入門

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/94914.html

相關(guān)文章

  • ES6常用語法整合

    摘要:說到肯定是先介紹了,據(jù)阮一峰老師介紹到,是一個廣泛使用的轉(zhuǎn)碼器,可以將代碼轉(zhuǎn)為代碼,從而在現(xiàn)有環(huán)境執(zhí)行。輸出其他還有等可以查看阮一峰的入門 ES6也出來有一會時間了,他新增的語法糖也的確大大提高了開發(fā)者的效率,今天就總結(jié)一些自己用到最多的。 說到ES6肯定是先介紹Babel了,據(jù)阮一峰老師介紹到,Babel是一個廣泛使用的轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼,從而在現(xiàn)有環(huán)境執(zhí)行。這意...

    張遷 評論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0
  • [ ES6 ] 快速掌握常用 ES6 (二)

    摘要:本系列文章適合快速掌握入門語法,想深入學習的小伙伴可以看看阮一峰老師的入門本篇文章是對之前文章的一個補充,可以使代碼更簡潔函數(shù)參數(shù)默認值在傳統(tǒng)語法中如果想設(shè)置函數(shù)默認值一般我們采用判斷的形式在新的語法中我們可以在參數(shù)聲明的同時賦予默認值參數(shù) 本系列文章適合快速掌握 ES6 入門語法,想深入學習 ES6 的小伙伴可以看看阮一峰老師的《ECMAScript 6 入門》 本篇文章是對之前文章...

    hidogs 評論0 收藏0
  • 工作中常用es6+特性

    摘要:結(jié)合工作中使用情況,簡單對進行一些復習總結(jié),包括常用的語法,等,以及短時間內(nèi)要上手需要重點學習的知識點不同工作環(huán)境可能有一些差別,主要參考鏈接是阮一峰的博客以及外文博客阮老師大部分文章是直接翻譯的這個博客簡介先說一下,是一個標準化組織,他們 結(jié)合工作中使用情況,簡單對es6進行一些復習總結(jié),包括常用的語法,api等,以及短時間內(nèi)要上手需要重點學習的知識點(不同工作環(huán)境可能有一些差別),...

    xcold 評論0 收藏0
  • es6常用語法

    摘要:革命伴隨著到來的是一場語法革命請忘記,統(tǒng)一使用聲明變量和函數(shù)解構(gòu)解構(gòu)帶來了簡潔的賦值方式,在任何聲明變量的地方都可以使用解構(gòu)賦值。 革命 伴隨著es6到來的是一場語法革命! let const 請忘記var,統(tǒng)一使用let,const聲明變量和函數(shù) let foo = `new` let bar = function(){} 解構(gòu) 解構(gòu)帶來了簡潔的賦值方式,在任何聲明變量的地方都可以使...

    Bmob 評論0 收藏0
  • 實例感受-es6常用語法和優(yōu)越性

    摘要:在重寫完了的時候,就個人總結(jié)了一下常用的一些常用的語法和比優(yōu)越的方面。參數(shù)字符串是否在原字符串的尾部返回布爾值。第一個大于的成員的索引方法,用于某個數(shù)組是否包含給定的值,返回一個布爾值。 1.前言 前幾天,用es6的語法重寫了我的一個代碼庫,說是重寫,其實改動的并不多,工作量不大。在重寫完了的時候,就個人總結(jié)了一下es6常用的一些常用的語法和比es5優(yōu)越的方面。下面提到的語法可能也就是...

    fsmStudy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<