ES6語法:var、let、const的區別詳解

今天來講說es6的語法,最基礎的也就是var,let,const 的用法與區別了,咱們來看看他們之間的恩怨情仇。
首先來講說var,這個只要是學過js的都知道,它是用來聲明一個變量的,可是它在開發中也會遇到一些問題,比較難解決。先來看看下面的代碼:javascript

 

var str="hello world";
​
function testVar(){
  var str="hello";
}
testVar();
console.log(str);

這段代碼的結果是 "hello world",這說明在var 申明的變量,即便是一樣的名字,在不一樣的塊中,在外層塊中的變量優先級更高,也就是說,在外層優先使用而且只能使用當前塊中的變量;而在他的內部塊中的變量,好比說這個函數裏面的str,他其實也是優先使用塊內的str變量,會屏蔽掉外面的str變量,這是一點。再來看看下面一段代碼java

function variableHoisting(){
  if(condition){
    var test="hello javaScript";
  }else{
    console.log(test)
    //這裏能夠訪問到test,可是它是undefined,由於初始化爲它賦值成了undefined
  }
  //這裏也能夠訪問到test
}

可能你會感到奇怪,個人var 申明的變量在if 代碼塊裏面,爲何個人else裏面也能訪問呢,其實上面這段代碼至關於下面這段代碼es6

 

function variableHoisting(){
  var test;
  if(condition){
    test="hello javaScript";
  }else{
    console.log(test)
    //這裏能夠訪問到test,可是它是undefined,由於初始化爲它賦值成了undefined
  }
    //這裏也能夠訪問到test
}

如今知道了吧?這就是所謂的變量提高,我在if裏面申明的變量,其實瀏覽器在預解析的時候就對var ,以及function關鍵字的變量或者方法進行了處理,處理後的代碼就是上面這段代碼(固然,我以前講過一篇函數聲明與函數表達式的區別,你能夠看看,你會知道更多。)看到這裏,也許你不會感受var 有什麼很差的地方,再往下看看:瀏覽器

```javascript微信

var funcs = [];
for (var i = 0; i < 10; i++) {
  funcs.push(function() {
    console.log(i); 
  });
}
funcs.forEach(function(func) {
  func(); // 輸出數值 "10" 十次
});

可能你想的是輸出0,1,2,3,4,5,6,7,8,9可是這不是正確答案,這隻能輸出10個10,爲何呢?由於循環完成事後,i已是10了,再次調用的時候,這個i值在每次迭代過程當中共享了。
下面咱們就來引入一下let,以及const。let 也是用來申明變量的,可是他申明的變量是塊級做用域,什麼意思呢,看下面函數

function testLet(){
  if(condition){
    let str="hello let"
  }else{
    //這裏訪問不到str 
  }
    //這裏也訪問不到str
}

 



看了上面,你也許就知道了什麼是塊級做用域,也就是一個大括號嘛,括號裏面就是一塊。用let申明的變量是沒有以前所說的變量提高這一說的,因此在外部塊裏面是訪問不到let申明的變量的。這樣,以前說var缺陷的哪一塊代碼通過小小的改變就能正常輸出0..9了,你看看學習

var funcs = [];
for (let i = 0; i < 10; i++) {
    funcs.push(function () {
        console.log(i);
    });
}
funcs.forEach(function (func) {
    func(); // 輸出數值 0-9
});    

 

這就是let,與var的一個小區別,固然若是說你申明變量的時候不指名是用的var,仍是let,編譯的時候會將這個變量解析爲var申明的變量。spa

無論是var,仍是let,他們是不能重複申明的,好比像下面這樣code

var str="var";
let str="let";

這樣是會報錯的,編譯的時候,不能重複定義。對象

而後就是const了,這個其實就是常量的單詞的英文縮寫(constant),沒錯,這是用來申明一個常量的。什麼事常量呢,顧名思義,就是一旦賦值就不能再改變了。好比說:

 

const MAX=3.1415926;
MAX=3.14;

 

這樣是不行的,會報錯,常量不能改變的。來看看const的循環,在最基礎的for -i的循環裏面,他是會報錯的,運行一次事後就會報錯,可是在for-in 循環裏面他是不會報錯的,固然在for-of循環裏面也不會

 

var funcs = [],
object = {
  a: true,
  b: true,
  c: true
};
// 不會致使錯誤
for (const key in object) {
  funcs.push(function () {
  console.log(key);
  });
}
funcs.forEach(function (func) {
  func(); // 依次輸出 "a"、 "b"、 "c"
});

 

這樣是不會報錯的,來看看到底是爲何呢?

上面說了,const申明的變量是不能改變的,可是,咱們試試申明一個對象呢,而後改變對象裏面的屬性的值。

 

const object={
name:"學習筆記",
age:18
}
console.log(object.name)
​
object.name="hello world"
console.log(object.name)

 

這段代碼,第一個會打印出來「學習筆記」,第二個會打印出來「hello world」,爲何呢?緣由在這,其實,這段代碼改變的不是object這個對象變量,而是這個變量的屬性,知道了這個就不難理解爲何在for-in ,for-of循環裏面,const不會報錯了吧?若是對你有幫助的話,記得點個關注哦,若是你發現文中有錯誤,記得幫我指出來。

微信公衆號

相關文章
相關標籤/搜索