ES6 新增加了兩個重要的 JavaScript 關鍵字 :let 和 const 先說一下 const :它用於聲明一個只讀的常量,一旦聲明,常量的值就不能改變。 由於const聲明的是一個只讀變數,不可被改變,所以聲明變數是就必須賦值,否自也會報錯。 要註意的是用const聲明的常量如果是一個 ...
ES6 新增加了兩個重要的 JavaScript 關鍵字 :let 和 const
先說一下 const :它用於聲明一個只讀的常量,一旦聲明,常量的值就不能改變。
const servicePath = "www.baidu.com"; servicePath = "www.sina.com"; console.log(servicePath); //Uncaught TypeError: Assignment to constant variable.
由於const聲明的是一個只讀變數,不可被改變,所以聲明變數是就必須賦值,否自也會報錯。
const servicePath;
console.log(servicePath);
//Uncaught SyntaxError: Missing initializer in const declaration
要註意的是用const聲明的常量如果是一個 Object ,雖然Object.item不會被改變,但是可以用 Object.push(something)添加數組內容,如果不希望數組被改變,可使用 Object.freeze()將其凍結。
1 const arr1 =['apple','banana']; 2 arr1.push('orange'); 3 console.log(arr1); 4 //["apple", "banana", "orange"] 5 const arr2 = Object.freeze(['apple','banana']); 6 arr2.push('orange'); 7 console.log(arr2); 8 //Uncaught TypeError: Cannot add property 2, object is not extensible
let 用法與之前的 var 大致上相同,要註意的幾點是:
1. 同一個作用域里, 不能重覆定義變數(可以重新賦值) 。
{ }括起來的的區域是一個塊級作用域,不同的塊級作用域 let 兩個相同名字的變數,實際上是兩個完全獨立沒有聯繫的變數。
1 function a(){
2 let a = "abc";
3 let b = "abc";
4 let c = 10;
5 console.log(a);// abc
6 function b(){
7 let a = 22;
8 console.log(a);//22
9 }
10 function c(){
11 let a = function(){return 1;}
12 console.log(a);//1
13 }
14 let b = 22;
15 console.log(b);//Identifier 'b' has already been declared
16 c = 15;
17 console.log(c);//15
18 }
2. 沒有預解析,不存在變數提升。
1 function fn(){ 2 alert(a); //TDZ開始 暫時性死區 3 let a = 5; //TDZ 結束 4 } 5 fn(); 6 //a is not defined
3. for迴圈,for迴圈裡面是父級作用域,{ }裡面又一個作用域
1 var arr1 =[]; 2 for(var i=0; i<10; i++){ 3 arr1[i]=function(){ 4 console.log(i); 5 } 6 } 7 arr1[5](); //10 8 9 var arr2 =[]; 10 for(let i=0; i<10; i++){ 11 arr2[i]=function(){ 12 console.log(i); 13 } 14 } 15 arr2[5]();//5
在熟悉 let 和 const 的用法之後 ,建議逐步放棄var的用法,改為使用 let 或者 const。
PS:在頂層作用域下 var 定義變數是屬於window的,而 let 和 const 不屬於。