本文來自 @羯瑞 整理,關注公眾號:前端讀者(fe_duzhe),每日推文...
ES6,並不是一個新鮮的東西,ES7、ES8已經趕腳了。但是,東西不在於新,而在於總結。
變數的新定義 let 和 const
在ES6沒有被普及時,我們會用的變數定義的方法是var。其實,var對於一個剛剛接觸js的人說,或許並不覺得怪異。但是,對於一個開發者而言,或許會在內心抨擊它。因為它就是javascript的敗筆之一,在其他語言看來的一個怪胎。那我們就來看看怪在何處呢?
- var 可以重複定義,let 在同一個塊級作用域中,不允許重複定義
var a = 10;
var a = 11;
複製程式碼
或許,你會看到這樣子的寫法覺得沒啥,那麼你很厲(wei)害(xian)。其實,這樣子的壞處不言而喻。在大型的工程化開發中,你定義一個a,我定義一個a,還有千千萬萬個你和我,這時,技術總監就該著急了。
同樣的例子換成 let ,你會發現瀏覽器報錯了
- var 可隨意修改,const 定義的變數不允許二次修改
var PI = 3.1415926
PI = 4.1415926
複製程式碼
從例子中,我們可以看到,PI是一個我們經常會使用的常量,是公認的不可變動的。但在javascript中並不是如此。那天,如果你的PI被你們公司新晉的實習生改了,可能你找錯誤都得找半天,但這可不是實習生的鍋,也許,他並不知道這裡是個常量。
同樣的例子換成 const ,你會發現瀏覽器報錯了
- var 沒有塊級作用域,let 和 const 定義的變數會形成塊級作用域
if(true){
var i = 10;
}
console.log(i); //10
複製程式碼
相信,這變數不存在塊級作用域給我們帶來過不少麻煩吧。不知道啥時候,又得在迴圈中套一層閉包呢。
同樣的例子換成 let 、const ,你會發現瀏覽器報錯了
- 變數不存在變數提升
//簡單的面試題
var a = 10;
function hello(){
console.log(a);
var a = 11;
console.log(a);
}
hello();
複製程式碼
第一個console時,下面定義的變數a被提升了,所以a變成了undefined,第二個的話,就比較好理解...
使用let和const就會不一樣,它們並不存在變數提升
ES5 & ES6 一些簡單的程式碼區別
常量
//ES5
Object.defineProperty(window,'chenrf',{
configurable:'true',//型別可變
writable:'false',//值是否可變
value:'羯瑞',
})
console.log(window.chenrf);
//ES6
const chenrf="羯瑞";
複製程式碼
作用域
//ES5
var cb2=[];
for(var a=0;a<3;a++){
cb2[a]=function(){
return a;
}
}
console.log([cb2[0](),cb2[1](),cb2[2]()]); //[1,2,3]
//ES6
let cb=[];
for(let a=0;a<3;a++){
cb[a]=function(){
return a;
}
}
console.log([cb[0](),cb[1](),cb[2]()]); //[3,3,3]
複製程式碼
箭頭函式
//es5
var es5 = function(){
var a='chenrf-es5';
return a;
}
//es6
let es6=()=>{
let a='chenrf-es6';
return a;
}
console.log(es5()); //cherrf-es5
console.log(es6()); //chenrf-es6
複製程式碼
預設引數
let es6=(a='chenrf-es6')=>{
return a;
}
console.log(es6()); //chenrf-es6
console.log(es6('chenrf')); //chenrf
複製程式碼
this指向
var obj = {
i: 10,
//如果是直接return,可以不需要{}
b: () => this,
c: function() {
return this;
}
}
console.log(obj.b()); //{}
console.log(obj.c()); //{ i: 10, b: [Function: b], c: [Function: c] }
複製程式碼
...剩餘引數
// => abc 等價於 return abc;es6語法
let addFun=(...abc)=> abc;
console.log(addFun(1,2,3)); //[1,2,3]
console.log(addFun(1,2,3,4,5,7)); //[1,2,3,4,5,7]
複製程式碼
總結
ES6還有很多新特性,如果你還想深入ES6進行了解的話,最直接的方式就是看書。希望你的程式碼寫的越來越優雅。