ES6篱蝇、ES7贺待、ES8學習指南

概述

ES全稱ECMAScript,ECMAScript是ECMA制定的標準化腳本語言零截。目前JavaScript使用的ECMAScript版本為ECMAScript-262狠持。

ECMAScript 標準建立在一些原有的技術上,最為著名的是 JavaScript (網景) 和 JScript (微軟)瞻润。它最初由網景的 Brendan Eich 發(fā)明,第一次出現是在網景的 Navigator 2.0 瀏覽器上。Netscape 2.0 以及微軟 Internet Explorer 3.0 后序的所有瀏覽器上都有它的身影绍撞。

ECMAScript版本 發(fā)布時間 新增特性
ECMAScript 2009(ES5) 2009年11月 擴展了Object正勒、Array、Function的功能等
ECMAScript 2015(ES6) 2015年6月 類傻铣,模塊化章贞,箭頭函數,函數參數默認值等
ECMAScript 2016(ES7) 2016年3月 includes非洲,指數操作符
ECMAScript 2017(ES8) 2017年6月 async/await鸭限,Object.values(),Object.entries()两踏,String padding等

了解這些特性败京,不僅能使我們的編碼更加的符合規(guī)范,而且能提高我們Coding的效率梦染。

ES6的特性

ES6的特性比較多赡麦,在 ES5 發(fā)布近 6 年(2009-11 至 2015-6)之后才將其標準化。兩個發(fā)布版本之間時間跨度很大帕识,所以ES6中的特性比較多泛粹。

在這里列舉幾個常用的:

  • 模塊化
  • 箭頭函數
  • 函數參數默認值
  • 模板字符串
  • 解構賦值
  • 延展操作符
  • 對象屬性簡寫
  • Promise
  • Let與Const

1.類(class)

對熟悉Java,object-c肮疗,c#等純面向對象語言的開發(fā)者來說晶姊,都會對class有一種特殊的情懷。ES6 引入了class(類)伪货,讓JavaScript的面向對象編程變得更加簡單和易于理解们衙。

 class Animal {
    // 構造函數,實例化的時候將會被調用超歌,如果不指定砍艾,那么會有一個不帶參數的默認構造函數.
    constructor(name,color) {
      this.name = name;
      this.color = color;
    }
    // toString 是原型對象上的屬性
    toString() {
      console.log('name:' + this.name + ',color:' + this.color);

    }
  }

 var animal = new Animal('dog','white');//實例化Animal
 animal.toString();

 console.log(animal.hasOwnProperty('name')); //true
 console.log(animal.hasOwnProperty('toString')); // false
 console.log(animal.__proto__.hasOwnProperty('toString')); // true

 class Cat extends Animal {
  constructor(action) {
    // 子類必須要在constructor中指定super 函數,否則在新建實例的時候會報錯.
    // 如果沒有置頂consructor,默認帶super函數的constructor將會被添加巍举、
    super('cat','white');
    this.action = action;
  }
  toString() {
    console.log(super.toString());
  }
 }

 var cat = new Cat('catch')
 cat.toString();

 // 實例cat 是 Cat 和 Animal 的實例脆荷,和Es5完全一致。
 console.log(cat instanceof Cat); // true
 console.log(cat instanceof Animal); // true

2.模塊化(Module)

ES5不支持原生的模塊化懊悯,在ES6中模塊作為重要的組成部分被添加進來蜓谋。模塊的功能主要由 export 和 import 組成。每一個模塊都有自己單獨的作用域炭分,模塊之間的相互調用關系是通過 export 來規(guī)定模塊對外暴露的接口桃焕,通過import來引用其它模塊提供的接口。同時還為模塊創(chuàng)造了命名空間捧毛,防止函數的命名沖突观堂。

導出(export)

ES6允許在一個模塊中使用export來導出多個變量或函數让网。

導出變量

//test.js
export var name = 'Rainbow'

心得:ES6不僅支持變量的導出,也支持常量的導出师痕。 export const sqrt = Math.sqrt;//導出常量

ES6將一個文件視為一個模塊溃睹,上面的模塊通過 export 向外輸出了一個變量。一個模塊也可以同時往外面輸出多個變量胰坟。

 //test.js
 var name = 'Rainbow';
 var age = '24';
 export {name, age};

導出函數

// myModule.js
export function myModule(someArg) {
  return someArg;
}

導入(import)

定義好模塊的輸出以后就可以在另外一個模塊通過import引用因篇。

import {myModule} from 'myModule';// main.js
import {name,age} from 'test';// test.js

心得:一條import 語句可以同時導入默認函數和其它變量。import defaultMethod, { otherMethod } from 'xxx.js';

3.箭頭(Arrow)函數

這是ES6中最令人激動的特性之一笔横。=>不只是關鍵字function的簡寫竞滓,它還帶來了其它好處。箭頭函數與包圍它的代碼共享同一個this,能幫你很好的解決this的指向問題吹缔。有經驗的JavaScript開發(fā)者都熟悉諸如var self = this;var that = this這種引用外圍this的模式商佑。但借助=>,就不需要這種模式了涛菠。

箭頭函數的結構

箭頭函數的箭頭=>之前是一個空括號莉御、單個的參數名、或用括號括起的多個參數名俗冻,而箭頭之后可以是一個表達式(作為函數的返回值)礁叔,或者是用花括號括起的函數體(需要自行通過return來返回值,否則返回的是undefined)迄薄。

// 箭頭函數的例子
()=>1
v=>v+1
(a,b)=>a+b
()=>{
    alert("foo");
}
e=>{
    if (e == 0){
        return 0;
    }
    return 1000/e;
}

心得:不論是箭頭函數還是bind琅关,每次被執(zhí)行都返回的是一個新的函數引用,因此如果你還需要函數的引用去做一些別的事情(譬如卸載監(jiān)聽器)讥蔽,那么你必須自己保存這個引用涣易。

卸載監(jiān)聽器時的陷阱

錯誤的做法

class PauseMenu extends React.Component{
    componentWillMount(){
        AppStateIOS.addEventListener('change', this.onAppPaused.bind(this));
    }
    componentWillUnmount(){
        AppStateIOS.removeEventListener('change', this.onAppPaused.bind(this));
    }
    onAppPaused(event){
    }
}

正確的做法

class PauseMenu extends React.Component{
    constructor(props){
        super(props);
        this._onAppPaused = this.onAppPaused.bind(this);
    }
    componentWillMount(){
        AppStateIOS.addEventListener('change', this._onAppPaused);
    }
    componentWillUnmount(){
        AppStateIOS.removeEventListener('change', this._onAppPaused);
    }
    onAppPaused(event){
    }
}

除上述的做法外,我們還可以這樣做:

class PauseMenu extends React.Component{
    componentWillMount(){
        AppStateIOS.addEventListener('change', this.onAppPaused);
    }
    componentWillUnmount(){
        AppStateIOS.removeEventListener('change', this.onAppPaused);
    }
    onAppPaused = (event) => {
        //把函數直接作為一個arrow function的屬性來定義冶伞,初始化的時候就綁定好了this指針
    }
}

需要注意的是:不論是bind還是箭頭函數新症,每次被執(zhí)行都返回的是一個新的函數引用,因此如果你還需要函數的引用去做一些別的事情(譬如卸載監(jiān)聽器)响禽,那么你必須自己保存這個引用徒爹。

4.函數參數默認值

ES6支持在定義函數的時候為其設置默認值:

function foo(height = 50, color = 'red')
{
    // ...
}

不使用默認值:

function foo(height, color)
{
    var height = height || 50;
    var color = color || 'red';
    //...
}

這樣寫一般沒問題,但當參數的布爾值為false時芋类,就會有問題了隆嗅。比如,我們這樣調用foo函數:

foo(0, "")

因為0的布爾值為false侯繁,這樣height的取值將是50胖喳。同理color的取值為‘red’。

所以說贮竟,函數參數默認值不僅能是代碼變得更加簡潔而且能規(guī)避一些問題丽焊。

5.模板字符串

ES6支持模板字符串较剃,使得字符串的拼接更加的簡潔、直觀粹懒。

不使用模板字符串:

var name = 'Your name is ' + first + ' ' + last + '.'

使用模板字符串:

var name = `Your name is ${first} ${last}.`

在ES6中通過${}就可以完成字符串的拼接重付,只需要將變量放在大括號之中。

6.解構賦值

解構賦值語法是JavaScript的一種表達式凫乖,可以方便的從數組或者對象中快速提取值賦給定義的變量。

獲取數組中的值

從數組中獲取值并賦值到變量中弓颈,變量的順序與數組中對象順序對應帽芽。

var foo = ["one", "two", "three", "four"];

var [one, two, three] = foo;
console.log(one); // "one"
console.log(two); // "two"
console.log(three); // "three"

//如果你要忽略某些值,你可以按照下面的寫法獲取你想要的值
var [first, , , last] = foo;
console.log(first); // "one"
console.log(last); // "four"

//你也可以這樣寫
var a, b; //先聲明變量

[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2

如果沒有從數組中的獲取到值翔冀,你可以為變量設置一個默認值导街。

var a, b;

[a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7

通過解構賦值可以方便的交換兩個變量的值。

var a = 1;
var b = 3;

[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1

獲取對象中的值

const student = {
  name:'Ming',
  age:'18',
  city:'Shanghai'
};

const {name,age,city} = student;
console.log(name); // "Ming"
console.log(age); // "18"
console.log(city); // "Shanghai"

7.延展操作符(Spread operator)

延展操作符...可以在函數調用/數組構造時, 將數組表達式或者string在語法層面展開纤子;還可以在構造對象時, 將對象表達式按key-value的方式展開搬瑰。

語法

函數調用:

myFunction(...iterableObj);

數組構造或字符串:

[...iterableObj, '4', ...'hello', 6];

構造對象時,進行克隆或者屬性拷貝(ECMAScript 2018規(guī)范新增特性):

let objClone = { ...obj };

應用場景

在函數調用時使用延展操作符

function sum(x, y, z) {
  return x + y + z;
}
const numbers = [1, 2, 3];

//不使用延展操作符
console.log(sum.apply(null, numbers));

//使用延展操作符
console.log(sum(...numbers));// 6

構造數組

沒有展開語法的時候,只能組合使用 push控硼,splice泽论,concat 等方法,來將已有數組元素變成新數組的一部分卡乾。有了展開語法, 構造新數組會變得更簡單翼悴、更優(yōu)雅:

const stuendts = ['Jine','Tom'];
const persons = ['Tony',... stuendts,'Aaron','Anna'];
conslog.log(persions)// ["Tony", "Jine", "Tom", "Aaron", "Anna"]

和參數列表的展開類似, ... 在構造字數組時, 可以在任意位置多次使用。

數組拷貝

var arr = [1, 2, 3];
var arr2 = [...arr]; // 等同于 arr.slice()
arr2.push(4);
console.log(arr2)//[1, 2, 3, 4]

展開語法和 Object.assign() 行為一致, 執(zhí)行的都是淺拷貝(只遍歷一層)幔妨。

連接多個數組

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
var arr3 = [...arr1, ...arr2];// 將 arr2 中所有元素附加到 arr1 后面并返回
//等同于
var arr4 = arr1.concat(arr2);

在ECMAScript 2018中延展操作符增加了對對象的支持

var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };

var clonedObj = { ...obj1 };
// 克隆后的對象: { foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// 合并后的對象: { foo: "baz", x: 42, y: 13 }

在React中的應用

通常我們在封裝一個組件時鹦赎,會對外公開一些 props 用于實現功能。大部分情況下在外部使用都應顯示的傳遞 props 误堡。但是當傳遞大量的props時古话,會非常繁瑣,這時我們可以使用 ...(延展操作符,用于取出參數對象的所有可遍歷屬性) 來進行傳遞锁施。

一般情況下我們應該這樣寫

<CustomComponent name ='Jine' age ={21} />

使用 … 陪踩,等同于上面的寫法

const params = {
        name: 'Jine',
        age: 21
    }

<CustomComponent {...params} />

配合解構賦值避免傳入一些不需要的參數

var params = {
    name: '123',
    title: '456',
    type: 'aaa'
}

var { type, ...other } = params;

<CustomComponent type='normal' number={2} {...other} />
//等同于
<CustomComponent type='normal' number={2} name='123' title='456' />

8.對象屬性簡寫

在ES6中允許我們在設置一個對象的屬性的時候不指定屬性名。

不使用ES6

const name='Ming',age='18',city='Shanghai';

const student = {
    name:name,
    age:age,
    city:city
};
console.log(student);//{name: "Ming", age: "18", city: "Shanghai"}

對象中必須包含屬性和值沾谜,顯得非常冗余膊毁。

使用ES6

const name='Ming',age='18',city='Shanghai';

const student = {
    name,
    age,
    city
};
console.log(student);//{name: "Ming", age: "18", city: "Shanghai"}

對象中直接寫變量,非常簡潔基跑。

9.Promise

Promise 是異步編程的一種解決方案婚温,比傳統(tǒng)的解決方案callback更加的優(yōu)雅。它最早由社區(qū)提出和實現的媳否,ES6 將其寫進了語言標準栅螟,統(tǒng)一了用法荆秦,原生提供了Promise對象。

不使用ES6

嵌套兩個setTimeout回調函數:

setTimeout(function()
{
    console.log('Hello'); // 1秒后輸出"Hello"
    setTimeout(function()
    {
        console.log('Hi'); // 2秒后輸出"Hi"
    }, 1000);
}, 1000);

使用ES6

var waitSecond = new Promise(function(resolve, reject)
{
    setTimeout(resolve, 1000);
});

waitSecond
    .then(function()
    {
        console.log("Hello"); // 1秒后輸出"Hello"
        return waitSecond;
    })
    .then(function()
    {
        console.log("Hi"); // 2秒后輸出"Hi"
    });

上面的的代碼使用兩個then來進行異步編程串行化力图,避免了回調地獄:

10.支持let與const

在之前JS是沒有塊級作用域的步绸,const與let填補了這方便的空白,const與let都是塊級作用域吃媒。

使用var定義的變量為函數級作用域:

{
  var a = 10;
}

console.log(a); // 輸出10

使用let與const定義的變量為塊級作用域:

{
  let a = 10;
}

console.log(a); //-1 or Error“ReferenceError: a is not defined”

ES7的特性

在ES6之后瓤介,ES的發(fā)布頻率更加頻繁,基本每年一次赘那,所以自ES6之后刑桑,每個新版本的特性的數量就比較少。

  • includes()
  • 指數操作符

1. Array.prototype.includes()

includes() 函數用來判斷一個數組是否包含一個指定的值募舟,如果包含則返回 true祠斧,否則返回false

includes 函數與 indexOf 函數很相似拱礁,下面兩個表達式是等價的:

arr.includes(x)
arr.indexOf(x) >= 0

接下來我們來判斷數字中是否包含某個元素:

在ES7之前的做法

使用indexOf()驗證數組中是否存在某個元素琢锋,這時需要根據返回值是否為-1來判斷:

let arr = ['react', 'angular', 'vue'];

if (arr.indexOf('react') !== -1)
{
    console.log('react存在');
}

使用ES7的includes()

使用includes()驗證數組中是否存在某個元素,這樣更加直觀簡單:

let arr = ['react', 'angular', 'vue'];

if (arr.includes('react'))
{
    console.log('react存在');
}

2.指數操作符

在ES7中引入了指數運算符**呢灶,**具有與Math.pow(..)等效的計算結果吴超。

不使用指數操作符

使用自定義的遞歸函數calculateExponent或者Math.pow()進行指數運算:

function calculateExponent(base, exponent)
{
    if (exponent === 1)
    {
        return base;
    }
    else
    {
        return base * calculateExponent(base, exponent - 1);
    }
}

console.log(calculateExponent(2, 10)); // 輸出1024
console.log(Math.pow(2, 10)); // 輸出1024

使用指數操作符

使用指數運算符**,就像+填抬、-等操作符一樣:

console.log(2**10);// 輸出1024

ES8的特性

  • async/await
  • Object.values()
  • Object.entries()
  • String padding
  • 函數參數列表結尾允許逗號
  • Object.getOwnPropertyDescriptors()

1.async/await

在ES8中加入了對async/await的支持烛芬,也就我們所說的異步函數,這是一個很實用的功能飒责。 async/await將我們從頭痛的回調地獄中解脫出來了赘娄,使整個代碼看起來很簡潔。

使用async/await與不使用async/await的差別:

login(userName) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('1001');
        }, 600);
    });
}

getData(userId) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (userId === '1001') {
                resolve('Success');
            } else {
                reject('Fail');
            }
        }, 600);
    });
}

// 不使用async/await ES7
doLogin(userName) {
    this.login(userName)
        .then(this.getData)
        .then(result => {
            console.log(result)
        })
}

// 使用async/await ES8
async doLogin2(userName) {
    const userId=await this.login(userName);
    const result=await this.getData(userId);
}

this.doLogin()// Success
this.doLogin2()// Success

async/await的幾種應用場景

接下來我們來看一下async/await的幾種應用場景宏蛉。

獲取異步函數的返回值

異步函數本身會返回一個Promise遣臼,所以我們可以通過then來獲取異步函數的返回值。

async function charCountAdd(data1, data2) {
    const d1=await charCount(data1);
    const d2=await charCount(data2);
    return d1+d2;
}
charCountAdd('Hello','Hi').then(console.log);//通過then獲取異步函數的返回值拾并。
function charCount(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(data.length);
        }, 1000);
    });
}

async/await在并發(fā)場景中的應用

對于上述的例子揍堰,我們調用await兩次,每次都是等待1秒一共是2秒嗅义,效率比較低屏歹,而且兩次await的調用并沒有依賴關系,那能不能讓其并發(fā)執(zhí)行呢之碗,答案是可以的蝙眶,接下來我們通過Promise.all來實現await的并發(fā)調用。

async function charCountAdd(data1, data2) {
    const [d1,d2]=await Promise.all([charCount(data1),charCount(data2)]);
    return d1+d2;
}
charCountAdd('Hello','Hi').then(console.log);
function charCount(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(data.length);
        }, 1000);
    });
}

通過上述代碼我們實現了兩次charCount的并發(fā)調用褪那,Promise.all接受的是一個數組幽纷,它可以將數組中的promise對象并發(fā)執(zhí)行式塌;

async/await的幾種錯誤處理方式

第一種:捕捉整個async/await函數的錯誤

async function charCountAdd(data1, data2) {
    const d1=await charCount(data1);
    const d2=await charCount(data2);
    return d1+d2;
}
charCountAdd('Hello','Hi')
    .then(console.log)
    .catch(console.log);//捕捉整個async/await函數的錯誤
...

這種方式可以捕捉整個charCountAdd運行過程中出現的錯誤,錯誤可能是由charCountAdd本身產生的友浸,也可能是由對data1的計算中或data2的計算中產生的峰尝。

第二種:捕捉單個的await表達式的錯誤

async function charCountAdd(data1, data2) {
    const d1=await charCount(data1)
        .catch(e=>console.log('d1 is null'));
    const d2=await charCount(data2)
        .catch(e=>console.log('d2 is null'));
    return d1+d2;
}
charCountAdd('Hello','Hi').then(console.log);

通過這種方式可以捕捉每一個await表達式的錯誤,如果既要捕捉每一個await表達式的錯誤收恢,又要捕捉整個charCountAdd函數的錯誤武学,可以在調用charCountAdd的時候加個catch

...
charCountAdd('Hello','Hi')
    .then(console.log)
    .catch(console.log);//捕捉整個async/await函數的錯誤
...

第三種:同時捕捉多個的await表達式的錯誤

async function charCountAdd(data1, data2) {
    let d1,d2;
    try {
        d1=await charCount(data1);
        d2=await charCount(data2);
    }catch (e){
        console.log('d1 is null');
    }
    return d1+d2;
}
charCountAdd('Hello','Hi')
    .then(console.log);

function charCount(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(data.length);
        }, 1000);
    });
}

2.Object.values()

Object.values()是一個與Object.keys()類似的新函數派诬,但返回的是Object自身屬性的所有值劳淆,不包括繼承的值。

假設我們要遍歷如下對象obj的所有值:

const obj = {a: 1, b: 2, c: 3};

不使用Object.values() :ES7

const vals=Object.keys(obj).map(key=>obj[key]);
console.log(vals);//[1, 2, 3]

使用Object.values() :ES8

const values=Object.values(obj1);
console.log(values);//[1, 2, 3]

從上述代碼中可以看出Object.values()為我們省去了遍歷key默赂,并根據這些key獲取value的步驟。

3.Object.entries

Object.entries()函數返回一個給定對象自身可枚舉屬性的鍵值對的數組括勺。

接下來我們來遍歷上文中的obj對象的所有屬性的key和value:

不使用Object.entries() :ES7

Object.keys(obj).forEach(key=>{
    console.log('key:'+key+' value:'+obj[key]);
})
//key:a value:1
//key:b value:2
//key:c value:3

使用Object.entries() :ES8

for(let [key,value] of Object.entries(obj1)){
    console.log(`key: ${key} value:${value}`)
}
//key:a value:1
//key:b value:2
//key:c value:3

4.String padding

在ES8中String新增了兩個實例函數String.prototype.padStartString.prototype.padEnd缆八,允許將空字符串或其他字符串添加到原始字符串的開頭或結尾。

String.padStart(targetLength,[padString])

  • targetLength:當前字符串需要填充到的目標長度疾捍。如果這個數值小于當前字符串的長度奈辰,則返回當前字符串本身。
  • padString:(可選)填充字符串乱豆。如果字符串太長奖恰,使填充后的字符串長度超過了目標長度,則只保留最左側的部分宛裕,其他部分會被截斷瑟啃,此參數的缺省值為 “ “。
console.log('0.0'.padStart(4,'10')) //10.0
console.log('0.0'.padStart(20))//                0.00

String.padEnd(targetLength,padString])

  • targetLength:當前字符串需要填充到的目標長度揩尸。如果這個數值小于當前字符串的長度蛹屿,則返回當前字符串本身。
  • padString:(可選) 填充字符串岩榆。如果字符串太長错负,使填充后的字符串長度超過了目標長度,則只保留最左側的部分勇边,其他部分會被截斷犹撒,此參數的缺省值為 “ “;
console.log('0.0'.padEnd(4,'0')) //0.00
console.log('0.0'.padEnd(10,'0'))//0.00000000

4.函數參數列表結尾允許逗號

這是一個不痛不癢的更新粒褒,主要作用是方便使用git進行多人協作開發(fā)時修改同一個函數減少不必要的行變更识颊。

不使用ES8

//程序員A
var f = function(a,
  b
   ) {
  ...
  }

//程序員B
var f = function(a,
  b,   //變更行
  c   //變更行
   ) {
  ...
  }

//程序員C
var f = function(a,
  b,
  c,   //變更行
  d   //變更行
   ) {
  ...
  }

使用ES8

//程序員A
var f = function(a,
  b,
   ) {
  ...
  }

//程序員B
var f = function(a,
  b,
  c,   //變更行
   ) {
  ...
  }

//程序員C
var f = function(a,
  b,
  c,
  d,   //變更行
   ) {
  ...
  }

5.Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors()函數用來獲取一個對象的所有自身屬性的描述符,如果沒有任何自身屬性,則返回空對象怀浆。

函數原型:

Object.getOwnPropertyDescriptors(obj)

返回obj對象的所有自身屬性的描述符谊囚,如果沒有任何自身屬性怕享,則返回空對象。

const obj2 = {
    name: 'Jine',
    get age() { return '18' }
};
Object.getOwnPropertyDescriptors(obj2)
// {
//   age: {
//     configurable: true,
//     enumerable: true,
//     get: function age(){}, //the getter function
//     set: undefined
//   },
//   name: {
//     configurable: true,
//     enumerable: true,
//      value:"Jine",
//      writable:true
//   }
// }

總結

技術更替的車輪一直在前進中镰踏,JavaScript的規(guī)范和標準也在不斷的制定和完善函筋。你會發(fā)現ECMAScript 新版的很多特性已經是Typescript,瀏覽器或其他polyfills的一部分奠伪,就拿ES8的async/await來說跌帐,它是2017年6月被納入ECMAScript的,但我在2016年的時候就已經開始使用這個特性了绊率,這些特性通常由ECMAScript議員提交谨敛,然后會出現在在未來的某個ECMAScript版本中。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末滤否,一起剝皮案震驚了整個濱河市脸狸,隨后出現的幾起案子,更是在濱河造成了極大的恐慌藐俺,老刑警劉巖炊甲,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異欲芹,居然都是意外死亡卿啡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門菱父,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颈娜,“玉大人,你說我怎么就攤上這事浙宜」倭桑” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵梆奈,是天一觀的道長野崇。 經常有香客問我,道長亩钟,這世上最難降的妖魔是什么乓梨? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮清酥,結果婚禮上扶镀,老公的妹妹穿的比我還像新娘。我一直安慰自己焰轻,他們只是感情好臭觉,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蝠筑。 火紅的嫁衣襯著肌膚如雪狞膘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天什乙,我揣著相機與錄音挽封,去河邊找鬼。 笑死臣镣,一個胖子當著我的面吹牛辅愿,可吹牛的內容都是我干的。 我是一名探鬼主播忆某,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼点待,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弃舒?” 一聲冷哼從身側響起癞埠,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聋呢,沒想到半個月后燕差,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡坝冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了瓦呼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂窟。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖央串,靈堂內的尸體忽然破棺而出磨澡,到底是詐尸還是另有隱情,我是刑警寧澤质和,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布稳摄,位于F島的核電站,受9級特大地震影響饲宿,放射性物質發(fā)生泄漏厦酬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一瘫想、第九天 我趴在偏房一處隱蔽的房頂上張望仗阅。 院中可真熱鬧,春花似錦国夜、人聲如沸减噪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筹裕。三九已至醋闭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朝卒,已是汗流浹背证逻。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扎运,地道東北人瑟曲。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像豪治,于是被迫代替她去往敵國和親洞拨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容