1. 程式人生 > >ES6學習之let和const

ES6學習之let和const

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聲明的變量不得改變值,const一旦聲明變量,就必須立即初始化,不能留到以後賦值。
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