es6學(xué)習(xí)

es6語法

*let和const

1.{}包住里面就是塊作用域热凹,let只在塊作用域生效
2.let不能重復(fù)定義相同變量
3.const是常量卢佣,不能修改檩电,定義后是只讀不能修改贤笆。
4.const聲明的時候必須賦值留荔,也有塊作用域吟孙。
5.const如果定義成對象,就可以修改的聚蝶,對象是引用類型(返回值是存儲內(nèi)存的指針杰妓,指針是不變的,但是對象本身是可以變的)碘勉。

*解構(gòu)賦值

左邊一個結(jié)構(gòu)巷挥,右邊一個結(jié)構(gòu),然后左右一一對應(yīng)進(jìn)行賦值

數(shù)組解構(gòu)賦值

{
  let a,b,rest;
  [a,b] = [1,2];
  console.log(a,b) //1 2
}
{
  let a,b,rest;
  [a,b,...rest] = [1,2,3,4,5,6];
  console.log(a,b,rest) //1 2 [3,4,5,6]
}
{
  let a,b,c,rest;
  [a,b,c=3] = [1,2];
  console.log(a,b) //1 2 如果不定義c給默認(rèn)值3验靡,就等于定義沒賦值undefined
}

對象解構(gòu)賦值

{
  let a,b;
 ({a,b}={a:1,b:2})
  console.log(a,b) //1 2
}

字符串解構(gòu)賦值

布爾值解構(gòu)賦值

函數(shù)參數(shù)解構(gòu)賦值

數(shù)值解構(gòu)賦值

應(yīng)用場景

適合變量交換
數(shù)組型
{
 let a =1;
 let b=2;
 [a,b] = [b,a]
 console.log(a,b) //2,1
}
{
 function f(){
   retrun [1,2]
 }
 let a,b
 [a,b]=f()
 console.log(a,b) //簡單接收返回值
}
{
 function f(){
   renturn [1,2,3,4,5]
 }
 let a,b,c
 [a,,,b] =f()
 console.log(a,b) // 1 4    按順序匹配用, 分割 倍宾。用來選擇性接收某幾個變量
}
{
 function f(){
   renturn [1,2,3,4,5]
 }
 let a,b,c
 [a,...b] =f()
 console.log(a,b) // 1 [2,3,4,5]  這種是不知道返回的數(shù)組長度是多少,我只關(guān)心第一個胜嗓,其他就返回一個數(shù)組高职,想用就遍歷,就等于取出第一個元素辞州,其他放在一個數(shù)組里面
}
對象型
{
 let o = {p:42,q:true}
 let {p,q} = o
 console.log(p,q) //42 true
}
{
 let {a=10,b=5} = {a:3}
 console.log(a,b) // 3 5
}
{
 let metaData = {
   title:'abc',
   test:[{
     title:'test',
     desc:'description'
   }] 
 }
 let {title:esTitle,test:[{title:cnTitle}]} = metaData;
 console.log(esTitle,cnTitle) // abc test
}

*正則擴(kuò)展

正則新增特性

構(gòu)造函數(shù)的變化
  //es5 
  let regex new RegExp('xyz','i') //i忽略大小寫  兩個參數(shù) 
  let regx2 = new RegExp(/xyz/i) //一個參數(shù)
  //es6
  let regx3 = new RegExp(/xyz/ig,'i') //es6第二個參數(shù)會覆蓋第一個參數(shù)所制定
的修飾符
  console.log(regex3.flags)//獲取當(dāng)前的修飾符
正則方法的擴(kuò)展
u修飾符
{
  console.log('u-1',/^\uD83D/.test('\uD83D\uDC2A')) // true 當(dāng)成兩個字母
  console.log('u-1',/^\uD83D/u.test('\uD83D\uDC2A'))//false  u會把2個字符當(dāng)作一個字符
}
y修飾符
{
  let s = 'bbb_bb_b'
  let a1 = /b+/g
  let a2 = /b+/y
  console.log('one',a1.exec(s),a2.exec(s))
  console.log('two',a1.exec(s),a2.exec(s))
  //g是從上一次匹配的位置再尋找怔锌,不強(qiáng)調(diào)必須是匹配下一個字符的開始匹配,中間任何位置匹配上都算
  //y是一定要匹配到下一個字符也匹配到才算
}
s修飾符

*字符串拓展

新增特訓(xùn)

Unicode表示法
console.log('a',`\u0061`)
console.log('a',`\u20BB7`) //這個會打印亂碼和7  因?yàn)榻M合超過0XFFFF字節(jié)
console.log('a',`\u{20BB7}`)
遍歷接口
let str = '\u{20bb7}abc'
for(let code of str){
  console.log('es6',code)
}
模版字符串
let name='list'
let info = 'hello world'
let m = `i am ${name},${info}`
新增方法10種

//判斷字符串種是否包含某些字符

let str  = 'string'
console.log('includes',str.includes('r')) //true

//判斷字符串是不是以某個字符為起始或者終始

let str  = 'string'
console.log('start',str.startsWith('str')) //true
console.log('end',str.endsWith('ng')) //true

//復(fù)制字符串

let str = 'abc'
console.log(str.repeat(2)) //abcabc

//補(bǔ)位(可用于日期選擇)

//向前補(bǔ)
console.log('1'.padStart(2,'0')) //意思就是要2位,不夠用0補(bǔ)产禾,輸出01
//向后補(bǔ)
console.log('1'.padEnd(2,'0')) //意思就是要2位,不夠用0補(bǔ)牵啦,輸出10

//raw \轉(zhuǎn)義 就是又加一個\

console.log(String.raw`Hi\n${1+2}`)
console.log(`Hi\n${1+2}`)

//標(biāo)簽?zāi)0?br> 參考https://www.cnblogs.com/sminocence/p/6832331.html
參考http://www.reibang.com/p/c65b9930dd11

*數(shù)值擴(kuò)展

數(shù)值處理新增特性

1.新增方法
console.log(Number.isFinite(15)) //判斷這個數(shù)是不是無窮大
console.log(NUmber.isNaN(NaN)) //判斷這個數(shù)是不是一個數(shù)
console.log(Number.isInteger(25))//判斷這個數(shù)是不是一個整數(shù)
console.log(Math.trnc(4.1))//取整  小數(shù)會刪掉
console.log(Math.sign(-5))//判斷是否正負(fù)數(shù)或者0
2.方法調(diào)整

數(shù)組擴(kuò)展

數(shù)組新增特性
Array.form
//把一個集合轉(zhuǎn)換成真正的數(shù)組
<p>你好</p>
<p>你好1</p>
<p>你好2</p>
 {
  let p = document.querySelectorAll('p')
  let pArr = Array.from(p)
  pArr.forEach(function(item){
    console.log(item.texrContent)
  })
}
{
  //第二個用法 可以遍歷第一個參數(shù)的數(shù)組亚情,類似map方法
  console.log(Array.from([1,3,4],function(item){return item*2}))
}
Array.of
//把一組數(shù)據(jù)變量,轉(zhuǎn)換成數(shù)據(jù)類型
let arr = Array.of(3,9,11,20,30)
console.log(arr)//[3,9,11,20,30]
copyWithin
{
  console.log([1,2,3,4,5].copyWithin(0,3,4)) 1參數(shù):從那個位置開始替換 2:從那個位置開始讀取位置 3:從那個位置截止   //[4,2,3,4,5]
}
find\findIndex
{
  //查找數(shù)組中有沒有一個元素大于3的哈雏,找出第一個滿足就停止查找
  console.log([1,2,3,4,5,6].find(function(item){ return item>3})) //4
}
{
  //查找數(shù)組中有沒有一個元素大于3的楞件,找出第一個滿足返回下標(biāo)就停止查找
  console.log([1,2,3,4,5,6].findIndex(function(item){ return item>3})) //3
}
fill
  console.log([1,'a',undefined].fill(7))//把數(shù)組里面的每個值變成7
 //['a','b','c'].fill(7,1,3) 后面2個參數(shù)是起始和結(jié)束位置,從第一個開始換一直到第三個
entries\keys\values
//keys返回下標(biāo)
{
  for(let index of ['1','c','ks'].keys()){
    console.log(index)
  }
}
//values返回值 (有兼容問題這個)
{
  for(let value of ['1','c','ks'].values()){
    console.log(value)
  }
}
//entries返回下標(biāo)和值
{
  for(let [index,value] of ['1','c','ks'].entries()){
    console.log(value,index)
  }
}
includes
//查找一個數(shù)組是否包含某個元素
{
  console.log([1,2,NaN].includes(1)) //true
}

*函數(shù)擴(kuò)展

函數(shù)新增特性

參數(shù)默認(rèn)值
{
  //默認(rèn)值變量后面不能有再有沒有默認(rèn)值的變量I驯瘛M两!E砀;埔痢!
  function test(x,y='world'){
    console.log(x,y)
  }
  test('hello')
}
rest參數(shù)
//把一系列的參數(shù)轉(zhuǎn)換成一個數(shù)組
//作用就是把你不確定有多少個參數(shù)派殷,最終把你輸入的參數(shù)轉(zhuǎn)換成一個數(shù)組
//注意rest參數(shù)后面不能再有參數(shù)还最,不然會報錯
{
  function test3(...arg){
     for(let v of arg){
        console.log(v)
     }
  }
  test3(1,2,3,4,5,'a')
}
擴(kuò)展運(yùn)算符
{
  //把一個數(shù)組拆開
  console.log(...[1,2,3])
}
箭頭函數(shù)
{
//第一部分函數(shù)名,函數(shù)參數(shù)(如果沒有參數(shù)就給一個())毡惜,函數(shù)返回值
  let arrow = v => v*2
  console.log(arrow(3))  //6
}
this綁定
尾調(diào)用
//提升性能
{
   function tail(x){
      console.log('tail',x)
    }
  funciton fx(x){
    return tail(x)
  }
  fx(123)
}

*對象擴(kuò)展

函數(shù)新增特性

簡潔表示法
{
  let o = 1
  let l =2
  let es5 = {
    o:o,
    k:k
  }
  let es6 = {
    o,
    k
  }
}
{
  let es5_method = {
    hello:function(){
         console.log('hello')
    }
  }
 let es6_method = {
    hello(){
         console.log('hello')
    }
  }
}
屬性表達(dá)式
{
  let a = 'b'
  let es5_obj={
    a:'c',
    b:'c'
  }
//[]相當(dāng)于傳了個變量過去,比如像生成一個對象拓轻,k值可以變化的 就挺有用的
  let es6_obj = {
    [a]:'c'
  }
  console.log(es6_obj) // b:c
}
擴(kuò)展運(yùn)算符
{
  let {a,b,...c} = {a:'test',b:'kill',c:'ddd',d:'ccc'}
  //a對應(yīng)a b對應(yīng)b c對應(yīng)后面的c,d
  //如果后面還有都統(tǒng)統(tǒng)賦值給c
}  
Object新增方法
  //新增API 
  //和===一樣
  console.log('字符串',Object.is('abc','abc'),'abc'==='abc')
  console.log('數(shù)組',Object.is([],[]),[]===[]) //數(shù)組是引用類型,地址指向不一樣经伙,所以打印是 false
  console.log('拷貝',Object.assign({a:'a'},{b:'b'}))  //就會合并在一起扶叉,淺拷貝
  //遍歷
  let test = {k:123,o:456}
  for(let [key,value] of Object.entries(test)){
    console.log([key,value])
  }

*Symbol

Symbol的概念

提供一個獨(dú)一無二的值

{
  //聲明
  let a1 = Symbol();
  let a2 = Symbol();
  console.log(a1===a2) //false
  
  let a3 = Symbol.for('a3')
  let a4 = Symbol.for('a3')  //先去全局找 有就引用,沒就創(chuàng)建一個獨(dú)一無二的值
  console.log(a3===a4) //true
}

Symbol的作用

{
  //可以生成唯一的帕膜,不會重復(fù)枣氧,就算重寫也覆蓋不到。
  //注意泳叠,如果用Symbol定義作瞄,用for of 是取不到的,需要用Object.getOwnPropertySymbols()
  let a1 = Symbol.for('abc')
  let obj = {
    [a1]: '123',
    'abc': 345,
    'c': 456
  }
  console.log(obj) //abc:345,c:456,Symbol(abc):123
  Object.getOwnPropertySymbols(obj).forEach*function(item){
    console.log(obj[item])  //只能拿到k值是Symbol的
  }
  
  Reflect.ownKeys(obj) //能拿到Symbol和非Symbol的值  也是返回數(shù)組,可以直接使用forEach
}

*數(shù)據(jù)結(jié)構(gòu)

Set的用法(數(shù)組去理解危纫,但是不能重復(fù))

{
  let list = new Set();
  list.add(5)
  list.add(7)//在Set里面增加?xùn)|西要用add
  console.log(list.size) //在Set里面的長度宗挥,理解是數(shù)組的length 
}
{
  let arr = [1,2,3,4,5]
  let list  = new Set(arr) //標(biāo)示list是轉(zhuǎn)換一個Set的數(shù)據(jù)類型集合
}
{
  let list  = new Set()
  lista.add(1)
  lista.add(2)
  lista.add(1)
  console.log(list) //最后一個1不會存在,去重了

  let arr = [1,2,3,1,2]
  let list2 = new Set(arr)
  console.log(list2) //1.2.3  不會對數(shù)據(jù)轉(zhuǎn)換种蝶,如果[1,2,3,1,'2'] 字符串2不會過濾
}
{
  let arr = ['add','delete','clear','has']
  let list = new Set(arr)
  console.log('has',list.has('add')) //true 判斷集合是否含有add
  console.log('delete',list.delete('add')) //{'delete','clear','has'}
  list.clear()
  console.log('list',list)//清空所有了
}
//遍歷
{
  let arr = ['add','delete','clear','has']
  let list = new Set(arr)
//輸出都一樣 都是名稱
  for(let key of list.keys()){
    console.log(key)
  }
//輸出都一樣 都是名稱
 for(let value of list.values()){
    console.log(value)
  }
}

WeakSet的用法 (弱引用)

//支持的數(shù)據(jù)類型區(qū)別契耿,WeakSet只能是對象,弱引用螃征,不會檢測有沒有在其他地方用過搪桂,不會改變原指向地址
{
  let weakList = new WeakSet()
  let arg = {}
  weakList.add(arg)
  console.log(weakList) // {}
}

Map的用法(Object去理解,一個k,v值)

{
  let map = new Map()
  let arr = ['123']
  map.set(arr,456) //添加元素    map的k可以是任何的數(shù)據(jù)類型
  console.log(map.get(arr)) //456
  console.log(map) // ['123'] => 456
}
{
//第二種定義方式
  let map = new Map([['a',123],['b',456]])
  console.log(map)
  map.size //獲取長度
  map.delete('a') //刪除
  map.clear() //清空
}

WeakMap的用法 (弱引用)

//和WeakSet一樣

JSON 和 Map的相同點(diǎn)就是 key,value的方式存儲的, 而JSON精確的說鍵值只支持String(也可以存數(shù)值,但是數(shù)值存進(jìn)去,取出來還是String),Map鍵值都可以存儲對象.
鍵值對的存儲結(jié)構(gòu)你自己也可以寫.

最后總結(jié):

filter方法是對原數(shù)組進(jìn)行過濾篩選,產(chǎn)生一個新的數(shù)組對象

map方法對元素中的元素進(jìn)行加工處理踢械,產(chǎn)生一個新的數(shù)組對象酗电。

Map與Array的對比

//數(shù)據(jù)結(jié)構(gòu)橫向?qū)Ρ龋瞿诹校槟焓酰模瑒h

{
  let map = new Map()
  let array = []
  //增
  map.set('t',1)
  array.push({t:1})
  console.info(map,array)
  
  //查
  let map_exist = map.has('t')
  let array_exist = array.find(item=>item.t)
  console.info(map_exist,array_exist)

  //改
  map.set('t',2)
  array.forEach(item=>item.t?item.t=2:'')
  console.info(map_exist,array_exist)

  //刪
  map.delete('t')
  let index = array.findIndex(item=>item.t)
  array.splice(index,1)
}

Set與Array的對比

{
  let set = new Set()
  let array=[]
  
  //增
  set.add({t:1})
   array.push({t:1})

  //查
  let set_exist = set.has({t:1})
  let array_exist = array.find(item=>item.t)

  //改
  set.forEach(item=>item.t?item.t=2:'')
  array_exist.forEach(item=>item.t?item.t=2:'')

  //刪
  set.forEach(item=>item.t?set.delete(item):'')
  let index = array.findIndex(item=>item.t)
  array.splice(index,1)
}

Map與Object的對比

Set與Object的對比

{
  //map,set,object對比
  let item  = {t:1}
  let map = new Map()
  let set = new Set()
  let obj = {}
  
  //增
  map.set('t',1)
  set.add(item)
  obj['t'] = 1

  //查
   map.has('t')
   set.has(item)
   't' in obj
  
  //改
  map.set('t',2)
  item.t = 2
  obj['t'] = 2
  
  //刪除
  map.delete('t')
  set.delete(item)
  delete obj['t']
  
}
//優(yōu)先使用map,如果對數(shù)據(jù)要求比較高唯一性考慮set

*Proxy和Reflect

Proxy和Reflect的概念

{
//有一個類似供應(yīng)商的原始數(shù)據(jù)
  let obj = {
    time:'2017-03-11',
    name:'net',
    _r:123
  }

//然后通過new Proxy先生成一個對象话瞧,這個對象是映射obj,然后中間做一些操作嫩与,最后用戶訪問的是monitor,不管用戶是讀取還是設(shè)置monitor對象,最終由這個Proxy傳遞給obj對象
  let monitor = new Proxy(obj,{
    //攔截對象屬性的讀取
    get(target,key){
      return target[key].replace('2017','2018') //不管你讀取我什么屬性交排,我要把屬性所有的2017值替換成2018
     },
    //攔截對象設(shè)置屬性
    set(target,key,value){
       if(key === 'name'){
         return target[key] =value 
       }else{
         return target[key]  
       }//只允許修改name屬性
    },
    //攔截key in object操作
    has(target,key){
      if(key==='name'){
         return target[key]
      }else{
        return false
      }
    },
    //攔截刪除
    deleteProperty(target,key){
      if(key.indexOf('_')>-1){
        delete target[key];
        return true
      }else{
        return target[key]
      }
    },
    //攔截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
    ownKeys(target){
      return Object.keys(target).filter(item=>item!='time')
    }
  })
  
  //讀取操作   monitor.time
  console.log('get',monitor.time)
  //設(shè)置操作
  monitor.time = '2018' 
  console.log('set',monitor.time)
  //攔截in 
  console.log('has','name' in monitor)
  //刪除
  delete monitor.time
  console.log('delete',monitor)
  //循環(huán)
  console.log('ownKeys',Object.keys(monitor))
}


{
  let obj = {
    time:'2017-03-11',
    name:'net',
    _r:123
  }
  Reflect.get(obj,'time')
  Reflect.set('obj','name','mukewang')
  Reflect.has(obj,'name')
}

Proxy和Reflect的適用場景

{
  //對數(shù)據(jù)校驗(yàn)划滋,比如手機(jī)號格式是否正確
  function validator(target,validator){
    return  new Proxy(target,{
      _validator:validator,
      set(target,key,value,proxy){
        if(target.hasOwnProperty(key)){
          let va = this._validator[key];
          if(!!va(value)){
            return Reflect. set(target,key,value,proxy)
          }else{
             throw Error(不能說何止`${key}` 到 `${value}`)
          }
        }else{
          throw Error(`${key}` 不存在)
        }
      }
    })
  }
}

*類

類的概念

基本語法

{
  //基本定義和生成實(shí)例
  class Parent{
    constructor(name='mukewang'){
      this.name = name
    }
  }
   let v_parent = new Parent('v')
   console.log(v_parent)
}

類的繼承

{
   //繼承
  class Parent{
    constructor(name='mukewang'){
      this.name = name
    }
  }
  class Child extends Parent{
    
  }
  console.log(new Child())
}
{
   //繼承傳遞參數(shù)
  class Parent{
    constructor(name='mukewang'){
      this.name = name
    }
  }
  class Child extends Parent{
    constructor(name='child'){
      super(name) //覆蓋父類 完成子類向父類傳遞參數(shù), 這個一定要放在構(gòu)造函數(shù)的第一行
    }
  }
  console.log(new Child())
}

靜態(tài)方法

{
   //靜態(tài)方法 概念:是通過類去調(diào)用,而不是通過實(shí)例去調(diào)用
  class Parent{
    constructor(name='mukewang'){
      this.name = name
    }
    static tell(){ 
      console.log('tell')
    }
  }
  Parent.tell()
}

靜態(tài)屬性

{
  //靜態(tài)屬性
  class Parent{
    constructor(name='mukewang'){
      this.name = name
    }
  }
  Parent.type = 'test'
  console.log(Parent.type) //不用實(shí)例調(diào)用埃篓,用類調(diào)用
}

geter

{
  //getter,setter
   class Parent{
      constructor(name='mukewang'){
        this.name = name
      }
      //定義一個實(shí)例里的屬性
      get longName(){
        return 'mk' + this.name
      }
      set longName(value){
        this.name = value
      }
    }
  let v = new Parent()
  console.log('getter',v.longName) //mkmukewang
  v.longName =  'hello'
  console.log('setter',v.longName) //mkhello
}

setter

*Promise

什么是異步

Promise的作用

Promise的基本用法

{
  // 基本定義
  let ajax=function(callback){
    console.log('執(zhí)行');
    setTimeout(function () {
      callback&&callback.call()
    }, 1000);
  };
  ajax(function(){
    console.log('timeout1');
  })
}

{
  //基本操作
  let ajax=function(){
    console.log('執(zhí)行2');
    return new Promise(function(resolve,reject){
      setTimeout(function () {
        resolve()
      }, 1000);
    })
  };

  ajax().then(function(){
    console.log('promise','timeout2');
  })
}


{
  //多個.then用法  
  let ajax=function(){
    console.log('執(zhí)行3');
    return new Promise(function(resolve,reject){
      setTimeout(function () {
        resolve()
      }, 1000);
    })
  };

  ajax()
    .then(function(){
    return new Promise(function(resolve,reject){
      setTimeout(function () {
        resolve()
      }, 2000);
    });
  })
    .then(function(){
    console.log('timeout3');
  })
}


{
  //捕獲錯誤
  let ajax=function(num){
    console.log('執(zhí)行4');
    return new Promise(function(resolve,reject){
      if(num>5){
        resolve()
      }else{
        throw new Error('出錯了')
      }
    })
  }

  ajax(6).then(function(){
    console.log('log',6);
  }).catch(function(err){
    console.log('catch',err);
  });

  ajax(3).then(function(){
    console.log('log',3);
  }).catch(function(err){
    console.log('catch',err);
  });
}


高級用法

一处坪、Pomise.all的使用
Promise.all可以將多個Promise實(shí)例包裝成一個新的Promise實(shí)例。同時架专,成功和失敗的返回值是不同的稻薇,成功的時候返回的是一個結(jié)果數(shù)組,而失敗的時候則返回最先被reject失敗狀態(tài)的值胶征。

具體代碼如下:

let p1 = new Promise((resolve, reject) => {
  resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {
  resolve('success')
})

let p3 = Promse.reject('失敗')

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //['成功了', 'success']
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 失敗了塞椎,打出 '失敗'
})

Promse.all在處理多個異步處理時非常有用,比如說一個頁面上需要等兩個或多個ajax的數(shù)據(jù)回來以后才正常顯示睛低,在此之前只顯示loading圖標(biāo)案狠。

代碼模擬:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒來`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒來', '2秒后醒來' ]
}).catch((error) => {
  console.log(error)
})

需要特別注意的是,Promise.all獲得的成功結(jié)果的數(shù)組里面的數(shù)據(jù)順序和Promise.all接收到的數(shù)組順序是一致的钱雷,即p1的結(jié)果在前骂铁,即便p1的結(jié)果獲取的比p2要晚。這帶來了一個絕大的好處:在前端開發(fā)請求數(shù)據(jù)的過程中罩抗,偶爾會遇到發(fā)送多個請求并根據(jù)請求順序獲取和使用數(shù)據(jù)的場景拉庵,使用Promise.all毫無疑問可以解決這個問題。

二套蒂、Promise.race的使用
顧名思義钞支,Promse.race就是賽跑的意思,意思就是說操刀,Promise.race([p1, p2, p3])里面哪個結(jié)果獲得的快烁挟,就返回那個結(jié)果,不管結(jié)果本身是成功狀態(tài)還是失敗狀態(tài)骨坑。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打開的是 'failed'
})

原理是挺簡單的撼嗓,但是在實(shí)際運(yùn)用中還沒有想到什么的使用場景會使用到。

*lterator和for...of循環(huán)

什么是lterator接口

lterator的基本用法

{
  let arr=['hello','world'];
  let map=arr[Symbol.iterator]();
  console.log(map.next());
  console.log(map.next());
  console.log(map.next());
}

{
  let obj={
    start:[1,3,2],
    end:[7,9,8],
    [Symbol.iterator](){
      let self=this;
      let index=0;
      let arr=self.start.concat(self.end);
      let len=arr.length;
      return {
        next(){
          if(index<len){
            return {
              value:arr[index++],
              done:false
            }
          }else{
            return {
              value:arr[index++],
              done:true
            }
          }
        }
      }
    }
  }
  for(let key of obj){
    console.log(key);
  }
}

{
  let arr=['hello','world'];
  for(let value of arr){
    console.log('value',value);
  }
}

for...of

*Generator

基本概念

解決異步編程 async和await就是它的語法糖

next函數(shù)的用法

yield*的語法
{
  // genertaor基本定義
  let tell=function* (){
    yield 'a';
    yield 'b';
    return 'c'
  };

  let k=tell();

  console.log(k.next());
  console.log(k.next());
  console.log(k.next());
  console.log(k.next());
}

{
  let obj={};
  obj[Symbol.iterator]=function* (){
    yield 1;
    yield 2;
    yield 3;
  }

  for(let value of obj){
    console.log('value',value);
  }
}

{
  let state=function* (){
    while(1){
      yield 'A';
      yield 'B';
      yield 'C';
    }
  }
  let status=state();
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
  console.log(status.next());
}

// {
//   let state=async function (){
//     while(1){
//       await 'A';
//       await 'B';
//       await 'C';
//     }
//   }
//   let status=state();
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
//   console.log(status.next());
// }

*Decorator

基本概念

是一個函數(shù)用來修改類的行為

基本用法

{
  let readonly=function(target,name,descriptor){
    descriptor.writable=false;
    return descriptor
  };

  class Test{
    @readonly
    time(){
      return '2017-03-11'
    }
  }

  let test=new Test();

  // test.time=function(){
  //   console.log('reset time');
  // };

  console.log(test.time());
}


{
  let typename=function(target,name,descriptor){
    target.myname='hello';
  }

  @typename
  class Test{

  }

  console.log('類修飾符',Test.myname);
  // 第三方庫修飾器的js庫:core-decorators; npm install core-decorators
}

*模塊化

基本概念

ES6的模塊化語法

// export let A=123;
//
// export function test(){
//   console.log('test');
// }
//
// export class Hello{
//   test(){
//     console.log('class');
//   }
// }

let A=123;
let test=function(){
  console.log('test');
}
class Hello{
  test(){
    console.log('class');
  }
}

export default {
  A,
  test,
  Hello
}

//導(dǎo)入
import Lesson17 form './class/lesson17'

console.log(Lesson17.A)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市且警,隨后出現(xiàn)的幾起案子粉捻,更是在濱河造成了極大的恐慌,老刑警劉巖斑芜,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杀迹,死亡現(xiàn)場離奇詭異,居然都是意外死亡押搪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門浅碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來大州,“玉大人,你說我怎么就攤上這事垂谢∠没” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵滥朱,是天一觀的道長根暑。 經(jīng)常有香客問我,道長徙邻,這世上最難降的妖魔是什么排嫌? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缰犁,結(jié)果婚禮上淳地,老公的妹妹穿的比我還像新娘。我一直安慰自己帅容,他們只是感情好颇象,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布房待。 她就那樣靜靜地躺著抄邀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪傅物。 梳的紋絲不亂的頭發(fā)上麦乞,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天蕴茴,我揣著相機(jī)與錄音,去河邊找鬼姐直。 笑死荐开,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的简肴。 我是一名探鬼主播晃听,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了能扒?” 一聲冷哼從身側(cè)響起佣渴,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎初斑,沒想到半個月后辛润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡见秤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年砂竖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹃答。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乎澄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测摔,到底是詐尸還是另有隱情置济,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布锋八,位于F島的核電站浙于,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挟纱。R本人自食惡果不足惜羞酗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紊服。 院中可真熱鬧整慎,春花似錦、人聲如沸围苫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剂府。三九已至拧揽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腺占,已是汗流浹背淤袜。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衰伯,地道東北人铡羡。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像意鲸,于是被迫代替她去往敵國和親烦周。 傳聞我的和親對象是個殘疾皇子尽爆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容