var與ES6中const、let宣告的變數的區別
好久以前的研究,今天再來回顧一下。
首先我們比較一下使用var宣告的變數和不使用var宣告的變數的區別:
- 使用var宣告的變數宣告前呼叫,那麼該變數的值為undefined;不使用var宣告的變數宣告前呼叫直接報錯Uncaught ReferenceError:xxx is not difined;
- 使用var宣告的變數不可delete,不使用var宣告則可以delete掉釋放空間。(實則瀏覽器的垃圾回收機制也會清理掉用var宣告但是不再使用的的變數,比如某個僅執行一次的函式中被呼叫的某個var 宣告的變數)
- 未使用var宣告的變數實際上是window的一個物件,而使用var宣告的變數只是一個本地變數而已。
- 在使用'use strict'的模式之下,不使用var 宣告變數的語法是不被允許的,報錯:Uncaugth SyntaxError;
再來看下let,var,const宣告的變數的區別: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再使用是一樣的結果
- 看意思就知道,const是常量的意思,就是說只能被定義一次,且不可再改變,否則就會報錯:Uncaught TypeError: Assignment to constant variable.另外宣告前使用也會報錯:Uncaught ReferenceError: a is not defined;看一個例子:
這裡const定義一個foo之後,對其添加了屬性prop,隨後又對該屬性進行了修改,為什麼沒有報錯?那是因為常量foo本身儲存的是一個地址,該地址指向一個物件,不可變的是foo這個地址,即不能把foo指向另一個地址,但物件本身是可變的,所以依然可以為foo新增新屬性,改變新屬性值,而最後一行中嘗試改變foo的地址,就會報錯,如果要徹底將物件凍結,應該使用Object.freeze(obj)方法。同理,陣列也是一樣的: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 group = []; group.push('Bob'); console.log(group[0]); //Bob group = ["Tom"];//Uncaught TypeError: Assignment to constant variable.
- 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));
- 再看一個例子:
所以說let是一個比較保守的變數。這裡變數為i的for迴圈中,i是一個全域性變數,array1[i]是一個console.log(i)的函式,而i的最終結果為10,故而每次呼叫array1[i],實際上都是console.log(10);而let作為僅在其程式碼塊有效的變數,當前的j僅在本輪的迴圈中有效,就是說每一次迴圈,j其實都是一個新產生的變數。所以let變數適合用於迴圈體中。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
- 再看一個例子:
這個例子中tmp=2的賦值會報錯,因為if中的let對tmp變數的宣告,導致該tmp綁定了這個作用域,而let不會像var那樣“變數提升”,所以未宣告賦值會報錯。ES6中明確規定:如果區塊中存在let和const命令,則這個區塊對這些命令宣告的變數從一開始就形成了封閉做作用域,只要在宣告之前做任何使用,都會報錯。這在語法上稱為“暫時性死區”(temporal dead zone ,簡稱TDZ)。var tmp = 1; if(true){ tmp = 2; //ReferenceError let tmp; }
- 還有一點要注意,var宣告的變數為全域性變數,而let,const宣告的變數不為全域性變數,使用window訪問不到,如下:
var a = 1; console.log(window.a); //1 let b = 2; console.log(window.b) //undefined
相關推薦
var與ES6中const、let宣告的變數的區別
好久以前的研究,今天再來回顧一下。 首先我們比較一下使用var宣告的變數和不使用var宣告的變數的區別: 使用var宣告的變數宣告前呼叫,那麼該變數的值為undefined;不使用var宣告的變數宣
ES5中的var與ES6中的let,const的區別
1、ES5中使用var來宣告變數,會產生作用域提升的問題。例: var a=1; function scope(){ console.log(a); var a=2; } scope(); //得到的結果既不是1也不是2,是undefined
JS中const、let、var之間的區別
js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 const b = 2;//正確 // const b;//錯誤,必須初始化
js中const、let、var的區別
如果 資料 tool alt 文章 div 相關 整理 bar 今天第一次遇到const定義的變量,查閱了相關資料整理了這篇文章。主要內容是:js中三種定義變量的方式const, var, let的區別。 1.const定義的變量不可以修改,而且必須初始化。 1 cons
JS中const、var和let區別
方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b
淺析const、let與var
常用 ren 這樣的 不同 ons 語句 uncaught for語句 語法 以前無論聲明變量還是常量,總是使用var一勺端,知道接觸了es6之後,發現原來變量、常量的聲明其實是很講究的。 這裏簡單來談談var、const與let。 1、var。var聲明的
JavaScript中const、var和let區別淺析
在JavaScript中有三種宣告變數的方式:var、let、const。下文給大家介紹js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 ? 1 2 3 4 5 const
js中 const 、var、let 的區別
看了很多解釋,感覺還是這個說的最透徹。轉自 https://blog.csdn.net/hot_cool/article/details/78302673首先,ECMAScript和JavaScript關係: ECMAScript是一個國際通過的標準化指令碼語言
Var、const、let區別
Var、const、let 1. var申明的變數不強制初始化,如果不初始化變數打印出來為undefind,並且定義的變數為可修改的變數 2. cons
全域性作用域中,用const和let宣告的變數去哪了?
用const和let宣告的變數,不會存在window物件中 大家都知道在全域性作用域中用var宣告的變數,儲存在window物件中 但是用ES6的const或者let在全域性作用域中宣告的變數,卻不在window物件中 那這個全域性變數abc
var、const、let 的區別
定義變數的三種方式 var、const、let 都可以用來定義變數,但三者之間存在區別。 var var 宣告變數的時候無需初始化。 var 宣告的變數可在後面進行修改。 var 宣告的全域性變數可以被函式修改。 <!DOCTYPE html> <html>
03 -2 numpy與pandas中isnull()、notnull()、dropna()、fillna()處理丟失資料的理解與例項
引入三劍客 import numpy as np import pandas as pd from pandas import Series,DataFrame 處理丟失資料 1.有兩種丟失資料: None: Python自帶的資料型別 不能參與到任何計算中
【C++】C與C++中 const常量 - 修改時報錯
#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &
轉:C++中const、volatile、mutable的用法
const修飾普通變數和指標 const修飾變數,一般有兩種寫法: const TYPE value; TYPE const value; 這兩種寫法在本質上是一樣的。它的含義是:const修飾的型別為TYPE的變數value是不可變的。對於一個非指標的型別T
ES6中Json、String、Map、Object之間的轉換
'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選中或不選
ES5與ES6中的陣列操作方法簡單介紹
許多同學在寫javascript程式碼的時候都習慣於使用順手和常用的方法,比如說在運算元組時習慣使用for,whlie迴圈,在列舉物件時,習慣使用for in,其實在ES5和ES6出來以後,有很多新的運算元組和物件的方法,這裡我們來重點看一下一些功能強大,但又往往被我們忽視的操作方法。 先來定義一個簡單的陣
JS中的方法名與HTML中id、name重名問題
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檔案時全域性SPS、PPS與流中SPS、PPS衝突的問題
一、問題1. 使用FFmpeg的SDK庫實現將H.264流封裝進MP4檔案的原始碼大致如下:char* filename = "./test.mp4"AVOutputFormat *fmt;AVStream* video_st;AVFormatContext *av_cont
C++中getline與C中scanf、gets小結
getline()的原型是istream& getline ( istream &is , string &str , char delim ); 其中 istream