日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

使用和学习 ES2015

發(fā)布時間:2023/12/13 综合教程 19 生活家
生活随笔 收集整理的這篇文章主要介紹了 使用和学习 ES2015 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

調(diào)試網(wǎng)站

http://babeljs.io/repl/

擴(kuò)展閱讀:

# export、exports、modules.exports 和 require 、import 的一些常用方法和套路
http://www.cnblogs.com/CyLee/p/5836069.html

# es6學(xué)習(xí)筆記
https://github.com/dragon8github/es6-Study-Notes

(數(shù)組)擴(kuò)展運(yùn)算符使用

// demo 1
var a = (...args) => console.log(args)
a(1, 2, 3, 4) // [ 1, 2, 3, 4 ]

// demo 2
console.log(...[1, 2, 3, 4]); // 1 2 3 4

// demo 3
Math.max(...[1, 2, 3, 4, 5]) // 5

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

箭頭函數(shù)與高階函數(shù)

getters: {
  // ...
  getTodoById: state => id => state.todos.find(todo => todo.id === id)
}

怎么會有兩個箭頭函數(shù)?語法錯誤吧?其實(shí)這就是一個函數(shù)返回另一個函數(shù)罷了。簡化一下:

getters: {
  // ...
  getTodoById: (state) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}

然后再還原為es5的代碼

"use strict";

getters: {
  // ...
  getTodoById: (function (state) {
    return function (id) {
      return state.todos.find(function (todo) {
        return todo.id === id;
      });
    };
  });
}

類的基本操作

class UserService
{
    constructor(UserName,UserPwd)
    {
         this._UserName = UserName;
         this._UserPwd = UserPwd;
    }

    get UserName(){return this._UserName} //獲取屬性,命名必須大寫開頭
    set UserName(n){this._UserName = /^w{6,19}$/.test(n)?n:null} //設(shè)置屬性,命名必須大寫開頭

    get UserName(){return this._UserName} //獲取屬性,命名必須大寫開頭
    set UserName(n){this._UserName = /^w{6,19}$/.test(n)?n:null} //設(shè)置屬性,命名必須大寫開頭

    getVersion()
    {
        console.log("1.0");
    }
}

let user = new UserService('Lee','123456');
//user.getVersion();
// console.log(user.name,user.pwd);
user.UserName = 'dragon8github';
console.log(user.UserName);


5、使用promise寫法

http://es6.ruanyifeng.com/#docs/promise

仔細(xì)研究這幾個demo就可以學(xué)會promise的用法了:

// demo 1: Promise的基本特性和使用
var fuck = new Promise((resolve, reject) => {
    resolve("123");  // 會激活.then的第一個參數(shù)函數(shù). 請注意,resolve 和 reject 這兩個函數(shù)只能選擇一個執(zhí)行
    reject("456");   // 會激活.then的第二個參數(shù)函數(shù) 或者 .catch函數(shù)
})

fuck.then(data => {
    console.log(data);  // => 123 當(dāng)Promise執(zhí)行第一個參數(shù)函數(shù)reject時會觸發(fā)
}, err => {
    console.log(err);  // => 456 當(dāng)Promise執(zhí)行第二個參數(shù)函數(shù)reject時會觸發(fā) 或者Promise發(fā)生錯誤時會觸發(fā)。
})

fuck.then(data => {
    console.log(data);  // => 123 當(dāng)Promise執(zhí)行第一個參數(shù)函數(shù)reject時會觸發(fā)
}).catch(err => {      
    console.log(err); // => 456 當(dāng)Promise執(zhí)行第二個參數(shù)函數(shù)reject時會觸發(fā) 或者Promise發(fā)生錯誤時會觸發(fā)。
})


// demo 2: 在promise中return,是return 一個promise對象,所以可以無限的.then/.catch
var fuck = new Promise(function(resolve, reject){
    resolve("123");  // 會激活p.then的第一個參數(shù)函數(shù), 注意,如果調(diào)用這個。這個函數(shù)就會停止執(zhí)行,所以下一句代碼沒有效果
    reject("456");   // 會激活p.then的第二個參數(shù)函數(shù) 或者 p.catch函數(shù)
});

fuck.then(data => {
  console.log(data);  // => 123
  return data + 1
}).then(data2 => {
   console.log(data2); // => 1231
})


// demo 3: promise自動會啟動try catch 機(jī)制 使用catch或者then的第二個參數(shù)函數(shù)捕獲
var fuck = new Promise((a, b) => {
    mdzz()  // 根本沒有mdzz這個函數(shù),所以會報(bào)錯,也可以使用 throw new Error('mdzz') 來觸發(fā)報(bào)錯
})

fuck.then(data => {
  //do someting...
}).catch(err => {
    // 這里可以捕獲到err。當(dāng)然你可以什么都不寫。這樣程序就不報(bào)錯了。
    // 但正常情況下還是建議處理好err
    console.log(123)
})

// 或者這樣
fuck.then(data => {
  console.log(data);  // => 123 當(dāng)Promise執(zhí)行第一個參數(shù)函數(shù)reject時會觸發(fā)
}, err => {
  console.log(err);  // => 456 當(dāng)Promise執(zhí)行第二個參數(shù)函數(shù)reject時會觸發(fā) 或者Promise發(fā)生錯誤時會觸發(fā)。
})


// demo 4: 如何共享參數(shù)
// 暫時沒有方法。只能用全局變量.下面是代碼片段:
connect().then(db => {
   return (this.db = db).collection('users')
}).then(docs => {
    return docs.insert({name: this.name, pwd: this.pwd, email: this.email}, {safe: true})
}).catch(err => {
    this.db && this.db.close();
    throw new Error(err);
})

demo5: 實(shí)現(xiàn)finally函數(shù)
Promise.prototype.finally = function (callback) {
    let P = this.constructor;
    return this.then(
        ret => P.resolve(callback()).then( () => ret),
        err => P.resolve(callback()).then( () => {throw new Error(err) })
    );
};

封裝一個promise的函數(shù),希望繼續(xù)返回Promise.

以下是我實(shí)戰(zhàn)的代碼片段,僅供參考。

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/myproject';
// 如果我要使用fuck()之后繼續(xù)執(zhí)行.then,那么說明這個fuck要返回一個promise即可。 let fuck = () => { // 由于我知道MongoClient.xxxx()也返回一個promise,所以這里直接返回即可。 return MongoClient.connect(url, {}).then(db => db).catch(err => { throw new Error(err); }); } fuck().then(db => { console.log(db); db.close(); })

async + await + Promise

// 使用async 和 await 必須配合使用Promise
// 在同一個代碼段中,不可以同時使用resolve和reject。因?yàn)樗麄儓?zhí)行之后會return
const f = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(123); 
      // reject(321)
    }, 1000);
  });
};

// async返回的是一個promise。所以別妄想在這里就可以直接返回普通類型的值(如string/object/Boolean)
// 事實(shí)上,在這里面我也可以用Promise的方式.then()來解析。感覺就是一個語法糖。
// 總之指的注意的是,在這個async返回的是一個promise對象
const testAsync = async () => {
  try {
    let a =  await f(); // 如果使用await,則接受起其返回值
    console.log(a)  // 輸出123
   return a  // 請注意,雖然上句輸出的是123,但返回的時候,卻是一個Promise對象哦
  } catch (err) {
    alert(err) // 可以獲取reject的值
  }
};

let a = testAsync()

console.log(a) // 注意這是一個promise
  

補(bǔ)充:2017-11-28

async 更像是一個標(biāo)記。 await 也必須在有async 標(biāo)記的函數(shù)中才可以正常使用。目前粗淺的理解是這樣,而且大多數(shù)遇到的場景也是這樣。如果以后碰到再回來補(bǔ)充。

await 標(biāo)記的函數(shù)必須是返回promise才可以正常使用獲取,如果不是只能是undefined。以Fetch為例演示(省略了async的標(biāo)記):

 let myjson = await fetch(API_SERVER, {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify(form)
    }).then(data => {
        return data.json()
    })

Async + await 新理解

使用它們的目的是,優(yōu)雅的,不嵌套,不回調(diào)的使用返回值。
但代價(jià)就是,它們必須是同個圈子里的,也就是同個函數(shù)里的,也就是同個async函數(shù)里的。然后被執(zhí)行才可以。

describe('注冊', () => {
  it('注冊', done => {
        const Register = async () => {
            // 獲取驗(yàn)證碼
            const data = await xdapi.wechat_SmsSend({TelNo: '13713332657', Type: '1'}).then(data=>data);

            if (data.Data) {
                return await xdapi.wechat_Register({
                        TelNo: '13713332657',           // 賬號
                        Password: '123456.a',           // 密碼
                        ValidateCode: data.Data,        // 驗(yàn)證碼
                        ExtensionTelNo: '13713332652',  // 推薦手機(jī)號
                        Type: 'wechat_pulic'            // 注冊方式是微信
                }).then(data => data)
            } else {
                return {ReturnMessage: '獲取驗(yàn)證碼失敗' + data.ReturnMessage};
            }
        }

        Register().then(data => {
           if (data.ReturnCode == 1) {
               console.log(data)
               done()
           } else {
               Toast('注冊失敗:' + data.ReturnMessage);
           }
        })
  })
})

ES6 class setTimeout promise async/await 測試Demo

class Person {
    async getVersion () {
        return new Promise((resolve, reject) => {
           setTimeout(function () {
                resolve('1.0'); // reject('fail')
           }, 1000);
        })
    }
}

const start = async () => {
   var p = new Person();
   const data = await p.getVersion();
   console.log(20180716090040, data); 
}

start(); // 20180716090040 "1.0"

proxy 代理的實(shí)戰(zhàn)運(yùn)用

如果你返回的是函數(shù),那就是攔截函數(shù),如果是其它類型。就是算是攔截屬性

// 結(jié)合getter 和 proxy 的特性實(shí)現(xiàn)php中的__GET魔術(shù)函數(shù)

var api = {}

/**
 * @func
 * @desc Proxy使用示例
 * @param {object}  - 要代理的對象
 * @param {object}  - 相關(guān)的代理配置
 */
var proxy = new Proxy(api, {
    get: function (target, key, receiver) {
        console.log('獲取函數(shù)名', key)
        // return Reflect.get(target, key, receiver)
        return function (aa) {
          window.alert(aa + key) 
        }
    }
})

proxy.fuck('abc')

函數(shù)名用類似數(shù)組的形式定義

const mutations = {
    INCREMENT (state,amount) {
        state.count = state.count + amount
    }
    //Es2015的知識點(diǎn)
    ["SET_INCREMENT"] (state,amount) {
        state.count = state.count + amount
    }
} 

用for of 代替所有的遍歷方式。 對數(shù)組和對象都使用for of

數(shù)組就用for(let[index,ele]of[].entries()),對象就用for (let [key, val] of Object.entries(obj))
除了entries, 還有keys() values() 詳情百度

var aa = {boj1: {name:"fuck", age:18 }, obj2: {name:"shit", age:19 }}

# 對象遍歷
for (let [index, ele] of Object.entries(aa)) {
         console.log(index, ele)
}

# 數(shù)組遍歷
for (let [index, ele] of [1, 2, 3].entries()) {
         console.log(index, ele)
}

總結(jié)

以上是生活随笔為你收集整理的使用和学习 ES2015的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。