ES5 和 ES6:let const var 區別
var
- 全域性宣告,全域性作用域有效;
- 可重複宣告同一個變數(後面宣告的值會覆蓋前面的宣告)
let
- 塊級作用域內有效;
- let宣告的變數可以改變,值和型別都可以改變,沒有限制。
var 和 let 用法 區別
1.let
命令所在的程式碼塊內有效ES5只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。第一種場景就是你現在看到的內層變數覆蓋外層變數。而
let
則實際上為JavaScript
新增了塊級作用域。用它所宣告的變數,只在let
命令所在的程式碼塊內有效。var name = 'zling' //用var全域性宣告name 值為 ‘zling’ function() { var name = 'obama' //再次用 var 宣告 name 值為 'cbiao' console.log(name) //name 返回 'zling'。覆蓋了第一次宣告的值 break } console.log(name) //全域性變數的name 值也為 'cbiao'
另外一個
var
帶來的不合理場景就是用來計數的迴圈變數洩露為全域性變數var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
上面程式碼中,變數i是var宣告的,在全域性範圍內都有效。所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i的值。而使用let則不會出現這個問題。
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
const
- 塊級作用域內有效;
const
宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
const a ;//報錯,一旦宣告變數,應該立即賦值!!
const b = 2;
b = 3//報錯,因為定義常量之後不能成重新賦值!!
對於複合型別的變數,如陣列和物件,變數名不指向資料,而是指向資料所在的地址。const
命令只是保證變數名指向的地址不變,並不保證該地址的資料不變,所以將一個物件宣告為常量必須非常小心。
const names = [];
names = [1,2,3] //出錯,因為變數names指向的地址不能發生改變,應始終指向[]所在的地址!!![1,2,3]與[]不是同一個地址
//不會報錯,因為names指向的地址不變,改變的只是內部資料
const names = [];
names[0] = 1
names[1] = 2
names[2] = 3
如果想讓定義的物件或陣列的內部資料也不能夠修改和改變,可以使用object.freeze(names)進行凍結,這樣為物件新增新屬性就不起作用。
除了將物件本身凍結,物件的屬性也應該凍結。下面是一個將物件徹底凍結的函式
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
相關文章
- ES6中let和var和const的區別
- es6 let const與var 的區別
- ES6中var,let,const的區別
- ES6中var/let/const的區別
- var、let和const的區別
- var和let/const的區別
- let const var 區別
- var let const區別
- let,const,var區別
- var、const、let 的區別
- 深入理解ES6之var,let,const區別
- 【ES6】var、let、const三者的區別
- JS中const、var 和let的區別JS
- JavaScript 高階—— ES6新增語法 const(let const var區別)JavaScript
- JavaScript中let、const、var 的區別JavaScript
- var、let和const三者有哪些區別?
- var與ES6中const、let宣告的變數的區別變數
- var、let、const宣告變數的區別變數
- JavaScript中的var、let 及 const 區別JavaScript
- JavaScript 中的 Var,Let 和 Const 有什麼區別JavaScript
- 變數和函式宣告提升,let和var const區別變數函式
- ES6 let和var的區別是什麼?
- var 和 let 的區別
- 【前端面試】(四)JavaScript var let const的區別前端面試JavaScript
- 1分鐘帶你瞭解var let 和 const 的區別
- ES6中的let與var的區別
- var,let和const深入解析(一)
- var、let、const變數宣告的區別及特點變數
- 淺談let和var的區別
- 教你理解let和var的區別
- var、let和const的知識點
- let與var的區別
- js中var和let的快速區別JS
- let與const區別
- ES6 let和const命令
- 關於es6 let var const 以及Symbol的總結Symbol
- TypeScript let與var的區別TypeScript
- ES6語法——let和const