變量的解構賦值(模式匹配)數組
... 拓展運算符 能夠將數據類型變爲數組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 匿名的