1. 程式人生 > >var與ES6中const、let宣告的變數的區別

var與ES6中const、let宣告的變數的區別

好久以前的研究,今天再來回顧一下。

首先我們比較一下使用var宣告的變數和不使用var宣告的變數的區別:

  1. 使用var宣告的變數宣告前呼叫,那麼該變數的值為undefined;不使用var宣告的變數宣告前呼叫直接報錯Uncaught ReferenceError:xxx is not difined;
  2. 使用var宣告的變數不可delete,不使用var宣告則可以delete掉釋放空間。(實則瀏覽器的垃圾回收機制也會清理掉用var宣告但是不再使用的的變數,比如某個僅執行一次的函式中被呼叫的某個var 宣告的變數)
  3. 未使用var宣告的變數實際上是window的一個物件,而使用var宣告的變數只是一個本地變數而已。
  4. 在使用'use strict'的模式之下,不使用var 宣告變數的語法是不被允許的,報錯:Uncaugth SyntaxError;
    console.log(a);   //undefined,這裡還涉及變數提升的概念
    console.log(b);   //報錯 Uncaught ReferenceError: b is not defined
    var a = 1;
    b = 2;
    console.log(a);   //1
    console.log(b);   //2
    console.log(window.a);   //undefined
    console.log(window.b);   //2
    delete a;
    delete b;
    console.log(a);   //1
    console.log(b);   //報錯 Uncaught ReferenceError: b is not defined,可見b在宣告前使用和聲明後delete再使用是一樣的結果
再來看下let,var,const宣告的變數的區別:
  1. 看意思就知道,const是常量的意思,就是說只能被定義一次,且不可再改變,否則就會報錯:Uncaught TypeError: Assignment to constant variable.另外宣告前使用也會報錯:Uncaught ReferenceError: a is not defined;看一個例子:
    const foo = {};
    foo.prop = 123;
    console.log(foo.prop);  //123
    foo.prop = 456;
    console.log(foo.prop);  //456
    const foo = {};   //Identifier 'foo' has already been declared
    這裡const定義一個foo之後,對其添加了屬性prop,隨後又對該屬性進行了修改,為什麼沒有報錯?那是因為常量foo本身儲存的是一個地址,該地址指向一個物件,不可變的是foo這個地址,即不能把foo指向另一個地址,但物件本身是可變的,所以依然可以為foo新增新屬性,改變新屬性值,而最後一行中嘗試改變foo的地址,就會報錯,如果要徹底將物件凍結,應該使用Object.freeze(obj)方法。同理,陣列也是一樣的
    const group = [];
    group.push('Bob');
    console.log(group[0]); //Bob
    group = ["Tom"];//Uncaught TypeError: Assignment to constant variable.
  2. var 和 let 就有意思了,let宣告的變數宣告前使用也會報錯,這個與const一致;最重要的一點是let聲明瞭一個塊級作用域的變數在一個塊的“}”結束的時候,該變數消失。例子:
    (function(x,y){
            var b = x;
            let c = y;
            if (true) {
                var b = 5;
                let c = 6;
                console.log(b);  //5
                console.log(c);  //6,這裡的let c在下一行的"}"之後消失
            }
            console.log(b);  //5
            console.log(c);  //3 ,這裡仍然是第三行的let c;
    }(2,3));
  3. 再看一個例子:
    var array1 = [],array2 = [];
    for(var  i=0;i<10;i++){ 
            array1[i] = function(){
                console.log(i);
            };
    }
    for(let  j=0;j<10;j++){  
            array2[j] = function(){
                console.log(j);
            };
    }
    array1[6]();  //10
    array2[6]();  //6
    所以說let是一個比較保守的變數。這裡變數為i的for迴圈中,i是一個全域性變數,array1[i]是一個console.log(i)的函式,而i的最終結果為10,故而每次呼叫array1[i],實際上都是console.log(10);而let作為僅在其程式碼塊有效的變數,當前的j僅在本輪的迴圈中有效,就是說每一次迴圈,j其實都是一個新產生的變數。所以let變數適合用於迴圈體中
  4. 再看一個例子:
    var tmp = 1;
    if(true){
        tmp = 2;   //ReferenceError
        let tmp;
    }
    這個例子中tmp=2的賦值會報錯,因為if中的let對tmp變數的宣告,導致該tmp綁定了這個作用域,而let不會像var那樣“變數提升”,所以未宣告賦值會報錯。ES6中明確規定:如果區塊中存在let和const命令,則這個區塊對這些命令宣告的變數從一開始就形成了封閉做作用域,只要在宣告之前做任何使用,都會報錯。這在語法上稱為“暫時性死區”(temporal dead zone ,簡稱TDZ)。
  5. 還有一點要注意,var宣告的變數為全域性變數,而let,const宣告的變數不為全域性變數,使用window訪問不到,如下:
    var a = 1;
    console.log(window.a); //1
    let b = 2;
    console.log(window.b) //undefined

相關推薦

varES6constlet宣告變數區別

好久以前的研究,今天再來回顧一下。 首先我們比較一下使用var宣告的變數和不使用var宣告的變數的區別: 使用var宣告的變數宣告前呼叫,那麼該變數的值為undefined;不使用var宣告的變數宣

ES5varES6let,const區別

1、ES5中使用var來宣告變數,會產生作用域提升的問題。例: var a=1; function scope(){ console.log(a); var a=2; } scope(); //得到的結果既不是1也不是2,是undefined

JSconstletvar之間的區別

js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 const b = 2;//正確 // const b;//錯誤,必須初始化

jsconstletvar區別

如果 資料 tool alt 文章 div 相關 整理 bar 今天第一次遇到const定義的變量,查閱了相關資料整理了這篇文章。主要內容是:js中三種定義變量的方式const, var, let的區別。 1.const定義的變量不可以修改,而且必須初始化。 1 cons

JSconstvarlet區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

淺析constletvar

常用 ren 這樣的 不同 ons 語句 uncaught for語句 語法   以前無論聲明變量還是常量,總是使用var一勺端,知道接觸了es6之後,發現原來變量、常量的聲明其實是很講究的。   這裏簡單來談談var、const與let。   1、var。var聲明的

JavaScriptconstvarlet區別淺析

在JavaScript中有三種宣告變數的方式:var、let、const。下文給大家介紹js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 ? 1 2 3 4 5 const

js const varlet區別

看了很多解釋,感覺還是這個說的最透徹。轉自  https://blog.csdn.net/hot_cool/article/details/78302673首先,ECMAScript和JavaScript關係:       ECMAScript是一個國際通過的標準化指令碼語言

Varconstlet區別

Var、const、let 1.      var申明的變數不強制初始化,如果不初始化變數打印出來為undefind,並且定義的變數為可修改的變數 2.      cons

全域性作用域,用constlet宣告變數去哪了?

用const和let宣告的變數,不會存在window物件中 大家都知道在全域性作用域中用var宣告的變數,儲存在window物件中 但是用ES6的const或者let在全域性作用域中宣告的變數,卻不在window物件中 那這個全域性變數abc

varconstlet區別

定義變數的三種方式 var、const、let 都可以用來定義變數,但三者之間存在區別。 var var 宣告變數的時候無需初始化。 var 宣告的變數可在後面進行修改。 var 宣告的全域性變數可以被函式修改。 <!DOCTYPE html> <html>

03 -2 numpypandasisnull()notnull()dropna()fillna()處理丟失資料的理解例項

引入三劍客 import numpy as np import pandas as pd from pandas import Series,DataFrame 處理丟失資料 1.有兩種丟失資料: None: Python自帶的資料型別 不能參與到任何計算中

【C++】CC++ const常量 - 修改時報錯

#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &

轉:C++constvolatilemutable的用法

const修飾普通變數和指標 const修飾變數,一般有兩種寫法: const TYPE value; TYPE const value; 這兩種寫法在本質上是一樣的。它的含義是:const修飾的型別為TYPE的變數value是不可變的。對於一個非指標的型別T

ES6JsonStringMapObject之間的轉換

'use strict'; import React, {Component} from 'react' /** *JsonUitl的實現 */ class JsonUtils extends React.Component { /** *字串轉json * */ static stringToJs

jQuery的attr()prop()設定屬性獲取屬性的區別

jQuery中的attr()與prop()設定屬性、獲取屬性的區別 一、checkbox的屬性設定選中或不選中 舉例,比如我們要獲取checkbox的屬性或者設定checkbox選中或不選

ES5ES6的陣列操作方法簡單介紹

許多同學在寫javascript程式碼的時候都習慣於使用順手和常用的方法,比如說在運算元組時習慣使用for,whlie迴圈,在列舉物件時,習慣使用for in,其實在ES5和ES6出來以後,有很多新的運算元組和物件的方法,這裡我們來重點看一下一些功能強大,但又往往被我們忽視的操作方法。 先來定義一個簡單的陣

JS的方法名HTMLidname重名問題

1. 在HTML的from表單中,<input>標籤內的id或name不能與JS方法重名 2. 當<input>標籤不在from表單中,id或name可以與JS方法重名 3. <image>標籤id或name不能與JS方法重名 4. &l

使用FFmpeg的SDK庫實現將H.264流封裝進MP4檔案時全域性SPSPPSSPSPPS衝突的問題

一、問題1. 使用FFmpeg的SDK庫實現將H.264流封裝進MP4檔案的原始碼大致如下:char* filename = "./test.mp4"AVOutputFormat *fmt;AVStream* video_st;AVFormatContext *av_cont

C++getlineCscanfgets小結

 getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream