變量的解構賦值

  變量的解構賦值(模式匹配)數組

  ...  拓展運算符  能夠將數據類型變爲數組app

  解構賦值:數組的解構賦值  對象的解構賦值函數

  1. 先後模式必須匹配this

    後面的值是什麼格式,前面變量聲明的也是什麼格式,好比後面的值是二維數組,前面聲明的也是二維模式prototype

    案例:對象

      let [a,[b,c]]=[1,[2,3]]; // a   b   c   是變量作用域

      console.log(b);   //2字符串

  2. 前多後少原型

    前面聲明的變量多,後面賦值的少,解構不成功,就至關於只聲明瞭變量,但沒賦值,解構不成功,值都是 undefined回調函數

    案例:

      let [a,b]=[1];   // a    b   是變量

      console.log(b)  // undefined

  3. 前少後多

    1. 省略賦值  let[,,c]=[45,12,33]     //  c 是變量

    2. 不定參數的解構賦值,使用 ... 叫拓展運算符 ,注意事項 :拓展運算符必須寫後面

      拓展運算符:...as 將後面的值以數組的形式,賦值給 as ,拓展運算符必須寫在最後

    案例:

      1. let [,,c]=[45,26,13] // c 是變量

          console.log(c)  // 13

      2. let [...a]=[45,26,13];    // a 是變量

          console.log(a)  // 數組的形式 [45,26,13]

  4. 帶有默認值問題

    問題:先給默認值,在解構賦值,仍是先解構賦值,若是沒有在考慮默認值?

    案例分析

      let [x,y=(function(){console.log("haha");return 10;})()]=[45,23];

      console.log(y)  //23

      最終沒有輸出 haha ,說明不是先給默認值,二十先解構賦值,若是沒有,在考慮默認值

  因此:解構不成功的時候,纔會有默認值,沒有賦值,沒有定義

  判斷一個變量有沒有定義:

    var a=null;  a=[];  a={};  a=""   都是定義了

    var a=undefined   未定義

    因此只有解構的時候,後面是 undefined 的時候,纔會走默認值,不然後面給什麼值就是賦值什麼;

  解構不成功:undefined

  對象的解構賦值;

    1. 變量和屬性必須同名,才能夠解構賦值

    2. 若是解構失敗,值是 undefined

      let {name,a}={name:"zhang",age:20};  // name a 是變量

      console.log(name,a) // zhang   undefined

      其中 name a 是變量  對象的 name age 是屬性,name變量 找到了對象的屬性 name 因此,獲得值爲 zhang; 

      a 變量,找不到對象的屬性,因此得不到值,爲 undefined;  

      由於解構賦值,因此咱們有了這樣一個新的寫法

      let {ceil}=Math;  

      console.log(ceil(1.2))  // 2    解析這個代碼  let {ceil} = {ceil:function(){}}   //這裏面放的 math 對象的方法, ceil 的方法等於 ceil 的變量,因此 ceil 的變量 也擁有了相同的方法

    3. 特殊狀況,變量名和屬性名不一致怎麼辦?

      let {foo:b}={foo:"zhang"}  //  = 左邊: foo 是屬性 b 是變量  = 右邊:foo 是屬性

        前面 foo 是屬性,後面 b 變量,解構的機制,是對應的屬性值 賦值給後面的變量

    4. 對象解構的默認值問題

      默認值跟數組解構的默認值是同樣的,解構成功就直接賦值,不走默認值,解構不成功,就是沒有值,或者值是 undefined 走默認值;

      let {name,age=45}={name:zhang}  console.log(age) // 45 

      let {name,age=45}={name:"zhang",age:undefined}   console.log(age)   //45      

    5. 對象解構的賦值注意點

      {} 前面不能沒東西    {a}={a:12}  x  這種寫法是錯的

      解決:咱們必須聲明 一個變量才能夠:let {a}={a:12}

    6. = 右邊在什麼狀況下,才能夠解構

      = 右邊的值,只要帶有 length 屬性,才能夠解構,若是非要把不能解構的東西解構,轉成字符串便可

  函數參數解構

    函數傳對象,要在形參附一個空對象

  帶 = 

  function fn([a,b]=[12,23]){

    console.log(a+b)

  }  

  函數參數默認值

  function fn(b,v=12){

    console.log(b)

  }

  fn(12)  前面是形參,後面是默認值,帶默認值的參數儘可能要寫後面

 

  兩句法則:

    有沒有辦法解構

    解構成不成功

  函數參數等號左邊是形參,右邊是默認值,函數調用不傳參,走函數形參的默認值;函數調用傳參,默認值就不走了,走實參

 

  備註:

    函數做用域

    函數在調用會造成私有做用域,在這個做用域下,聲明的變量和參數變量都是私有的變量,外界訪問不到同時,他在操做相同的變量是,不會操做外部的

  

  形參的沒有變量提高,若是傳值直接賦值,因此形參有暫時性死區這一說

  暫時性死區,沒有賦值,直接操做變量

 

  函數一個類數組參數 arguments 是實參構成的集合,是一個類數組

  ... 拓展運算符,可將實參變成一個數組;

 

  5. 箭頭函數

    1. 箭頭函數 是適用於匿名函數

    用 function 聲明的函數,是有名函數

    作回調函數的時候,也是一個匿名函數

    var fn=function(){}    匿名函數    作了回調函數

  匿名函數的定義:只要不是關鍵字 function 聲明的函數叫匿名函數

  var fn=(形參) => { 函數體 }

  每一個函數結束的時候必定要 return

  let fn=x=>x   這種語法 : 第一個 x  表明 形參  第二個 x 表明 return 的語句

  當只有一個參數,能夠省略小括號;

  當函數體只有一行代碼且 return xxx 的時候,能夠省略 {} 和 return

  箭頭函數的優點:

    1. 箭頭函數沒有 this 指向

      改變 this 指向的方法

        1. 在函數前 提早對 this 賦值

        2. 在函數結尾處 {}.bind(this)

        3. 在函數結尾處 {}.apply(this) 或 {}.call(this)

        4. 使用箭頭函數

    2. 箭頭函數獲取實參,不能使用arguments 用 ...arg

    3. 箭頭函數不能充當類,由於 this 指向 window,而 類 的 this 指向當前實例對象

     箭頭函數的 this 指向 window

    函數角色

      函數能夠扮演 類,普通函數,function 實例對象

      類:每一個類身上有一個 prototype 的屬性,這個屬性是一個對象,裏面有個 constructor 的屬性,屬性值是類自己

      new 實例的時候,其實就是調用這個 constructor 的函數

      對象,每一個對象天生有個 __proto__ 的屬性

    __proto__ 也是一個對象,裏面有個構造函數指向他的類這個對象,也有一個 constructor 這個屬性值是他的類

  對象的屬性

    首先看對象中私有的屬性中,有沒有這個屬性,有就直接使用,沒有就使用 __proto__  向他的父類的原型上查找;

  注意:

    1. object 是因此對象的基類,包括 window event 等

    2. 普通函數的父類是 Function 

    3. 經過 function 定義的類 是 Function 

    4. 因此實例對象的 __proto__ 都指向父類的原型;

  實例對象的原型 __proto__ 若是私有沒有就找父類原型的 若是父類沒有直接查找 Object 的原型 不找 Function

  anonymous  匿名的

相關文章
相關標籤/搜索