成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

ES6學(xué)習(xí)筆記(一)--------------------------------------le

Carson / 795人閱讀

摘要:命令聲明的常量也是不提升,同樣存在暫時性死區(qū),只能在聲明的位置后面使用。因此,將一個對象聲明為常量必須非常小心。不可變的只是這個地址,即不能把指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。

let和var一樣也是用來定義變量,不同之處在于let是塊級作用域,只在所定義的塊級作用域中生效,一個花括號便是一個塊級作用域

{var a="我是var定義的";let b="我是let定義的"}
console.log(a);  //我是var定義的
console.log(b); //b is not defined

可以看出let定義的變量在全局作用域內(nèi)并沒有生效

如果我們在全局作用域中定義,試一下看在函數(shù)或者流程控制語句中是否會輸出

let a="我是let定義的"
var b=0;
while(b<5){b++;console.log(a)}//⑤我是let定義的變量
if(true){console.log(a)}//我是let定義的變量

我們發(fā)現(xiàn)這樣可以輸出

如果我們反向來一下呢

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

我們發(fā)現(xiàn)let定義的變量不會被提升,只要有塊級括號存在,它就只在該塊級中有意義

如果在函數(shù)中呢

function test(){console.log(a)}() //報錯

我們發(fā)現(xiàn)并不能輸出

我們可以得出結(jié)論,流程控制語句中的變量均屬于全局變量,但是在流程控制語句中的括號中定義則為塊級,不會提升為全局變量

for循環(huán)還有一個特別之處,就是設(shè)置循環(huán)變量的那部分是一個父作用域,而循環(huán)體內(nèi)部是一個多帶帶的子作用域

for(let i=0;i<3;i++){
let i="abc";
console.log(i)}
//abc,abc,abc

let在for循環(huán)聲明的變量每一次循環(huán)的值都會被引擎內(nèi)部記下,但是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

我們可以看出,這種方式其實將未執(zhí)行的函數(shù)push進(jìn)數(shù)組了,當(dāng)每次調(diào)用時候發(fā)現(xiàn)此刻的i早已經(jīng)被循環(huán)覆蓋掉,最終輸出都為此刻的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當(dāng)時的i值

let不存在變量提升,只有在定義后再使用才不會報錯

console.log(a);var a=1;//undefined
console.log(b);let b=2;//報錯

let具有強制性綁定變量的能力,原先var聲明的變量,當(dāng)被let重新聲明的時候會被強制性綁定,原先var聲明的所有被let所管轄的塊級作用域里的變量均被let強制為自己聲明的值,形成暫時性死區(qū),let所處塊級作用域中l(wèi)et聲明之前的該變量均報錯

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不允許在相同作用域內(nèi),重復(fù)聲明同一個變量。

{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;}//報錯

上面的最后一個例子可以看出當(dāng)再次聲明該變量之前調(diào)用的變量都會炸掉

我們可以看到let聲明的變量可以引用塊級作用域外面的函數(shù)

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命令相同:只在聲明所在的塊級作用域內(nèi)有效。
const命令聲明的常量也是不提升,同樣存在暫時性死區(qū),只能在聲明的位置后面使用。
const聲明的常量,也與let一樣不可重復(fù)聲明。
const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內(nèi)存地址不得改動。對于簡單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個內(nèi)存地址,因此等同于常量。但對于復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個指針,const只能保證這個指針是固定的,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。

常量foo儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。

const foo={};
foo.prop=123;
console.log(foo.prop)//123

常量a是一個數(shù)組,這個數(shù)組本身是可寫的,但是如果將另一個數(shù)組賦值給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時候,是直接復(fù)制了一份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也是復(fù)制一份

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

還有很多不甚明朗的地方,各位大佬可以指點一二,互相學(xué)習(xí),加深理解

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88349.html

相關(guān)文章

  • es6學(xué)習(xí)筆記-字符串的擴展_v1.0_byKL

    摘要:學(xué)習(xí)筆記字符串的擴展字符的表示法允許使用的形式表示一個字符,但在之前,單個碼點僅支持到,超出該范圍的必須用雙字節(jié)形式表示,否則會解析錯誤。返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。,是引入了字符串補全長度的功能。 es6學(xué)習(xí)筆記-字符串的擴展_v1.0 字符的Unicode表示法 JavaScript 允許使用uxxxx的形式表示一個字符,但在 ES6 之前,單個碼點僅支持u00...

    JaysonWang 評論0 收藏0
  • Json-path學(xué)習(xí)筆記<>

    摘要:簡介是用于結(jié)構(gòu)化數(shù)據(jù)序列化的一種文本格式,包含種基礎(chǔ)類型字符串,數(shù)字,布爾和和兩種結(jié)構(gòu)類型對象和數(shù)組。對象是一個由零或者多個名值對組成的無序集合,其中名值對中名是字符串類型,值則可以是字符串,數(shù)字,布爾,,對象或數(shù)組類型。 Json JavaScript Object Notation (JSON)是一個輕量級的,基于文本的,跨語言的數(shù)據(jù)交換格式。它從ECMAScript編程語言標(biāo)準(zhǔn)(...

    Vicky 評論0 收藏0
  • Python 進(jìn)階之路 (十) 再立Flag, 社區(qū)最全的itertools深度解析(下)

    摘要:將每一行作為返回,其中是每行中的列名。對于每一行,都會生成一個對象,其中包含和列中的值。它返回一個迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡單實戰(zhàn) 大家好,我又來了,在經(jīng)過之前兩篇文章的介紹后相信大家對itertools的一些常見的好用的方法有了一個大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實場景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以優(yōu)化,希望有更好主意...

    tomorrowwu 評論0 收藏0
  • python 學(xué)習(xí)筆記 關(guān)于切片

    摘要:我們還可以給切片進(jìn)行命名,有名字的切片,顯然更具有可讀性。對切片賦值時,賦值符號右側(cè)必須是一個可迭代對象,即使這個對象只包含一個元素,否則會提示錯誤。注以上內(nèi)容主體來自于流暢的一書中切片和切片原理 切片是python中列表(list)、元組(tuple)、字符串(str)等序列類型都支持的一種操作,但實際上切片的功能比人們所想象的要強大的多。 切片區(qū)間為什么會忽略最后一個元素 當(dāng)只有...

    jerryloveemily 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<