let
var可以重復聲明同一個變量,let進行重復聲明會在console中報錯。
var無論如何都會定義一個全局變量,而let在block, statement, or expression中定義時會定義局部變量。
const
const定義的變量是只讀的,通常用全大寫字母來命名方便辨識。const變量無法被重新聲明賦值,但是卻可以被更改,例子如下:
"use strict";
consts=[5,6,7];
s=[1,2,3];// throws error, trying to assign a const
s[2]=45;// works just as it would with an array declared with var or let
console.log(s);// returns [5, 6, 45]
Object.freeze
Object.freeze(object)方法可以用來防止一個元素被修改。
箭頭函數(shù)

rest 參數(shù)
允許我們將一個不定數(shù)量的參數(shù)表示為一個數(shù)組。
相對于解構(gòu)賦值而言,rest參數(shù)會代表所有剩余參數(shù),無法單獨/分別選擇一些參數(shù)。
function(a,b,...theArgs){
// ...
}
如果函數(shù)的最后一個命名參數(shù)以...為前綴,則它將成為一個由剩余參數(shù)組成的真數(shù)組,其中從0(包括)到theArgs.length(排除)的元素由傳遞給函數(shù)的實際參數(shù)提供。
解構(gòu)賦值 Destructuring Assignment
解構(gòu)賦值語法是一種 Javascript 表達式。通過解構(gòu)賦值, 可以將屬性/值從對象/數(shù)組中取出,賦值給其他變量。
var a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]
({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20
// Stage 4(已完成)提案中的特性
({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}
模版字符串 template literal
模板字符串使用反引號 () 來代替普通字符串中的用雙引號和單引號。模板字符串可以包含特定語法(${expression})的占位符。占位符中的表達式和周圍的文本會一起傳遞給一個默認函數(shù),該函數(shù)負責將所有的部分連接起來,如果一個模板字符串由表達式開頭,則該字符串被稱為帶標簽的模板字符串,該表達式通常是一個函數(shù),它會在模板字符串處理后被調(diào)用,在輸出最終結(jié)果前,你都可以通過該函數(shù)來對模板字符串進行操作處理。在模版字符串內(nèi)使用反引號(`)時,需要在它前面加轉(zhuǎn)義符(\)。
定義類Class
類實際上是個“特殊的函數(shù)”,就像你能夠定義的函數(shù)表達式和函數(shù)聲明一樣,類語法有兩個組成部分:類表達式和類聲明。
類聲明
定義一個類的一種方法是使用一個類聲明。要聲明一個類,你可以使用帶有class關鍵字的類名(這里是“Rectangle”)。
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
函數(shù)聲明和類聲明之間的一個重要區(qū)別是函數(shù)聲明會提升,類聲明不會。你首先需要聲明你的類,然后訪問它,否則像下面的代碼會拋出一個ReferenceError:
let p = new Rectangle(); // ReferenceError
class Rectangle {}
類表達式
一個類表達式是定義一個類的另一種方式。類表達式可以是具名的或匿名的。
一個具名類表達式的名稱是類內(nèi)的一個局部屬性,它可以通過類本身(而不是類實例)的name屬性來獲取。
// 匿名類
let Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// output: "Rectangle"
// 具名類
let Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// 輸出: "Rectangle2"
import & export 不同js之間的通信
JavaScript Promise
語法:
new Promise( function(resolve, reject) {...} /* executor */ );
executor是帶有 resolve 和 reject 兩個參數(shù)的函數(shù) 。Promise構(gòu)造函數(shù)執(zhí)行時立即調(diào)用executor 函數(shù), resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構(gòu)造函數(shù)返回所建promise實例對象前被調(diào)用)。resolve 和 reject 函數(shù)被調(diào)用時,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失?。?。executor 內(nèi)部通常會執(zhí)行一些異步操作,一旦異步操作執(zhí)行完畢(可能成功/失敗),要么調(diào)用resolve函數(shù)來將promise狀態(tài)改成fulfilled,要么調(diào)用reject 函數(shù)將promise的狀態(tài)改為rejected。如果在executor函數(shù)中拋出一個錯誤,那么該promise 狀態(tài)為rejected。executor函數(shù)的返回值被忽略。
ES5查漏補缺
reduce() / apply()