## **理解ES**
1. 全稱: ECMAScript
2. js語(yǔ)言的規(guī)范
3. 我們用的js是它的實(shí)現(xiàn)
4. js的組成
* ECMAScript(js基礎(chǔ))
* 擴(kuò)展-->瀏覽器端
* BOM
* DOM
* 擴(kuò)展-->服務(wù)器端
* Node.js
## ES5
1. **嚴(yán)格模式**
* 運(yùn)行模式: 正常(混雜)模式與嚴(yán)格模式
* 應(yīng)用上嚴(yán)格式: 'strict mode';
* 作用:
* 使得Javascript在更嚴(yán)格的條件下運(yùn)行
* 消除Javascript語(yǔ)法的一些不合理、不嚴(yán)謹(jǐn)之處,減少一些怪異行為
* 消除代碼運(yùn)行的一些不安全之處,保證代碼運(yùn)行的安全
* 需要記住的幾個(gè)變化
* 聲明定義變量必須用var
* 禁止自定義的函數(shù)中的this關(guān)鍵字指向全局對(duì)象
* 創(chuàng)建eval作用域, 更安全
2. **JSON對(duì)象**
* 作用: 用于在json對(duì)象/數(shù)組與js對(duì)象/數(shù)組相互轉(zhuǎn)換
* JSON.stringify(obj/arr)
js對(duì)象(數(shù)組)轉(zhuǎn)換為json對(duì)象(數(shù)組)
* JSON.parse(json)
json對(duì)象(數(shù)組)轉(zhuǎn)換為js對(duì)象(數(shù)組)
3. Object擴(kuò)展
* Object.create(prototype[, descriptors]) : 創(chuàng)建一個(gè)新的對(duì)象
* 以指定對(duì)象為原型創(chuàng)建新的對(duì)象
* 指定新的屬性, 并對(duì)屬性進(jìn)行描述
* value : 指定值
* writable : 標(biāo)識(shí)當(dāng)前屬性值是否是可修改的, 默認(rèn)為true
* **get方法** : 用來(lái)得到當(dāng)前屬性值的回調(diào)函數(shù)
* **set方法** : 用來(lái)監(jiān)視當(dāng)前屬性值變化的回調(diào)函數(shù)
* Object.defineProperties(object, descriptors) : 為指定對(duì)象定義擴(kuò)展多個(gè)屬性
4. Array擴(kuò)展
* Array.prototype.indexOf(value) : 得到值在數(shù)組中的第一個(gè)下標(biāo)
* Array.prototype.lastIndexOf(value) : 得到值在數(shù)組中的最后一個(gè)下標(biāo)
* **Array.prototype.forEach(function(item, index){}) : 遍歷數(shù)組**
* **Array.prototype.map(function(item, index){}) : 遍歷數(shù)組返回一個(gè)新的數(shù)組**
* **Array.prototype.filter(function(item, index){}) : 遍歷過(guò)濾出一個(gè)子數(shù)組**
5. **Function擴(kuò)展**
* Function.prototype.bind(obj)
* 將函數(shù)內(nèi)的this綁定為obj, 并將函數(shù)返回
* 面試題: 區(qū)別bind()與call()和apply()?
* fn.bind(obj) : 指定函數(shù)中的this, 并返回函數(shù)
* fn.call(obj) : 指定函數(shù)中的this,并調(diào)用函數(shù)
6. Date擴(kuò)展
* Date.now() : 得到當(dāng)前時(shí)間值
## ES6
1. **2個(gè)新的關(guān)鍵字**
* let/const
* 塊作用域
* 沒(méi)有變量提升
* 不能重復(fù)定義
* 值不可變
2. **變量的解構(gòu)賦值**
* 將包含多個(gè)數(shù)據(jù)的對(duì)象(數(shù)組)一次賦值給多個(gè)變量
* 數(shù)據(jù)源: 對(duì)象/數(shù)組
* 目標(biāo): {a, b}/[a, b]
3. 各種數(shù)據(jù)類型的擴(kuò)展
* 字符串
* **模板字符串**
* 作用: 簡(jiǎn)化字符串的拼接
* 模板字符串必須用``
* 變化的部分使用${xxx}定義
* contains(str) : 判斷是否包含指定的字符串
* startsWith(str) : 判斷是否以指定字符串開(kāi)頭
* endsWith(str) : 判斷是否以指定字符串結(jié)尾
* repeat(count) : 重復(fù)指定次數(shù)
* 對(duì)象
* **簡(jiǎn)化的對(duì)象寫(xiě)法**
```
let name = 'Tom';
let age = 12;
let person = {
name,
age,
setName (name) {
this.name = name;
}
};
```
* Object.assign(target, source1, source2..) : 將源對(duì)象的屬性復(fù)制到目標(biāo)對(duì)象上
* Object.is(v1, v2) : 判斷2個(gè)數(shù)據(jù)是否完全相等
* __proto__屬性 : 隱式原型屬性
* 數(shù)組
* Array.from(v) : 將偽數(shù)組對(duì)象或可遍歷對(duì)象轉(zhuǎn)換為真數(shù)組
* Array.of(v1, v2, v3) : 將一系列值轉(zhuǎn)換成數(shù)組
* find(function(value, index, arr){return true}) : 找出第一個(gè)滿足條件返回true的元素
* findIndex(function(value, index, arr){return true}) : 找出第一個(gè)滿足條件返回true的元素下標(biāo)
* 函數(shù)
* **箭頭函數(shù)**
* 用來(lái)定義匿名函數(shù)
* 基本語(yǔ)法:
* 沒(méi)有參數(shù): () => console.log('xxxx')
* 一個(gè)參數(shù): i => i+2
* 大于一個(gè)參數(shù): (i,j) => i+j
* 函數(shù)體不用大括號(hào): 默認(rèn)返回結(jié)果
* 函數(shù)體如果有多個(gè)語(yǔ)句, 需要用{}包圍
* 使用場(chǎng)景: 多用來(lái)定義回調(diào)函數(shù)
* **形參的默認(rèn)值**
* 定義形參時(shí)指定其默認(rèn)的值
* **rest(可變)參數(shù)**
* 通過(guò)形參左側(cè)的...來(lái)表達(dá), 取代arguments的使用
* **擴(kuò)展運(yùn)算符(...)**
* 可以分解出數(shù)組或?qū)ο笾械臄?shù)據(jù)
4. set/Map容器結(jié)構(gòu)
* 容器: 能保存多個(gè)數(shù)據(jù)的對(duì)象, 同時(shí)必須具備操作內(nèi)部數(shù)據(jù)的方法
* 任意對(duì)象都可以作為容器使用, 但有的對(duì)象不太適合作為容器使用(如函數(shù))
* **Set的特點(diǎn)**: 保存多個(gè)value, value是不重復(fù) ====>數(shù)組元素去重
* **Map的特點(diǎn)**: 保存多個(gè)key--value, key是不重復(fù), value是可以重復(fù)的
* API
* Set()/Set(arr) //arr是一維數(shù)組
* add(value)
* delete(value)
* clear();
* has(value)
* size
*
* Map()/Map(arr) //arr是二維數(shù)組
* set(key, value)
* delete(key)
* clear()
* has(key)
* size
5. **for--of循環(huán)**
* 可以遍歷任何容器
* 數(shù)組
* 對(duì)象
* 偽/類對(duì)象
* 字符串
* 可迭代的對(duì)象
6. **Promise**
* 解決`回調(diào)地獄`(回調(diào)函數(shù)的層層嵌套, 編碼是不斷向右擴(kuò)展, 閱讀性很差)
* 能以同步編碼的方式實(shí)現(xiàn)異步調(diào)用
* 在es6之前原生的js中是沒(méi)這種實(shí)現(xiàn)的, 一些第三方框架(jQuery)實(shí)現(xiàn)了promise
* ES6中定義實(shí)現(xiàn)API:
```
// 1. 創(chuàng)建promise對(duì)象
var promise = new Promise(function(resolve, reject){
// 做異步的操作
if(成功) { // 調(diào)用成功的回調(diào)
resolve(result);
} else { // 調(diào)用失敗的回調(diào)
reject(errorMsg);
}
})
// 2. 調(diào)用promise對(duì)象的then()
promise.then(function(
result => console.log(result),
errorMsg => alert(errorMsg)
))
```
7. **class類**
* 用 class 定義一類
* 用 constructor() 定義構(gòu)造方法(相當(dāng)于構(gòu)造函數(shù))
* 一般方法: xxx () {}
* 用extends來(lái)定義子類
* 用super()來(lái)父類的構(gòu)造方法
* 子類方法自定義: 將從父類中繼承來(lái)的方法重新實(shí)現(xiàn)一遍
* js中沒(méi)有方法重載(方法名相同, 但參數(shù)不同)的語(yǔ)法
8. **模塊化(后面講)**
## ES7
* 指數(shù)運(yùn)算符: **
* Array.prototype.includes(value) : 判斷數(shù)組中是否包含指定value
* **區(qū)別方法的2種稱謂**
* 靜態(tài)(工具)方法
* Fun.xxx = function(){}
* 實(shí)例方法
* 所有實(shí)例對(duì)象 : Fun.prototype.xxx = function(){} //xxx針對(duì)Fun的所有實(shí)例對(duì)象
* 某個(gè)實(shí)例對(duì)象 : fun.xxx = function(){} //xxx只是針對(duì)fun對(duì)象
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。