寫該系列文章的初衷是「讓每位前端工程師掌握高頻知識點,爲工做助力」。這是前端百題斬的第2斬,但願朋友們關注公衆號「執鳶者」,用知識武裝本身的頭腦。javascript
隨着js的發展,目前共6種聲明變量的方式,分別爲var、let、const、function、class、import,下面分別闡述一下這六種方式。前端
在ES5階段,用var定義變量,此階段具備如下特色:
// 代碼沒報錯,而是打印出來了undefined,側面說明了val變量存在變量提高 console.log(val); // undefined var val = 1; console.log(val); // 1
在ES6階段,出現了塊的概念,新增了塊級做用域,同時新增了let命令,let聲明的變量具備如下特色:
// 實驗一——只在所在的代碼塊有效 // 1 { let val = 2; console.log(val); // 2 } // 2 { let val = 2; } console.log(val); // ReferenceError: val is not defined
// 實驗2——不存在變量提高 + 暫時性死區 { console.log(val); // 報錯 let val = 2; }
// 實驗三——不容許重複聲明 { let val = 1; let val = 2; // SyntaxError: Identifier 'val' has already been declared }
在let命令出現的同時,出現了const命令,其用於聲明一個只讀的常量,具備如下特色:
對於上述的驗證代碼能夠用參考let的。
對於const,還有一點比較有意思的指的詳細闡述一下:const實際上保證的並非變量的值不能改動,而是變量指向的那個內存地址不能改動。對於簡單類型的數據而言,值就保存在變量指向的內存地址中,所以等同於常量。但對於複合類型的數據而言,變量指向的內存地址保存的只是一個指針,const只能保證這個指針是固定的,至於指向的數據結構不受控制。那麼如何保證複合類型的值如何保證呢?可使用Object.freeze()方法,該方法使對象的原始屬性不可變,但仍然能夠更改嵌套對象。爲了使對象徹底不可變,經過將嵌套對象上的全部屬性凍結達到效果。
const constantize = obj => { Object.freeze(obj); Object.keys(obj).forEach( key => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } }); };
function命令用於定義一個函數,具備如下特色:
function test() { // …… }
ES6語法引入了class關鍵字,用來定義類,該寫法相比於對象原型的方式具備如下特色:
class Calculate { constructor(x, y) { this.x = x; this.y = y; } add() { return this.x + this.y; } }
ES6在語言標準的層面上實現了模塊功能,其中import命令就是用於加載模塊,而後輸出變量,其具備如下特色:
// 隨便舉個例子 import {add} from './calcluate';
下面四種狀況分別輸出什麼?爲何呢?歡迎各位老鐵留言
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); }
for (var i = 0; i < 3; i++) { var i = 'abc'; console.log(i); }
for (let i = 0; i < 3; i++) { var i = 'abc'; console.log(i); }
for (var i = 0; i < 3; i++) { let i = 'abc'; console.log(i); }
1.若是以爲這篇文章還不錯,來個分享、點贊吧,讓更多的人也看到java
2.關注公衆號執鳶者,與號主一塊兒斬殺前端百題。編程