ES6
ES5中有兩種變量聲明方法:var、function
ES6中六種變量聲明方法:
- var:
- function:
- let:
- const:
- import:
- class:
let與const命令
let命令
定義變量:
ES5:ver,function
ES6:let,const
-
基本語(yǔ)法:
let 變量名 = 值; -
特性:
1.let使用let聲明的變量只在代碼塊中有效{ let a = 4; var a = 5; } console.log(a);// console.log(b);//2.let沒有變量提升:先聲明,再使用
let a = 5; console.log(a)//正常輸出 console.log(b);//報(bào)錯(cuò) let b = 5;3.let不能重復(fù)定義:let不允許在相同的作用域內(nèi)重復(fù)聲明一個(gè)變量
let a = 5; let a = 5; console.log(a);//報(bào)錯(cuò)4.暫時(shí)性死區(qū)
5.let定義的變量不會(huì)作為window的屬性
塊級(jí)作用域
- 全局作用域
- 局部作用域
- 塊級(jí)作用域:
{ let a = 4; //console.log(a);// 4 } console.log(a);//報(bào)錯(cuò),塊級(jí)作用域
let與var的比較:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 輸出10
// 變量i是var命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個(gè)變量i
var c = [];
for (let n = 0; n < 10; n++) {
c[n] = function () {
console.log(n);
};
}
c[6](); // 6
// 變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,所以最后輸出的是6
// for循環(huán)還有一個(gè)特別之處,就是設(shè)置循環(huán)變量的那部分是一個(gè)父作用域,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的子作用域。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}//輸出三次abc
//abc
//abc
//abc
const命令
- 基本語(yǔ)法:
const 變量名 = 值;
-特性:
1.只能聲明一個(gè)只讀的變量:是一個(gè)常量,一旦聲明就不能修改,常量一般首字母大寫// const聲明一個(gè)只讀的常量。一旦聲明,常量的值就不能改變。 // const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。 // 對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò) const a;//報(bào)錯(cuò) const PI = 3.1415; PI // 3.1415 PI = 3; // 上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。- 對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)
3.const一旦聲明變量,就必須立即初始化,不能留到以后賦值。const a;//報(bào)錯(cuò)
4.其他與let一樣PI // 3.1415 PI = 3; // 上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。
注意:const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)const foo = {}; // 為 foo 添加一個(gè)屬性,可以成功 foo.prop = 123; foo.prop // 123 // 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò) foo = {}; // TypeError: "foo" is read-only // 上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址,這個(gè)地址指向一個(gè)對(duì)象。 // 不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性 const a = []; a.push('Hello'); // 可執(zhí)行 a.length = 0; // 可執(zhí)行 a = ['Dave']; // 報(bào)錯(cuò) // 上面代碼中,常量a是一個(gè)數(shù)組,這個(gè)數(shù)組本身是可寫的,但是如果將另一個(gè)數(shù)組賦值給a,就會(huì)報(bào)錯(cuò)。
注意:使用let、const、class聲明的全局變量,不屬于頂層對(duì)象的屬性
頂層對(duì)象:瀏覽器中是window對(duì)象,在node中是global對(duì)象
結(jié)構(gòu)賦值
- 這被稱為解構(gòu)(Destructuring)。
ES6 允許按照一定模式,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。
數(shù)組的結(jié)構(gòu)
// 以前,為變量賦值,只能直接指定值。
// let a = 1;
// let b = 2;
// let c = 3;
// ES6 允許寫成下面這樣。
let [a,b,c] = [1,2,3];
console.log(a,b,c);
- 本質(zhì)上,這種寫法屬于“模式匹配”,只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值。
如果解構(gòu)不成功變量的值就等于undefined
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
- 完全結(jié)構(gòu)
let [a,b,c] = [1,2,3];
console.log(a,b,c);
- 不完全結(jié)構(gòu)
let [a,b] = [1,2,3];
console.log(a,b,c);//c=undefined
對(duì)象的結(jié)構(gòu)
-
對(duì)象解構(gòu)的要求:變量名與對(duì)象的屬性名保持一致
var obj={ name:'dhx', age:21, addr:'井岡山' } let {a,b,c}=obj; console.log(a,b,c);//undefined //對(duì)象解構(gòu)的要求:變量名與對(duì)象的屬性名保持一致 let {name,age,addr}=obj;//順序不需要一致,對(duì)象屬性沒有次序的 console.log(name,age,addr);不完全解構(gòu)
let data={ id:12, imgSrc:'http://dfdsfsf.jps', title:'海賊王', URL:'http://dfdsfsf.html', time:'2019-9-20' }; let {imgSrc,title}=data; consile.log(imgSrc,title);
字符串解構(gòu)
-
模式:
let str = 'hello'; let [a,b,c,d,e]=str;//完全解構(gòu) console.log(a,b,c,d,e); //不完全解構(gòu) //h //e //l //l //o -
應(yīng)用:
let a = 10; let b = 5; //不定義第三個(gè)變量,交換a,b的值 //普通方法 a=a+b; b=a-b;//10 a=a-b; console.log(a,b); //使用解構(gòu) [b,a]=[a,b]; console.log(a,b); function show(){ //let arr=[100,200,300]; //return arr; //return [100,200,300]; return { name:'dhx', age:21, grade:'大四' }; } //let a=show(); //let [a,b,c]=show(); //console.log(a,b,c); let {name,age}=show(); console.log(name,age);
參數(shù)的解構(gòu)
箭頭函數(shù)
ES6 允許使用“箭頭”(=>)定義函數(shù)。
基本語(yǔ)法:
var f = v => v;
// 等同于
var f = function (v) {
return v;
};
- 無(wú)參數(shù)函數(shù)
var f = () => { console.log('dinghuixiang'); }; // 等同于 var f = function () { console.log('dinghuixiang'); }; f(); - 有一個(gè)參數(shù)函數(shù)
var f = v => { console.log('dinghuixiang'); }; // 等同于 var f = function (v) { console.log('dinghuixiang'); }; f(); - 有多個(gè)參數(shù)函數(shù)
var f = (a,b) => { console.log('dinghuixiang'); }; // 等同于 var f = function (a,b) { console.log('dinghuixiang'); }; f(); - 函數(shù)內(nèi)只有一個(gè)返回語(yǔ)句
var f = () => v; // 等同于 var f = function () { return v; }; f(); - 函數(shù)內(nèi)只有多個(gè)語(yǔ)句
var f = () =>{ console.log('dinghuixiang'); return v; } ; // 等同于 var f = function () { console.log('dinghuixiang'); return v; }; f(); - 函數(shù)內(nèi)只有一個(gè)語(yǔ)句,但不是返回語(yǔ)句,也可以(使用void關(guān)鍵字)
var f = () =>void console.log('dinghuixiang'); // 等同于 var f = function () { console.log('dinghuixiang'); }; f(); - 特殊情況:如果箭頭函數(shù)的代碼塊部分多于一條語(yǔ)句,就要使用大括號(hào)將它們括起來(lái),并且使用return語(yǔ)句返回。由于大括號(hào)被解釋為代碼塊,
所以如果箭頭函數(shù)直接返回一個(gè)對(duì)象,必須在對(duì)象外面加上括號(hào),否則會(huì)報(bào)錯(cuò)// 報(bào)錯(cuò) let getTempItem = id => { id: id, name: "Temp" }; // 不報(bào)錯(cuò) let getTempItem = id => ({ id: id, name: "Temp" });- 下面是一種特殊情況,雖然可以運(yùn)行,但會(huì)得到錯(cuò)誤的結(jié)果。
上面代碼中,原始意圖是返回一個(gè)對(duì)象let foo = () => { a: 1 }; foo() // undefined{ a: 1 },但是由于引擎認(rèn)為大括號(hào)是代碼塊,所以執(zhí)行了一行語(yǔ)句a: 1。這時(shí),a可以被解釋為語(yǔ)句的標(biāo)簽,因此實(shí)際執(zhí)行的語(yǔ)句是1;,然后函數(shù)就結(jié)束了,沒有返回值
箭頭函數(shù):省略function,總結(jié)
-
參數(shù)個(gè)數(shù):
- 一個(gè)參數(shù):可以省略()
- 多個(gè)參數(shù):不能省略()
-
函數(shù)體語(yǔ)句:
-
一條語(yǔ)句:
- return語(yǔ)句:省略大括號(hào){}與return
- 普通語(yǔ)句:可以只用void指令省略
多條語(yǔ)句:不能省略
-
注意事項(xiàng)
箭頭函數(shù)有幾個(gè)使用注意點(diǎn)。
(1)函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。
(2)不可以當(dāng)作構(gòu)造函數(shù),也就是說(shuō),不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤。
(3)不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替。
(4)不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)。
上面四點(diǎn)中,第一點(diǎn)尤其值得注意。this對(duì)象的指向是可變的,但是在箭頭函數(shù)中,它是固定的。