摘要:同時這個變量立即被初始化,初始值為當語句執行到賦值語句時,這個變量改變其初始值。對一個還未初始化的變量進行操作將會引起。循環和循環使用申明變量時和循環一樣。的運行過程和三者的表現和在循環過程中相似。
let和const
標簽(空格分隔): es6
let命令這個命令是用來申明變量的,但是和es5不同的是,用它來聲明的變量是局部變量,存在于局部作用域(blocked scope):
var a = 1; console.log(this.a); ===> 1 let a = 1;(局部變量,不會掛載在window或global下) console.log(this.a); ===> undefined
此外,在寫es5的時候經常會遇到變量提升的情況,比如:
if(true) { console.log(a); ====> undefined var a = 1; } if(true) { console.log(a); ====> 報錯 let a = 1; }
即,如果使用let進行變量申明的話,一定要先申明再使用
const命令聲明一個immutable(不可改變)的變量,而使用let申明的變量是mutable。但是需要注意的地方是使用const申明的變量是這個變量的本身只可能有一個值,是immutable的,但是并不指著個值是immutable的。這個值還是可以改變的。例如:
cosnt obj = {}; //使用const聲明了一個immutable的變量 obj = {} //重新對這個變量賦值,那么就會報錯了 const obj = {}; obj.name = "XL"; console.log(obj); // {name: "XL"}這個時候是正常的temporal dead zone
通過let或const聲明的變量都有一個temporal dead zone(TDZ):當進入這個TDZ時,如果語句沒有執行到申明這個變量時,在此之前get或者set這個變量都是會報錯的.但是通過var申明的變量沒有TDZ。
通過var申明的變量的生命循環當進入到var變量的作用域中時,便為這個變量分配了存儲空間。同時這個變量立即被初始化,初始值為undefined.
當語句執行到賦值語句時,這個變量改變其初始值。
通過let申明的變量的生命循環當進入let申明變量的作用域中時,為這個變量分配了存儲空間。但是這個變量并未沒初始化。
對一個還未初始化的變量進行get/set操作將會引起ReferenceError。
當語句執行到賦值語句時,這個變量改變其初始值。
const聲明的變量必須一開就要賦值,并且這個變量不能被賦予新的值。
const a; a = "XL"; ====> 報錯在循環中的表現: var VS let VS const
for
for-in
for-of
for循環當中const arr = []; for(var i = 0; i < 3; i++) { arr.push(() => i); } arr.map(x => x()); //[3, 3, 3]
通過使用var申明變量時,會為這個值進行一次賦值,每次循環時都會重新對這個變量進行賦值。因此最后輸出時,返回的是相同的值
const arr = []; for(let i = 0; i < 3; i++) { arr.push(() => i); } arr.map(x => x()); //[0, 1, 2]
使用let申明變量的時候。每次循環過程,都相當于在一個新的blocked scope里面聲明一個變量,它們相互之間沒有影響,因此最后返回的值也不相同。
for-of循環和for-in循環const arr = []; for(var i of [0, 1, 2]) { arr.push(() => i); } arr.map(x => x()); //[2, 2, 2]
使用var申明變量時和for循環一樣。
const arr = []; for(let i of [0, 1, 2]) { arr.push(() => i); } arr.map(x => x()); //[0, 1, 2]
使用let進行循環時和for循環一樣。
使用const所達到的效果和let相同,不過通過const申明的變量是immutable的。
for-in的運行過程和三者的表現和在for-of循環過程中相似。
parameters如果使用let去申明一個和形參名字相同的變量的時候,將會報錯
function func(arg) { let arg; //static error: duplicate declaration of "arg" }
但是如果使用var去申明的話,則不會報錯,其達到的效果就是重新聲明一個變量覆蓋的掉了形式參數。
function func(arg) { var arg; }Coding style: const VS let VS var
如果你要定義一個immutable varity(原始值和Forzen Objects)時,盡量使用const。
如果要定義一個初始值可能會發生變化的變量時,盡量使用let。
在全局環境下通過var來申明的變量是可以掛載到全局對象(window/global),但是你完全可以通過直接在window/global去定義這個變量/屬性。
參考:
exporing es6
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80270.html
摘要:函數調用會在內存形成一個調用記錄,又稱調用幀,保存調用位置和內部變量等信息。等到運行結束,將結果返回到,的調用幀才會消失。方法用于將一組值,轉換為數組。,和遍歷數組方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的方法類似。 ES6 簡介 ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個版本標準,2015.06 發版。 let 和 const...
摘要:和不同,沒有變量提升,聲明之前,該變量都是不可用的。聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次。聲明同時必須賦值。 LET和const命令 var 變量聲明提升原則 var語句聲明的變量的作用域是當前執行位置的上下文 給一個非聲明變量賦值會隱式創建一個全局變量(全局object的一個屬性),注意這里是非聲明賦值 聲明和賦值是兩回事,注意區分,...
摘要:所以,最終極的辦法是一層一層凍結所有對象。塊級作用域使呈現出塊級作用域的特征。聲明的變量僅存在于當前塊級作用域中。在中,嚴格模式下等價于使用聲明,非嚴格下等價于使用。在中使用聲明的變量,為了保持程序的嚴謹性,不允許被訪問。 let和const都是聲明變量的新方式。 一般的,由于這兩種聲明方式的特性,現在項目組的開發規范中都會要求:不使用var而是let或const。 Const co...
JavaScript ES6 帶來了新的語法和新的強大功能,使您的代碼更現代,更易讀。它允許您編寫更少的代碼并執行更多操作。 ES6 向我們介紹了許多強大的功能,如箭頭函數,模板字符串,對象結構,模塊等,讓我們來看看。 const and let const 是 ES6 中用于聲明變量的新關鍵字。 const 比 var 更強大。使用后,無法重新分配變量。換句話說,它是一個不可變的變量,除非它與...
閱讀 3069·2021-11-24 11:14
閱讀 3479·2021-11-22 15:22
閱讀 3200·2021-09-27 13:36
閱讀 712·2021-08-31 14:29
閱讀 1328·2019-08-30 15:55
閱讀 1752·2019-08-29 17:29
閱讀 1143·2019-08-29 16:24
閱讀 2400·2019-08-26 13:48