ES6聲明變量就是防止變量在未聲明時(shí)使用,如果在變量未聲明之前使用就會(huì)報(bào)錯(cuò)
let作用:與var類似,用于聲明一個(gè)變量
特點(diǎn):在塊作用域內(nèi)有效、不能重復(fù)聲明、不會(huì)預(yù)處理,不存在變量提升
應(yīng)用:循環(huán)遍歷加監(jiān)聽
const作用:定義一個(gè)常量
特點(diǎn):不能修改、其它特點(diǎn)同let
應(yīng)用:保存不用改變的數(shù)據(jù)
解構(gòu)就是先解析你的結(jié)構(gòu)然后再進(jìn)行賦值,從對(duì)象或數(shù)組中提取數(shù)據(jù),并賦值給變量(多個(gè)),你要的東西都得是對(duì)象或者數(shù)組里面有的屬性名,屬性名可以不用全部都要。
對(duì)象的解構(gòu)賦值:
let {n,a}={n:'gmx',a:18}
那么n拿到的就是gmx,a拿到的就是18,如果你這樣拿:let{n,x}={n:'gmx',a:18},就會(huì)拿到一個(gè)undefined,因?yàn)閷?duì)象里面沒(méi)有x這個(gè)屬性名,你要的東西我沒(méi)有,我就undefined,你可以少拿也可以全拿,但是你不能拿我沒(méi)有的東西,就這樣很簡(jiǎn)單。
數(shù)組的解構(gòu)賦值:
let[a,b]=[1,'gmx']
a拿到的是1,b拿到的是gmx,數(shù)組解構(gòu)賦值其實(shí)就是根據(jù)你所占的位置去拿對(duì)應(yīng)的值,a在數(shù)組里面對(duì)應(yīng)的下標(biāo)為0,那么1的也是0,所以a拿到的就是1。
數(shù)組還可以這樣:
let? arr=[1,2,4,5,'abc','bdg'];? //我就想拿字符串怎么辦?
let [,,,,a,b]=arr;? ? ?//這樣就可以了,多加4個(gè)逗號(hào)就是多占4個(gè)位置,相當(dāng)于前4個(gè)我不要,我就要后2個(gè)。
應(yīng)用:
funtion foo(obj){
? ? ? ?console.log(obj.name,obj.age);? ??
}?
上面函數(shù)可以寫成下面這種形式:
function foo({name,age}){? //{name,age}=obj
? ? ?console.log(name,age);
}
相當(dāng)于在接收參數(shù)這個(gè)過(guò)程中就已經(jīng)進(jìn)行過(guò)一次解構(gòu)賦值了,可以直接使用。
模板字符串的作用:簡(jiǎn)化字符串的拼接
模板字符串必須用``包含
變化的部分使用${xxx}定義
例:
let obj={username:'gmx',age:18};
let str='我的名字叫:'+obj.username+',我今年的年齡是:'+obj.age;? ? //以前字符串拼接
str=`我的名字叫:${obj.username},我今年的年齡是:${obj.age}`;? ?//現(xiàn)在模板字符串
//兩種輸出是一樣的,但是第二種模板字符串比第一種編寫起來(lái)效率要高,不容易出錯(cuò)
簡(jiǎn)化的對(duì)象寫法:省略同名的屬性值、省略方法的function
以前的寫法:
let username='gmx';
let age=18;
let obj={
? ? ?username:username,
? ? ?age:age,
? ? ?getName:function(){
? ? ? ? ? return this.username;
? ?}
}
現(xiàn)在簡(jiǎn)化后:
let username='gmx';
let age=18;
let obj={
? ? username,? ?//同名屬性可以省略不寫
? ? age,
? ? ?getName(){? ? //可把:function省略不寫
? ? ? ? ? return this.username;
}
}
以上兩種方法輸出的obj和obj.getName()是一樣的,只是同名屬性才可省略不寫。
作用:定義匿名函數(shù)
箭頭函數(shù)的特點(diǎn):
簡(jiǎn)潔
箭頭函數(shù)沒(méi)有自己的this,箭頭函數(shù)的this不是調(diào)用的時(shí)候決定的,而是在定義的時(shí)候處在的對(duì)象就是它的this
擴(kuò)展理解:箭頭函數(shù)的this看外層的是否有函數(shù),如果有,外層函數(shù)的this就是內(nèi)部箭頭函數(shù)的this,如果沒(méi)有,則this是window。
基本語(yǔ)法:
沒(méi)有參數(shù):() => console.log('xxx')
let fun=function(){console.log("我是箭頭函數(shù)")}
可寫成:let fun=() =>console.log("我是箭頭函數(shù)");
一個(gè)參數(shù):i => i+1
let? fun=function(a){console.log(a)}
可寫成:let? fun= a =>console.log(a);? //只有一個(gè)形參的時(shí)候,()可要省略
大于一個(gè)參數(shù):(i,j) => i+j
let? fun=function(x,y){console.log(x,y)}
可寫成:let? fun=(x,y)=>console.log(x,y); //當(dāng)兩個(gè)以及兩個(gè)以上的形參的時(shí)候 ()不能省略
函數(shù)體不用大括號(hào):默認(rèn)返回結(jié)果
函數(shù)體只有一條語(yǔ)句或者表達(dá)式的時(shí)候,{}可以省略----》省略會(huì)自動(dòng)返回語(yǔ)句執(zhí)行的結(jié)果或者是表達(dá)式的結(jié)果
let fun=(x,y)=>x+y;
console.log(fun(20,30)); //結(jié)果為50
注意:如果以上x+y表達(dá)式加上{}后,會(huì)輸出undefined,如果非得有值要返出去,就得{return x+y}這樣子了。
函數(shù)體如果有多個(gè)語(yǔ)句,需要用{}包圍,{}不可以省略,若有需要返回的內(nèi)容,需要手動(dòng)返回
let? fun=(x,y) => {
? ? ? console.log(x,y);
? ? ? return x+y;? ?//需要返回的內(nèi)容必須手動(dòng)返回
}
使用場(chǎng)景:多用來(lái)定義回調(diào)函數(shù)
let btn1=document.getElementById("btn1");
let btn2=document.getElementById("btn2");
btn1.onclick=function(){
? ? alert(this);? //輸出按鈕對(duì)象
}
btn2.onclick=()=>{
alert(this);?//輸出window對(duì)象,它外層沒(méi)函數(shù)所以this就是window,如果外層有函數(shù),那么this就和外層函數(shù)的this一樣
}
坑:
let obj={
? name:'箭頭函數(shù)',
? getName:() => {
? ? ?btn2.onclick= () => {
? ? ? ? console.log(this);? //this是window對(duì)象,因?yàn)閮?nèi)層箭頭函數(shù)會(huì)看自己外層有沒(méi)有函數(shù),一看,外層居然也是一個(gè)箭頭函數(shù),靠 不住了,然后外層箭頭函數(shù)說(shuō),兄弟別走,我?guī)闳フ液瘮?shù),結(jié)果都沒(méi)找著函數(shù),所以都指向window了。
? ? ? ? ? ? ? ? ? }
? ? ? ? }
}
rest(可變)參數(shù)
用來(lái)取代arguments,但比arguments靈活,只能是最后部分形參參數(shù)
使用arguments:
function foo(a,b) {
? console.log(arguments);
}
foo(3,4);
arguments.callee()指函數(shù)本身。
如果使用數(shù)組方法forEach去遍歷偽數(shù)組arguments:
function foo(a,b) {
? // console.log(arguments);
? arguments.forEach(function (item, index) {
? ? console.log(item,index);
? })
}
foo(3,4);
這樣就會(huì)報(bào)錯(cuò),因?yàn)閍rguments是偽數(shù)組,不具備數(shù)組的一般方法。
這時(shí)候,ES6就提出了一個(gè)點(diǎn)點(diǎn)點(diǎn)運(yùn)算符,看下面:
function foo(...value) {? //三個(gè)點(diǎn)是它的特征
? console.log(arguments);? //偽數(shù)組
? console.log(value);? //真數(shù)組,輸出時(shí)就不用寫...
}
foo(3,4);
結(jié)果如下:
所謂真數(shù)組,也就能使用數(shù)組的所有方法了,那么forEach就不會(huì)報(bào)錯(cuò)了。
再比如:
function foo(a,...value) {? //此時(shí)a作為一個(gè)占位符,將帶走一個(gè)實(shí)參,value就表示剩余部分的數(shù)組元素
? console.log(a);? //3
? console.log(value);? //[4,5,6,7]
}
foo(3,4,5,6,7);
如果這樣就會(huì)報(bào)錯(cuò):
function foo(a,...value,b) { //...value只能放在當(dāng)前最后位置,所以這樣寫是會(huì)報(bào)錯(cuò)的
? console.log(a);
? console.log(value);
? console.log(b);
}
foo(3,4,5,6,7);
實(shí)例:
let arr=[1,3,5];
let arr1=[2,...arr,6]; //...arr代表[1,3,5],此時(shí)arr1為[2,1,3,5,6]
arr1.push(...arr);? ? //此時(shí)arr1為[2,1,3,5,6,1,3,5]
console.log(arr1)? //[2,1,3,5,6,1,3,5]
先來(lái)一個(gè)實(shí)例:
// 定義一個(gè)點(diǎn)的坐標(biāo)
function point(x,y) {
? this.x=x;
? this.y=y;
}
let point1=new point(4,5);
console.log(point1);? //point {x: 4, y: 5}
如果在new的時(shí)候忘記傳參了:
let point2=new point();
console.log(point2);? //point {x: undefined, y: undefined}
此時(shí),就會(huì)出現(xiàn)Undefined,那么就想如果傳參就指定我傳的參數(shù)值,如果我不傳參,就指定默認(rèn)值。
// 定義一個(gè)點(diǎn)的坐標(biāo)
function point(x=0,y=0) {
? this.x=x;
? this.y=y;
}
let point1=new point(4,5);
console.log(point1);? //point {x: 4, y: 5}
let point2=new point();
console.log(point2);? //point {x: 0, y: 0}
這就是形參默認(rèn)值,你指定值,那么就是你的值,你不指定值,那么就用我默認(rèn)的。