1.JavaScript包含3個(gè)部分捏浊,分別是ECMAScript、DOM和BOM撞叨。
ES5是ECMAScript的第5個(gè)版本金踪,ES6是第6個(gè)版本。
ECMAScript是核心谒所,它規(guī)定了語(yǔ)言的語(yǔ)法热康、類型沛申、關(guān)鍵字劣领、保留字、操作符铁材、語(yǔ)句尖淘、對(duì)象;DOM文檔對(duì)象模型著觉;BOM是瀏覽器對(duì)象模型
2.ES5在以前的版本上增加了一些Array方法村生、Object方法、strict模式等饼丘;而ES6又在向下兼容的條件下新增了一些屬性方法趁桃。因此ES6相對(duì)于ES5具有一些特性:
塊級(jí)作用域,let關(guān)鍵字肄鸽,const常量卫病,賦值結(jié)構(gòu),字符串模板生成器等等
3.ES6教程:https://www.runoob.com/w3cnote/es6-tutorial.html
教程講得非常詳細(xì)典徘,下面這張圖做出來(lái)概述
ES6的詳細(xì)學(xué)習(xí)(關(guān)于ES6進(jìn)行具體的學(xué)習(xí)蟀苛,筆記記錄在下方)
1.let和const
let和const是在ES6中新增的兩個(gè)關(guān)鍵字。let限定了變量只在代碼塊內(nèi)使用逮诲,不會(huì)進(jìn)行變量提升(而var會(huì)有變量提升)帜平;const定義靜態(tài)變量,使用const定義變量必須進(jìn)行賦值梅鹦,且靜態(tài)變量不允許對(duì)其進(jìn)行改變裆甩。
let使用在計(jì)數(shù)器中效果會(huì)很好:這里面使用let的循環(huán),每次輸出的j都是不同的變量
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 輸出十個(gè) 10
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
// 輸出 0123456789
ReferenceError: 參數(shù)錯(cuò)誤齐唆,沒(méi)有定義該變量
undefined:沒(méi)有給變量賦值就使用嗤栓,但是該變量已經(jīng)存在
SyntaxError: 語(yǔ)法錯(cuò)誤,如使用const定義變量卻不對(duì)它賦值
2.解構(gòu)賦值
剩余運(yùn)算符:
//數(shù)組模型的解構(gòu)
let [a, ...b] = [1, 2, 3];
//a = 1
//b = [2, 3]
//對(duì)象模型的解構(gòu)
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}
3.數(shù)據(jù)類型Symbol
在ES6中新增了數(shù)據(jù)類型Symbol蝶念,其用途有如下幾點(diǎn):
·作為對(duì)象的屬性名抛腕,可以保證屬性名不重復(fù)
·定義常量芋绸,保證常量是獨(dú)特的
·Symbol.for()類似于單例模式
·Symbol.keyFor()返回一個(gè)已經(jīng)登記的Symbol類型值得key
相同參數(shù) Symbol() 返回的值不相等
let sy = Symbol("KK");
console.log(sy); // Symbol(KK)
typeof(sy); // "symbol"
// 相同參數(shù) Symbol() 返回的值不相等
let sy1 = Symbol("kk");
sy === sy1; // false
4.關(guān)于set和Map
set對(duì)象存儲(chǔ)的值總是唯一的
5.Proxy和Reflect
ES6中定義了Proxy和Reflect對(duì)API進(jìn)行一些操作〉5校基本方法和實(shí)例方法有點(diǎn)多摔敛,這里不做詳細(xì)的記錄,用到的時(shí)候去具體搞清楚全封。
6.ES6字符串
ES6中擴(kuò)展了對(duì)字符串的處理方法马昙,如判斷是否包含子串,以前用indexOf(),ES6中有:
includes()
startsWith()
endWith()
//重復(fù)字符串
repeat()
//字符串補(bǔ)全
padStart()
padEnd()
//模板字符串刹悴,反引號(hào)' 可以用來(lái)定義多行字符串的
let string1 = `Hey,
can you stop angry now?`;
console.log(string1);
// Hey,
// can you stop angry now?
//字符串插入變量和表達(dá)式$(),變量名寫(xiě)在 ${} 中行楞,${} 中可以放入 JavaScript 表達(dá)式。
//...
7.字符串?dāng)?shù)值
ES6在Math對(duì)象上新增了17個(gè)數(shù)學(xué)靜態(tài)方法土匀,這些方法通過(guò)Math調(diào)用子房;
......
8.ES6對(duì)象
對(duì)象字面量:允許對(duì)象屬性直接寫(xiě)變量;函數(shù)名簡(jiǎn)寫(xiě)等
對(duì)象拓展運(yùn)算符:拷貝對(duì)象的所有可遍歷的屬性就轧;合并兩個(gè)對(duì)象证杭。需要注意的是,當(dāng)拓展對(duì)象中和現(xiàn)有的對(duì)象有相同屬性時(shí)妒御,后面的會(huì)覆蓋前面的
let person = {name: "Amy", age: 15};
let someone = { ...person, name: "Mike", age: 17};
someone; //{name: "Mike", age: 17}
對(duì)象的新方法:
//復(fù)制源對(duì)象的所有可枚舉對(duì)象
Object.assign(target, source_1, ···)
//比較兩個(gè)值是否嚴(yán)格相等
Object.is(value1, value2)
9.ES6數(shù)組
包含一些數(shù)組的操作方法解愤,如數(shù)組的創(chuàng)建、遍歷乎莉、包含送讲、數(shù)組緩沖區(qū)、定型數(shù)組等
10.ES6函數(shù)
在參數(shù)和箭頭函數(shù)方面做了擴(kuò)展惋啃。例如可以定義不定長(zhǎng)度的參數(shù)哼鬓,在回調(diào)函數(shù)中使用箭頭函數(shù)可以解決使用this的問(wèn)題(具體的問(wèn)題,還有使用的注意點(diǎn)要看一下教程肥橙,教程中很清晰)
11.迭代器
迭代器是ES6中引入的遍歷機(jī)制魄宏,可以通過(guò)Symbol.itertor創(chuàng)建迭代器進(jìn)行遍歷。
12.class類
13.ES6模塊
基本的用法:
/*-----export [test.js]-----*/
let myName = "Tom";
export { myName as exportName }
/*-----import [xxx.js]-----*/
import { exportName } from "./test.js";
console.log(exportName);// Tom
export defualt命令:
var a = "My name is Tom!";
export default a; // 僅有一個(gè)
export default var c = "error";
// error存筏,default 已經(jīng)是對(duì)應(yīng)的導(dǎo)出變量宠互,不能跟著變量聲明語(yǔ)句
import b from "./xxx.js"; // 不需要加{}, 使用任意變量接收
14.ES6 Promise對(duì)象
Promise是一個(gè)對(duì)象椭坚,用來(lái)進(jìn)行異步編程予跌。Promise有三個(gè)狀態(tài),分別是pending(正在進(jìn)行)善茎,fulfilled(成功)券册,rejected(失敗);Promise的狀態(tài)只能由pending轉(zhuǎn)向fulfilled或者rejected烁焙。fulfilled和rejected都是屬于resolved狀態(tài)航邢。
15.Generator函數(shù)
該函數(shù)可以通過(guò)關(guān)鍵字yeild將函數(shù)執(zhí)行流掛起,以實(shí)現(xiàn)異步操作骄蝇。
在函數(shù)名前面加上*表示該函數(shù)是Generator函數(shù)膳殷,在函數(shù)內(nèi)部使用yeild關(guān)鍵字來(lái)定義函數(shù)內(nèi)部的狀態(tài)對(duì)象。
通過(guò).next()方法遍歷對(duì)象九火,當(dāng)next()方法不傳入?yún)?shù)的時(shí)候赚窃,yeild表達(dá)式的返回值是undefiend,當(dāng)next()方法有傳入?yún)?shù)時(shí)岔激,該參數(shù)會(huì)作為上一步y(tǒng)eild的返回值勒极。具體的例子如下:
function* sendParameter(){
console.log("strat");
var x = yield '2';
console.log("one:" + x);
var y = yield '3';
console.log("two:" + y);
console.log("total:" + (x + y));
}
var sendp1 = sendParameter();
sendp1.next();
// strat
// {value: "2", done: false}
sendp1.next();
// one:undefined
// {value: "3", done: false}
sendp1.next();
// two:undefined
// total:NaN
// {value: undefined, done: true}
next傳參
var sendp2 = sendParameter();
sendp2.next(10);
// strat
// {value: "2", done: false}
sendp2.next(20);
// one:20
// {value: "3", done: false}
sendp2.next(30);
// two:30
// total:50
// {value: undefined, done: true}
16.async函數(shù)
async是ES7才有的,與Promise和Generator有很大關(guān)聯(lián)虑鼎。
async函數(shù)返回一個(gè)Promise對(duì)象辱匿,可以通過(guò)then添加回調(diào)函數(shù);
async函數(shù)執(zhí)行時(shí)可能會(huì)遇到await表達(dá)式震叙,這時(shí)會(huì)將觸發(fā)的異步操作執(zhí)行完畢之后再繼續(xù)執(zhí)行async函數(shù)掀鹅;
await關(guān)鍵字在async函數(shù)內(nèi)部有效,外部會(huì)報(bào)語(yǔ)法錯(cuò)誤