1. 程式人生 > >es6--let和const

es6--let和const

標簽 cau ria ble ready 復合 iss 模式 ren

參考資料

http://es6.ruanyifeng.com/#docs/let

測試環境(本文的代碼均是在chrome下運行)

  在<script>標簽中添加‘use strict‘,即嚴格模式

let

  1. 聲明變量,可以更改,但不允許重復聲明;
     let a = 1;
     let a = 2; //Uncaught SyntaxError: Identifier ‘a‘ has already been declared
    
     let b = 1;
     b = 2;
     console.log(b);  //2
  2. 沒有聲明提升;
    console.log(a); //Uncaught ReferenceError: a is not defined
    let a  = 1;
  3. let聲明的變量只在它所在的代碼塊內有效 (塊級作用域:指一個函數或變量只在該區域起作用)
    {
            let a = 1;
            console.log(a); //1
    }
    console.log(a);// Uncaught ReferenceError: a is not defined
  4. 暫時性死區:指從塊的開始到聲明這段的區域,如果在變量聲明之前使用該變量,會報錯

const

  1. 聲明一個只讀變量(不允許重復聲明;值不允許修改;只聲明不賦值會報錯),但當聲明的值是一個對象的時候,對象的屬性是可以更改的。
    //一旦聲明,值不能更改
    const a = 1;
    console.log(a); //1
    a = 2;
    console.log(a); //Uncaught TypeError: Assignment to constant variable.
    
    //只聲明不賦值
    const b; //Uncaught SyntaxError: Missing initializer in const declaration
    
    //不能重復聲明
     const b = 1;
    const b = 2; //Uncaught SyntaxError: Identifier ‘b‘ has already been declared
    
    //值為對象時,對象的屬性/屬性值可以更改
    const b = {
           num : 1
    }
     b.num = 2;
     console.log(b.num);  //2
  2. 沒有變量提升

    console.log(a);  //Uncaught ReferenceError: a is not defined
    const a = 1;
  3. const聲明的變量只在它所在的代碼塊內有效
    {
            const a = 1;
            console.log(a);  //1
    }
    console.log(a); //Uncaught ReferenceError: a is not defined
  4. 與let一樣,存在暫時性死區

總結

  const和let命令都是es6在es5聲明變量方法(var function)基礎上添加的新方法:

  共同點:

  1. 變量一經聲明,不能重復聲明
  2. 所聲明的變量都只在他們所處代碼塊區域內有效
  3. 都沒有變量提升
  4. 都存在暫時性死區

  不同點:

  const聲明的變量是只讀變量,變量聲明之後值不允許更改,原因是const聲明的變量指向是一個內存地址,對於簡單數據類型(number,boolean,string),值就保存在變量指向的那個內存地址,因此等同於常量。但對於復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至於它指向的數據結構是不是可變的,就完全不能控制了。

    技術分享

  

es6--let和const