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