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