ES6
,也稱 ECMAScript2015
,對目前來講,它並非 JavaScript 最新的標準,可是它已經普遍用於編程實踐中。若是你還沒用過 ES6,如今還不算太晚,跟我一塊兒掃一遍吧。java
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}
的佔位符。佔位符中的表達式和周圍的文本會一塊兒傳遞給一個默認函數,該函數負責將全部的部分鏈接起來。git
多行字符串。github
// 這裏是使用單引號 '
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"
複製代碼
插入表達式。express
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."
複製代碼
嵌套模板。編程
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;
複製代碼
數組元素翻倍。promise
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 指向。微信
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開源社區」,原創技術文章第一時間推送。