本文由 yanglbme 原創,轉載請聯繫微信:YLB0109
ES6
,也稱 ECMAScript2015
,對目前來講,它並非 JavaScript 最新的標準,可是它已經普遍用於編程實踐中。若是你還沒用過 ES6,如今還不算太晚,跟我一塊兒掃一遍吧。javascript
function testVar() { var a = 10; if (true) { var a = 20; console.log(a); // 20 } // 在外部也生效 console.log(a); // 20 } testVar();
function testLet() { let a = 10; if (true) { let a = 20; // 僅在當前做用域生效 console.log(a); // 20 } console.log(a); // 10 } testVar();
const x = 100; // 這裏會報錯 x = 1000; // Uncaught TypeError: Assignment to constant variable.
const arr = [] arr.push(1) arr.push("2") // 正常打印 console.log(arr) // [1, "2"]
模板字符串使用反引號 ` (Tab 鍵上方的符號)來代替普通字符串中的用雙引號和單引號。模板字符串能夠包含特定語法 ${expression}
的佔位符。佔位符中的表達式和周圍的文本會一塊兒傳遞給一個默認函數,該函數負責將全部的部分鏈接起來。java
多行字符串。git
// 這裏是使用單引號 ' console.log('string text line 1\n' + 'string text line 2'); // "string text line 1 // string text line 2"
// 注意是使用反引號 ` console.log(`string text line 1 string text line 2`); // "string text line 1 // string text line 2"
插入表達式。github
var a = 5; var b = 10; console.log('Fifteen is ' + (a + b) + ' and\nnot ' + (2 * a + b) + '.'); // "Fifteen is 15 and // not 20."
let a = 5; let b = 10; console.log(`Fifteen is ${a + b} and not ${2 * a + b}.`); // "Fifteen is 15 and // not 20."
嵌套模板。express
var classes = 'header' classes += (isLargeScreen() ? '' : item.isCollapsed ? ' icon-expander' : ' icon-collapser');
const classes = `header ${ isLargeScreen() ? '' : (item.isCollapsed ? 'icon-expander' : 'icon-collapser') }`;
箭頭函數的做用:編程
兩數相加。json
var add = function(a, b) { return a + b; }
const add = (a, b) => a + b;
數組元素翻倍。數組
var original = [2, 4, 8, 16]; var double = original.map(function (e) { return e * 2; }); console.log(double);
const original = [2, 4, 8, 16]; const double = original.map(e => e * 2); console.log(double);
改變 this 指向。promise
var team = { members: ["bingo", "alex"], teamName: "ES6", teamSummary: function() { let self = this; return this.members.map(function (e) { return `${e}隸屬於${self.teamName}小組`; }) } // 或者使用bind綁定的方式 } console.log(team.teamSummary())
const team = { members: ["bingo", "alex"], teamName: "ES6", teamSummary: function() { return this.members.map(e => `${e}隸屬於${this.teamName}小組`); } } console.log(team.teamSummary())
加強對象字面量的一個做用就是:簡化代碼。在下面的示例中,註釋的部分是簡化前所使用。微信
function createBookShop(inventory) { return { // inventory: inventory, inventory, // inventoryValue: function() { inventoryValue() { return this.inventory.reduce((total, book) => total + book.price, 0); }, // priceForTitle: function(title) { priceForTitle(title) { return this.inventory.find(book => book.title === title).price; } } } const inventory = [ { title: "Vue.js", price: 20 }, { title: "React.js", price: 19 }, ] const bookShop = createBookShop(inventory); console.log(bookShop.inventoryValue()); console.log(bookShop.priceForTitle("Vue.js"));
function request(url, method="GET") { // ... console.log(method); } request("google.com", "POST");
以上使用了 ES6 函數參數默認值,看一下上面的代碼,若使用 Babel 進行轉化,會獲得什麼:
"use strict"; function request(url) { var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "GET"; // ... console.log(method); } request("google.com", "POST");
能夠看到,使用 ES6 函數參數默認值,代碼能夠簡化很多。
Spread Operator,也叫展開運算符,有了它,咱們能夠更快、更便捷地操做數組。
// 不固定參數個數 function total(...numbers) { return numbers.reduce((sum, number) => sum + number, 0); } console.log(total(2, 4, 6, 8)) // 4個參數,20 console.log(total(1, 2, 3, 4, 5)); // 5個參數,15
再看個示例:
let colors1 = ["red", "orange"]; let colors2 = ["blue", "white", "green"]; let totalColors = ["black", ...colors1, ...colors2]; console.log(totalColors); // ["black", "red", "orange", "blue", "white", "green"]
解構對象。
let user = { name: "Amy", age: 20, college: "szu" }
function print(user) { console.log(`${user.name}的年齡是${user.age}`); } print(user); // Amy的年齡是20
function print({ name, age, college }) { console.log(`${name}的年齡是${age}`); } print(user); // Amy的年齡是20
解構數組。
const names = ["Bingo", "Iris", "Alex"]; const [name1, name2, name3] = names; console.log(name1, name2, name3); // Bingo Iris Alex // 返回數組個數 const { length } = names; console.log(length); // 3 // 結合展開運算符 const [name, ...rest] = names; console.log(name); // Bingo console.log(rest); // ["Iris", "Alex"]
將數組轉化爲對象。
const points = [ [4, 5], [1, 2], [3, 6], ]; let res = points.map(([x, y]) => { return { x, y }; }) console.log(res); // [{…}, {…}, {…}]
建立對象,並實現繼承。
// 首字母大寫 function Car(options) { this.title = options.title; } Car.prototype.drive = function() { return "Vroom"; } var car = new Car({ title: "BMW" }); console.log(car); console.log(car.drive()) // 繼承 function Toyota(options) { // 經過Car調用call()方法 Car.call(this, options); this.color = options.color; } // 不容易理解 Toyota.prototype = Object.create(Car.prototype); Toyota.prototype.constructor = Toyota; var toyota = new Toyota({ color: "red", title: "Focus" }); console.log(toyota.title); // Focus console.log(toyota.drive()); // Vroom
class Car { constructor({ title }) { this.title = title; } drive() { return "Vroom"; } } const car = new Car({ title: "BMW" }); console.log(car); console.log(car.drive()) // 繼承 class Toyota extends Car { constructor({ title, color }) { super({ title }); this.color = color; } } const toyota = new Toyota({ color: "red", title: "Focus" }); console.log(toyota) // Focus console.log(toyota.drive()) // Vroom
斐波那契數列。
function fib(max) { var a = 0, b = 1, arr = [0, 1]; while (arr.length < max) { [a, b] = [b, a + b]; arr.push(b); } return arr; } console.log(fib(5))
// 注意,function後加多了個* function* fib(max) { let a = 0, b = 1, n = 0; while (n < max) { // 使用yield關鍵字 yield a; [a, b] = [b, a + b]; ++n; } return; } // 使用for..of遍歷 for (let x of fib(10)) { console.log(x); }
Map 中的鍵能夠是任何類型的,好比 function()
、{}
、string
等。
const map = new Map(); const key1 = 'some string', key2 = {}, key3 = function() {}; // 爲key設置value map.set(key1, 'Value of key1'); map.set(key2, 'Value of key2'); map.set(key3, 'Value of key3'); console.log(map.get(key1)) console.log(map.get(key2)) console.log(map.get(key3)) // 使用for..of遍歷 for (let [key, value] of map) { console.log(`${key}=>${value}`); } // 只獲取key for (let key of map.keys()) { console.log(key); } // 只獲取value for (let value of map.values()) { console.log(value); } // 使用forEach遍歷 map.forEach((key, value) => { console.log(`${key}=>${value}`); })
Set 能夠存儲任何類型的不重複數據。
const set = new Set(); set.add({name: "bingo"}); set.add(100); set.add(true); set.add(100); console.log(set); // {{…}, 100, true} console.log(set.size) // 3 console.log(set.has(100)); // true console.log(set.has({name: "bingo"})) // 匹配的是地址,false set.delete(100); // 使用for..of遍歷 for (let item of set) { console.log(item); } // 使用forEach遍歷 set.forEach(e => { console.log(e); }) // 將set轉換爲array const setArray = Array.from(set); console.log(setArray);
Promise 的三種狀態:
生成 0-2 之間的隨機數,若是小於 1,則等待一段時間後返回成功,不然返回失敗。
let promise = new Promise((resolve, reject) => { var timeout = Math.random() * 2; setTimeout(() => { if (timeout < 1) { resolve("success:ok"); } else { reject("error:timeout"); } }, timeout * 1000); }); promise .then(res => console.log(`成功:${res}`)) .catch(res => console.log(`失敗:${res}`))
成功時,執行 then;失敗時,執行 catch。
發送網絡請求獲取數據。
如下是一個基本的 fetch 請求,fetch()
返回一個包含響應結果的 promise(一個 Response 對象):
fetch('https://jsonplaceholder.typicode.com/posts/1') .then(resp => resp.json()) .then(res => console.log(res))
fetch()
支持第二個可選參數,一個能夠控制不一樣配置的 init 對象:
postData('https://jsonplaceholder.typicode.com/posts/1', {answer: 42}) .then(data => console.log(data)) .catch(error => console.error(error)) function postData(url, data) { return fetch(url, { cache: 'no-cache', credentials: 'same-origin', headers: { 'user-agent': 'Mozilla/4.0 MDN Example', }, method: 'GET', // *GET, POST, PUT, DELETE, etc. mode: 'cors', // no-cors, cors, *same-origin redirect: 'follow', // manual, *follow, error referrer: 'no-referrer', // *client, no-referrer }) .then(response => response.json()) // parses response to JSON }
async/await
是 JavaScript 中最終極的異步解決方案。
async function getUsers() { const resp = await fetch('https://jsonplaceholder.typicode.com/users'); const data = await resp.json(); return data; } // async 返回一個 Promise 對象,所以能夠調用 then 獲取結果。 getUsers().then(users => console.log(users));
以上,完。
我是 GitHub 技術社區 Doocs 發起人,歡迎關注個人微信公衆號「Doocs開源社區」,原創技術文章第一時間推送。