重要版本es6
- es5 : 09年發佈 - es6 : 15年發佈, ECMA2015 - es7 : 16年發佈, ECMA2016 (微變)
嚴格模式 - use strict聲明 - 必須用var定義變量 - 禁止自定義函數this指向window - eval建立本身的做用域,避免函數不安全 - 對象不容許有重名的屬性
JSON對象 - JSON.stringify(obj/arr) //對象(數組)變字符 - JSON.parse(json) //字符變對象(數組)
Object經常使用的兩個靜態方法: - Object.create(prototype,[descriptors]) - 以對象爲原型對象建立新對象,並擴展能夠描述的屬性 - value: 指定值 - writable: false //是否可修改 - configurable: false //是否可刪 - enumerable: false //是否可列舉 - Object.defineProperties(Object,descriptors) - 指定對象擴展多個屬性 - get //獲取這個屬性時惰性創建屬性值 - set //修改這個屬性時觸發的函數(外部修改無效) 對象自己的兩個方法: - get propertyName(){} //獲取propertyName時惰性創建屬性值 - set propertyName(data){} //修改時觸發的函數(外部修改無效)
Array.prototype.indexOf(value) Array.prototype.lastIndexOf(value) Array.prototype.forEach(function(item,index){}) //同步遍歷,arguments僞數組不能夠用 Array.prototype.map(function(item,index){}) Array.prototype.filter(function(item,index){})
-bind //改變返回 -call apply//改變執行(js)
- let - 塊級做用域有效 - 不可重複定義 - 不會變量提高 - 特別地,循環定義時let僅第一次有效,不一樣於var爲全局變量 - const - 定義常量 - 其他同let
- 對象或數組
- `${}`
- 變量key value同名 - 函數func(){}
- 官方:箭頭函數無本身的this(因此按照閉包原理:this不是在調用的時候決定的,而是在定義的時候所處的對象就是this) - 沿做用域鏈,有外層函數就是外層函數的this,無直到最外層則爲window
- 函數可變參數 - 只可放在最後 - 擴展運算符 - 展開數組元素
- 定義函數時能夠給函數參數設定形參默認值
- Promise是一個構造函數,能夠生成promise實例對象 - 解決異步操做的回調地獄問題(實際未解決) - promise實例對象的三個狀態 - 初始化狀態pending - 操做成功狀態fullfilled - 操做失敗狀態rejected - 建立實例對象 let promise = new Promise((resolve, reject)=>{ // pending狀態下:放置異步操做代碼與構造函數外同步執行 // fullfilled狀態下:操做成功調用resolve(valueSuccess)函數傳值 // rejected狀態下:操做失敗調用reject(valueErr)函數傳值 }) promise.then((valueSuccess)=>{}, (valueErr)=>{})//響應成功或失敗進而執行代碼,兩者只有先調用的會有做用
Symbol是es6新增的一個原始數據類型(String,Number,Boolean,Null,Undefined,Object) -Symbol產生的值是惟一的,可作key,只能夠obj[symbol]形式 -Symbol值不能夠和其餘類型進行計算 -遍歷時(for in,for of)不會遍歷出Symbol的屬性 -傳參作標識 let symbol = Symbol('標識')
做用: - iterator是一種接口機制,提供一個統一的訪問接口(在Symbol.interator屬性上部署接口) - 是數據結構能夠按照某種次序排列 -將iterator接口部署到數據類型(數組,字符串,arguments僞數組,set容器,map容器)上,可使用新命令for of(對象不能夠哦) -三點運算符,解構賦值,其實默認調用interator接口 原理: - 建立一個遍歷器對象(指針對象),指向數據結構的起始位置 - 第一次調用next()方法,指針指向成員,依次向下 - next()方法返回{value:當前成員的值,done:布爾值} - 遍歷結束value值爲undefined,done爲true let myInterator = (arr) => { let temp = 0 return { next() { return temp < arr.length ? {value: arr[temp++], done: false} : {value: undefined, done: true} } } } } } -部署原理 let data = { [Symbol.interator]: myInterator函數原理(arr改爲this原對象data) }
概念
- 解決異步編程方法之一(也未實際解決)
- 惰性求值(能夠暫停),yield暫停,next啓動
用法原理 - 代碼演示 function* Generator() { yield 'first' let two = yield 'second' //two等於 哈哈 next傳入的參數給上一次的返回結果 return 'four' } let myGenerator = Generator() //生成一個Interator指針對象,代碼不執行 console.log(myGenerator.next()) console.log(myGenerator.next()) console.log(myGenerator.next('哈哈')) console.log(myGenerator.next())
// { value: 'first', done: false } // { value: 'second', done: false } // { value: 'four', done: true } // { value: undefined, done: true }
爲對象添加Symbol.interator爲遍歷器屬性可用for of
let obj = {name: 'wang', age: 22}
obj[Symbol.interator] = function* myGenerator(){
yield 1
yield 2
yield 3
}
for(let item of obj){console.log(item)} //分別爲1,2,3
用法實例(未真正解決)
- 代碼
function getNews(url) {
fetch(url).then(r => r.json()).then(data => {
//異步獲取的數據
getGenerator.next(data)
})
}
function firstDoSomething(data) {
//執行的操做
}
function* myGenerator() {//本來的一層層回調操做在這裏,類同步執行
let data = yield getNews('哈哈')
yield firstDoSomething(data)
// yield secondDoSomething(data) yield一層層異步獲取以後處理函數
}
let getGenerator = myGenerator()
getGenerator.next()
async - 解決異步回調問題 - Generator的語法糖 - async老是返回一個Promise對象,可用其方法(如then) - Generator的語法糖,async相似取代*, await相似取代yield 代碼 async function first() { return new Promise(resolve => { //執行異步操做 let data = {} resolve(data) //reject會報錯,通常用傳resolve('錯誤信息')來處理 }) } async function test() { //await普通函數獲取是return值 //await async獲取是promise的resolve參數值或reject且報錯 // let data = await first() console.log(data) // await second 回調嵌套層的每一個操做,與Generator思想同樣 // await third } test()
class Person extends Father { //extends Father繼承 constructor(name, age, sex) { //經過constructor函數建立實例對象 super(name, age) //調用父類構造函數,有父必寫 this.sex = sex } // function fun(){}不容許 fun() { //方法綁在原型上 console.log(this.sex) } } let obj = new Person('wang', 15, 'boy') obj.fun()
字符串 - string.includes(str) //判斷是否包含指定的字符串 - string.startsWith(str) //是否以指定字符串開頭 - string.endsWith(str) - string.repeat(count) //字符串變成重複的次數 數值 - 二進制和八進制表示: 二進制0b, 八進制0o - Number.isFinite(Infinity) //判斷是不是有限大的數 - Number.NaN(num) //判斷是不是NaN - Number.isInteger(num) //判斷是不是整數 - Number.parseInt(str) //將字符串轉化爲數值,首含即取(Number首含爲NaN) - Math.trunc(num) //去除小數部分 數組 - Array.from(v) //將僞數組或可遍歷對象變成真數組 - Array.of(v1,v2,v3) //將參數返回成一個數組 - arr.find(callback) //callback(item, index)類filter,返回知足條件的第一個值 - arr.findIndex(callback) //同上,返回第一個索引 對象 - Object(v1, v2) //判斷兩個數據是否相等 - 嚴格比較(相似===) - Object.is(0, -0) 不等 //類表面字符串形式比較 - Object.is(NaN, NaN) 相等 - let temp = Object.assign(target, source1, source2, source3) //將source123的屬性賦值給target,target與temp徹底同樣 - 能夠經過obj.__proto__修改對象的隱式原型
拷貝數據的方法 - 直接賦值= //淺拷貝 - Object.assign() //淺拷貝,一層深度值類型深拷,引用類型淺了 - Array.prototype.concat() //淺拷貝,同上 - Array.prototype.slice() //淺拷貝,同上 - JSON.parse(JSON.stringify()) //深拷貝,JSON.stringify不支持函數,Symbol,undefined
Object.prototype.toString.call() -調用原生的未被重寫的toString -皆可判斷成Number,String,Boolean,Null,Undefined,Array,Function,Object,Symbol字符串 深度克隆代碼 - 克隆自定義的函數其實並非真正克隆,如本身增長屬性的狀況也會修改 let a = function (){} let b = a b['test'] = 'test' console.log(a['test']) //test 代碼實現 function deepClone(a) { let type = Object.prototype.toString.call(a).slice(8, -1) if (type === 'Object' || type === 'Array') { let result if (type === 'Object') { result = {} } else { result = [] } for (let i in a) { result[i] = deepClone(a[i]) } return result } else { return a } }
Set容器 - 無序不可重複的多個值得集合體 - new Set(array) - add(value) - delete(value) - has(value) - clear() -size Map容器 - 無序key不可重複的key-value集合體 - new Map([[key1, value1], [key2, value2]]) - set(key,value) - get(key) - delete(key) - has(key) - clear() - size
可遍歷 - 字符串 - 數組 - 僞數組 - Set - Map - 沒有對象
上文講過
console.log(5**3) //125
數組 - Array.prototype.includes(value) //判斷數組中是否有value