ECMAScript6
ECMAScript 是 JavaScript 的標準化版本,它旨在統一語言的規範和功能。所有主流的瀏覽器或者 Javascript 的運行環境都支持這個規範,因此 ECMAScript 和 JavaScript 的術語是通用的。在2015年,ECMAScript 發佈了被稱爲 ECMAScript 6 (ES6) 的最新版本。
- 箭頭函數
- 類
- 模塊
- Promises 對象
- 異步生成器 Generators
let
以及const
語法
一、探索var和let關鍵字之間的差異
- 使用
var
關鍵字來聲明變量,會出現重複聲明導致變量被覆蓋卻不會報錯的問題。 - 當使用
let
的時候,同一名字的變量只能被聲明一次。(和java一樣,存在全局變量可以創建同名的局部變量) - 寫明
"use strict"
。這代表着開啓了嚴格模式,在函數內部聲明是局部作用域 (只在函數內使用嚴格模式),外部則是全局作用域 - 使用
var
關鍵字來聲明一個變量的時候,這個變量會被聲明成全局變量,或是函數內的局部變量。(var是可變的,同一塊內存空間) - 如果你在代碼塊、語句或表達式中使用關鍵字
let
聲明變量,這個變量的作用域就被限制在當前的代碼塊,語句或表達式之中。(let是不可變的)
二、用 const 關鍵字聲明只讀變量
const
擁有let
的所有優點,所不同的是,通過const
聲明的變量是隻讀的。這意味着通過const
聲明的變量只能被賦值一次,而不能被再次賦值。- 你應該使用
const
關鍵字來對所有不打算再次賦值的變量進行聲明。一個最佳實踐是對所有常量的命名採用全大寫字母,並在單詞之間使用下劃線進行分隔。 - 對象(包括數組和函數)在使用
const
聲明的時候依然是可變的。使用const
來聲明只會保證它的標識不會被重新賦值。(你可以將const聲明的變量指向一個對象,更改對象中的數據是可行的,但是不能建該變量指向另一個對象)
三、防止對象改變
- const並不會使得對象中的數據不能夠改變,JavaScript 提供了一個函數
Object.freeze
來防止數據改變。(你不能再對它的屬性再進行增、刪、改的操作。出現增刪改操作會被忽略,但不會報錯)
Object.freeze(MATH_CONSTANTS);
四、使用箭頭函數編寫簡潔的匿名函數
我們會經常遇到不需要給函數命名的情況,如下,代碼不需要複用
const myFunc = function() {
const myVar = "value";
return myVar;
}
ES6 提供了其他寫匿名函數的方式的語法糖,箭頭函數
const myFunc = () => {
const myVar = "value";
return myVar;
}
當不需要函數體,只返回一個值的時候,箭頭函數允許你省略return
關鍵字和外面的大括號。
const myFunc= () => "value"
給箭頭函數,添加參數
const doubler = (item) => item * 2;
當箭頭函數被用到需要用函數作爲參數的高階函數中時會很好用。
FBPosts.filter(function(post) {
return post.thumbnail !== null && post.shares > 100 && post.likes > 500;
})
//簡寫之後
//filter() 方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。
FBPosts.filter((post) => post.thumbnail !== null && post.shares > 100 && post.likes > 500)
demo
filter() 方法創建一個新的數組,新數組中的元素是通過檢查指定數組中符合條件的所有元素。
map() 方法返回一個新數組,數組中的元素爲原始數組元素調用函數處理後的值。
const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8.34];
const squareList = (arr) => {
"use strict";
// 在這行以下修改代碼
const squaredIntegers = arr.filter((num)=>num>0&&num%parseInt(num)===0).map((num)=>Math.pow(num,2));
// 在這行以上修改代碼
return squaredIntegers;
};
// 測試你的代碼
const squaredIntegers = squareList(realNumberArray);
console.log(squaredIntegers);
五、設置函數的默認參數
ES6 裏允許給函數傳入默認參數,來構建更加靈活的函數。
當參數沒有被指定的時候,默認參數起作用,例子:
function greeting(name = "Anonymous") {
return "Hello " + name;
}
console.log(greeting("John")); // Hello John
console.log(greeting()); // Hello Anonymous
六、一個變量來接受多個參數的函數
ES6 推出了用於函數參數的 rest 操作符幫助我們創建更加靈活的函數。你可以創建有一個變量來接受多個參數的函數。這些參數被儲存在一個可以在函數內部讀取的數組中。
function howMany(...args) {
return "You have passed " + args.length + " arguments.";
}
console.log(howMany(0, 1, 2)); // 輸出:You have passed 3 arguments.
console.log(howMany("string", null, [1, 2, 3], { })); // 輸出:You have passed 4 arguments.
七、使用 spread 運算符展開數組項
ES6 允許我們使用 展開操作符 來展開數組,以及需要多個參數或元素的表達式。
const arr = [6, 89, 3, 45];
const maximus = Math.max(...arr); // 返回 89
let arr2 = [...arr1];
...arr
返回了一個“打開”的數組。或者說它 展開 了數組。
然而,展開操作符只能夠在函數的參數中,或者數組之中使用
八、使用解構賦值從對象中分配變量
普通ES5代碼
var voxel = {x: 3.6, y: 7.4, z: 6.54 };
var x = voxel.x; // x = 3.6
var y = voxel.y; // y = 7.4
var z = voxel.z; // z = 6.54
ES6解構語法
const { x, y, z } = voxel; // x = 3.6, y = 7.4, z = 6.54
const { x : a, y : b, z : c } = voxel; // a = 3.6, b = 7.4, c = 6.54
我們可以將 嵌套的對象解構到變量中。
const a = {
start: { x: 5, y: 6},
end: { x: 6, y: -9 }
};
const { start : { x: startX, y: startY }} = a;
console.log(startX, startY); // 5, 6
九:使用解構賦值從數組中分配變量
const [a, b] = [1, 2, 3, 4, 5, 6];
console.log(a, b); // 1, 2
變量a
以及b
分別被數組的第一、第二個元素賦值。
我們甚至能在數組解構中使用逗號分隔符,來獲取任意一個想要的值:
const [a, b,,, c] = [1, 2, 3, 4, 5, 6];
console.log(a, b, c); // 1, 2, 5
十、使用解構賦值配合 rest 操作符來重新分配數組元素
在解構數組的某些情況下,我們可能希望將剩下的元素放進另一個數組裏面。
const [a, b, ...arr] = [1, 2, 3, 4, 5, 7];
console.log(a, b); // 1, 2
console.log(arr); // [3, 4, 5, 7]
十一、使用解構賦值將對象作爲函數的參數傳遞
在某些情況下,你可以在函數的參數裏直接解構對象。
const profileUpdate = (profileData) => {
const { name, age, nationality, location } = profileData;
// 對這些變量執行某些操作
}
這樣的操作也可以直接在參數裏完成:注意參數大括號
const profileUpdate = ({ name, age, nationality, location }) => {
/* 對這些參數執行某些操作 */
}
十二、使用模板字面量創建字符串
模板字符串是 ES6 的另外一項新的功能。這是一種可以輕鬆構建複雜字符串的方法。
const person = {
name: "Zodiac Hasbro",
age: 56
};
// string interpolation
const greeting = `Hello, my name is ${person.name}!
I am ${person.age} years old.`;
console.log(greeting); // 打印出
// Hello, my name is Zodiac Hasbro!
// I am 56 years old.
十三、使用簡單字段編寫簡潔的對象字面量聲明
const getMousePosition = (x, y) => ({
x: x,
y: y
});
ES6 提供了一個語法糖,消除了類似x: x
這種冗餘的寫法.你可以僅僅只寫一次x,解釋器會自動將其轉換成x: x。
const getMousePosition = (x, y) => ({ x, y });
十四、用 ES6 編寫簡潔的函數聲明
在 ES5 中,當我們需要在對象中定義一個函數的時候,我們必須如下面這般使用function
關鍵字:
const person = {
name: "Taylor",
sayHello: function() {
return `Hello! My name is ${this.name}.`;
}
};
在 ES6 語法的對象中定義函數的時候,你可以完全刪除function
關鍵字和冒號。請看以下例子:
const person = {
name: "Taylor",
sayHello() {
return `Hello! My name is ${this.name}.`;
}
};
十五、使用 class 語法定義構造函數
在 ES5 裏面,我們通常會定義一個構造函數,然後使用 new
關鍵字來實例化一個對象:
var SpaceShuttle = function(targetPlanet){
this.targetPlanet = targetPlanet;
}
var zeus = new SpaceShuttle('Jupiter');
class
的語法只是簡單地替換了構造函數的寫法:constructor
class SpaceShuttle {
constructor(targetPlanet){
this.targetPlanet = targetPlanet;
}
}
const zeus = new SpaceShuttle('Jupiter');
十六、使用 getter 和 setter 來控制對象的訪問
function makeClass() {
"use strict";
class Thermostat{
constructor(farenheit){
this.farenheit= 5/9 * (farenheit - 32);
}
get temperature(){
return this.farenheit;
}
set temperature(farenheit){
this.farenheit=farenheit;
}
}
return Thermostat;
}
const Thermostat = makeClass();
const thermos = new Thermostat(76); // 使用華氏溫度來初始化
let temp = thermos.temperature; // 攝氏溫度24.44度
thermos.temperature = 26;
temp = thermos.temperature; // 攝氏溫度26度
十七、瞭解 import 和 require 之間的差異
ES6 給我們提供了import
這個便利的工具。通過它,我們能夠從外部的文件或者模塊中選擇我們需要的部分進行引入。
如math_array_functions
擁有大概20個函數,但是我只需要countItems
這一個函數在我當前的文件裏
import { countItems } from "math_array_functions"
在大括號裏的函數名的兩側加上空格是一個最佳實踐——這可以幫助我們輕鬆的閱讀import
語句。
十八、用 export 來重用(導出)代碼塊
const capitalizeString = (string) => {
return string.charAt(0).toUpperCase() + string.slice(1);
}
export { capitalizeString } //如何導出函數。
export const foo = "bar"; //如何導出變量。
----------------------------------------
const foo = "bar";
export { capitalizeString, foo }//一行導出
十九、用 * 從文件中導入所有內容
import * as myMathModule from "math_functions";
myMathModule.add(2,3);
myMathModule.subtract(5,3);
你可以在import * as
之後添加任意的名稱。這個方法接收到的值是一個對象,你可以使用點表示法來獲取對象裏具體的值。
二十、用 export default 創建一個默認導出
你還需要知道另外一種被稱爲默認導出的export
的語法。在文件中只有一個值需要導出的時候,你通常會使用這種語法。它也常常用於給文件或者模塊創建返回值。
export default function add(x,y) {
return x + y;
}
二十一、導入一個默認的導出
import add from "math_functions";
add(5,4); //將會返回 9
這個語法只有一處不同的地方 —— 被導入的add
值,並沒有被花括號{}
所包圍。與導出值的方法不同,導入默認導出的寫法僅僅只是簡單的將變量名寫在import
之後。