ES6學習之let和const
阿新 • • 發佈:2017-10-26
size var err func ble ... con 常量 pan
1.let
基本用法:let聲明的變量,只在let
命令所在的代碼塊內有效
{ let a = 1; var b = 2; } console.log(a) //a is not defined console.log(b) //2
for(let i=0;i<5;i++){ //.... } console.log(i) //i is not defined
for循環內的var和let聲明
for(var i=0;i<5;i++){ //.... } console.log(i) //5
var聲明會產生一個全局變量i,循環結束後i=5
for(let i=0;i<5;i++){//.... } console.log(i) //i is not defined
let聲明的變量i,只在本輪循環中有效,相當於每次循環都會重新聲明新的變量i,且只在聲明的塊作用域內有效
不存在變量提升
console.log(a); //undefined var a = "hello"; console.log(b); //報錯:b is not defined let b = "Hello"
let聲明的變量不能在聲明之前使用
暫時性死區:只要塊級作用域內存在let
命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響。
var tem = "hello"; if(true){ tem = "Hello" //ReferenceError: tem is not defined let tem; }
在代碼塊內,使用let
命令聲明變量之前,該變量都是不可用的
不允許重復聲明
if (true) { var a = "hello"; let a = "Hello"; //SyntaxError: Identifier ‘a‘ has already been declared let b = "sayhi"; let b = "sayHi"; //SyntaxError: Identifier ‘b‘ has already been declared}
塊級作用域
function test(){ let n = 5; if(true){ let n = 10; } console.log(n) //5 } test()
let聲明的變量只在當前塊作用域內有效,故輸出5而非10
2.const
const
的作用域與let
命令相同:只在聲明所在的塊級作用域內有效。
const PI = 3.1415; console.log(PI); //3.1415 PI = 3; //TypeError: Assignment to constant variable.
const PI; //SyntaxError: Missing initializer in const declaration PI = 3;
const
實際上保證的,並不是變量的值不得改動,而是變量指向的那個內存地址不得改動
對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同於常量。但對於復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const
只能保證這個指針是固定的,至於它指向的數據結構是不是可變的,就完全不能控制了。
const PI = 3.1415; PI = 3; //TypeError: Assignment to constant variable. const arr = []; arr.push("hello"); console.log(arr) //[ ‘hello‘ ] const obj = {}; obj.sayhi = "Hi!" console.log(obj) //{ sayhi: ‘Hi!‘ }
ES6學習之let和const