ES6學習-----let、const

哇!我終於畢業論文答辯完了,坐等畢業了,今後社會人,好興奮!哈哈哈!安全

以前的時間都在忙工做和畢業論文,畢業設計的事情,沒怎麼寫文章,五一補補!bash

1、塊級做用域是什麼?爲何要有塊級做用域,解決了什麼問題?

其實塊級做用域很好理解,沒那麼高大上!你們都知道代碼塊,好比if(){}while(){}等,{}大括號裏邊即爲塊級做用域。ui

在ES6以前是沒有塊級變量的,所以就會出現以下的狀況:spa

  • 循環變量的逃逸

什麼意思呢?就是說一個for循環的變量i,在for循環結束以後依舊存在而不被銷燬,詳細看下面的代碼:設計

for(var i = 0; i < 10; i++) {
    
}
console.log(i); //10
複製代碼

上面的代碼for循環結束以後依舊輸出i的值爲10,而不是undefined,咱們就說該變量逃逸出了for代碼塊,從而使變量i變成了全局變量,使用不慎會致使相關的安全問題。指針

其實在Java中也有指針逃逸的問題,指的是執行一個方法結束以後,相應的局部變量隨着該方法傳遞到其餘方法中去了,通常是在return中將變量返回了,更多知識,請自行谷哥。code

2、let命令

let命令用於聲明一個塊級做用域變量,和傳統的var變量不一樣,let變量只在聲明的代碼塊中有效,出了代碼塊就找不到該變量了,以下面的代碼:對象

{
    let str = "hello world!"
    console.log(str);
}
console.log(str);//ReferenceError: str is not defined
複製代碼

使用let的注意點:遞歸

  • 一、變量必須先聲明後使用;
  • 二、不容許重複聲明相同變量

針對第一點,看以下代碼:ci

console.log(a);
let a = 9;
複製代碼

上面的代碼會拋出一個ReferenceError,注意是error而不是undefined。 第二點:看以下代碼:

{
    let message = "";
    let message = "message";
}
複製代碼

上面的代碼會報SyntaxError,表示變量message已經定義了。

3、const命令

const命令用於建立一個常量,常量嘛!一旦建立就不能修改,任何想改變常量的值都會報錯。但這也不是絕對的,下面會講到爲何能夠對一個常量進行修改。

因爲常量的值聲明以後不能修改,因此咱們在聲明常量的同時必須對其初始化。

首先JavaScirpt中有兩種類型的常量,分別是:

  • 一、基本類型常量
  • 二、引用類型常量

對於基本類型的常量,一旦聲明,就不能夠改變,如修改下面的常量,將報錯:

const i = 8;
i = 18; // VM745:2 Uncaught TypeError: Assignment to constant variable.
複製代碼

對於引用類型的常量,常量所指向的地址是不能改變的,但能夠改變引用的成員屬性,如:

const obj = {};
obj = {a:1} // error
// obj.name = "Mike" //OK
複製代碼

若是想要讓引用類型的常量屬性總體都不能增長、刪除屬性,可使用Object.freeze方法。可是還有這樣一種狀況,當常量對象的某個鍵的值又是一個引用類型時,依舊仍是能夠對其進行修改的。要想完全肯定一個引用常量不能被修改,還需對其全部鍵值執行Object.freeze方法。

var constant = (obj) => { 
    Object.freeze(obj);
    Object.keys(obj).forEach( (key,value) => { 
        if ( typeof obj[key] === 'object' ) {
            constant(obj[key]); // 遞歸
        }
    });
};
複製代碼

使用const的注意點和使用let同樣:

  • 一、變量必須先聲明後使用;
  • 二、不容許重複聲明相同變量

謝謝閱讀!歡迎評論區留言討論、交流!

相關文章
相關標籤/搜索