摘要:命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置后面使用。因此,將一個對象聲明為常量必須非常小心。不可變的只是這個地址,即不能把指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。
let和var一樣也是用來定義變量,不同之處在于let是塊級作用域,只在所定義的塊級作用域中生效,一個花括號便是一個塊級作用域
{var a="我是var定義的";let b="我是let定義的"} console.log(a); //我是var定義的 console.log(b); //b is not defined
可以看出let定義的變量在全局作用域內并沒有生效
如果我們在全局作用域中定義,試一下看在函數或者流程控制語句中是否會輸出
let a="我是let定義的" var b=0; while(b<5){b++;console.log(a)}//⑤我是let定義的變量 if(true){console.log(a)}//我是let定義的變量
我們發現這樣可以輸出
如果我們反向來一下呢
for(let i=0;i<5;i++){ let a="流程控制語句花括號中的let"; var b="流程控制語句花括號中的var"; console.log(i)} //0,1,2,3,4 console.log(a); //a is not defined console.log(b); //流程控制語句中的var
for(var j=0;j<1;j++){ console.log(j)} // 0 console.log(j); //1
我們發現let定義的變量不會被提升,只要有塊級括號存在,它就只在該塊級中有意義
如果在函數中呢
function test(){console.log(a)}() //報錯
我們發現并不能輸出
我們可以得出結論,流程控制語句中的變量均屬于全局變量,但是在流程控制語句中的括號中定義則為塊級,不會提升為全局變量
for循環還有一個特別之處,就是設置循環變量的那部分是一個父作用域,而循環體內部是一個多帶帶的子作用域
for(let i=0;i<3;i++){ let i="abc"; console.log(i)} //abc,abc,abc
let在for循環聲明的變量每一次循環的值都會被引擎內部記下,但是var聲明的變量則會刷新覆蓋掉上一次的值
var a=[]; for(var i=0;i<10;i++){ a[i]=function(){return i};} console.log(a)//[f,f,f,f,f,f,f,f,f,f] a.forEach((e)=>{console.log(e())}) //⑩10
我們可以看出,這種方式其實將未執行的函數push進數組了,當每次調用時候發現此刻的i早已經被循環覆蓋掉,最終輸出都為此刻的i值10
var a=[]; for(let i=0;i<10;i++){ a[i]=function(){return i};} console.log(a)//[f,f,f,f,f,f,f,f,f,f] a.forEach((e)=>{console.log(e())}) //0,1,2,3,4,5,6,7,8,9
但是對于let聲明的變量,每一次引擎都會自動存儲記錄i的值,而不會覆蓋掉,因此每次輸出都是push當時的i值
let不存在變量提升,只有在定義后再使用才不會報錯
console.log(a);var a=1;//undefined console.log(b);let b=2;//報錯
let具有強制性綁定變量的能力,原先var聲明的變量,當被let重新聲明的時候會被強制性綁定,原先var聲明的所有被let所管轄的塊級作用域里的變量均被let強制為自己聲明的值,形成暫時性死區,let所處塊級作用域中let聲明之前的該變量均報錯
var a=1; {console.log(a); let a=2;} //a is not defined
var a=1; {let a=2; console.log(a);//2 }; console.log(a)//1
var a=1; console.log(a);//1 {let a=2; console.log(a);//2 };
let不允許在相同作用域內,重復聲明同一個變量。
{var a=0; let a=1; console.log(a)}//報錯
{let a=0; var a=1; console.log(a)}//報錯
{ let a=2; let a=3; console.log(a)}//報錯
{let a=2; console.log(a); let a=3;}//報錯
上面的最后一個例子可以看出當再次聲明該變量之前調用的變量都會炸掉
我們可以看到let聲明的變量可以引用塊級作用域外面的函數
let a=f(); function f(){ return 1 } console.log(a)// 1
{let a=f(); console.log(a)// 1 function f(){ return 1 }
const聲明的變量為永恒變量,不能更改,而且聲明以后必須初始化
const a;//報錯
const b=1; b=2//報錯
const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。
const命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置后面使用。
const聲明的常量,也與let一樣不可重復聲明。
const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內存地址不得改動。對于簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同于常量。但對于復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至于它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
常量foo儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。
const foo={}; foo.prop=123; console.log(foo.prop)//123
常量a是一個數組,這個數組本身是可寫的,但是如果將另一個數組賦值給a,就會報錯。
const a=[]; a.push(1); console.log(a)//[1] console.log(a.length)//1 a=[]//報錯
再來驗證以下引用
var a=1; b=a; console.log(b);//1 a=2; console.log(b)//1 b=3; console.log(a)//2
可以看出var定義的變量,b=a時候,是直接復制了一份a,并不是a的引用
let a=1; b=a; console.log(b);//1 a=2; console.log(b);//1 b=3; console.log(a);//2 console.log(b);//3 var b=4; console.log(b)//4
可以看出let也一樣
const也是復制一份
const a=1; b=a; console.log(b);//1 b=3; console.log(a);//1 console.log(b);//3 var b=4; console.log(b)//4
還有很多不甚明朗的地方,各位大佬可以指點一二,互相學習,加深理解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88349.html
摘要:學習筆記字符串的擴展字符的表示法允許使用的形式表示一個字符,但在之前,單個碼點僅支持到,超出該范圍的必須用雙字節形式表示,否則會解析錯誤。返回布爾值,表示參數字符串是否在源字符串的頭部。,是引入了字符串補全長度的功能。 es6學習筆記-字符串的擴展_v1.0 字符的Unicode表示法 JavaScript 允許使用uxxxx的形式表示一個字符,但在 ES6 之前,單個碼點僅支持u00...
摘要:簡介是用于結構化數據序列化的一種文本格式,包含種基礎類型字符串,數字,布爾和和兩種結構類型對象和數組。對象是一個由零或者多個名值對組成的無序集合,其中名值對中名是字符串類型,值則可以是字符串,數字,布爾,,對象或數組類型。 Json JavaScript Object Notation (JSON)是一個輕量級的,基于文本的,跨語言的數據交換格式。它從ECMAScript編程語言標準(...
摘要:將每一行作為返回,其中是每行中的列名。對于每一行,都會生成一個對象,其中包含和列中的值。它返回一個迭代器,是迭代結果都為的情況。深度解析至此全劇終。 簡單實戰 大家好,我又來了,在經過之前兩篇文章的介紹后相信大家對itertools的一些常見的好用的方法有了一個大致的了解,我自己在學完之后仿照別人的例子進行了真實場景下的模擬練習,今天和大家一起分享,有很多部分還可以優化,希望有更好主意...
摘要:我們還可以給切片進行命名,有名字的切片,顯然更具有可讀性。對切片賦值時,賦值符號右側必須是一個可迭代對象,即使這個對象只包含一個元素,否則會提示錯誤。注以上內容主體來自于流暢的一書中切片和切片原理 切片是python中列表(list)、元組(tuple)、字符串(str)等序列類型都支持的一種操作,但實際上切片的功能比人們所想象的要強大的多。 切片區間為什么會忽略最后一個元素 當只有...
閱讀 2838·2021-11-15 11:39
閱讀 1816·2021-09-24 09:48
閱讀 1060·2021-09-22 15:36
閱讀 3581·2021-09-10 11:22
閱讀 2991·2021-09-07 09:59
閱讀 952·2021-09-03 10:28
閱讀 667·2021-09-02 15:15
閱讀 2738·2021-08-27 16:24