摘要:報(bào)錯(cuò)塊級(jí)作用域明確允許在塊級(jí)作用域中聲明函數(shù)。但其值是固定的,不可更改,只讀。一旦聲明變量,就必須立即初始化,不能留到以后賦值。調(diào)用函數(shù)會(huì)返回一個(gè)內(nèi)部指針,執(zhí)行它不會(huì)返回結(jié)果返回的是指針對(duì)象。
ES6初步學(xué)習(xí) let和const let
用來(lái)聲明變量,但是所聲明的變量只在let命令所在的代碼塊內(nèi)有效
let不像var那樣會(huì)發(fā)生變量提升,所以一定要先聲明后使用。
console.log(foo); //undefined console.log(bar); //報(bào)錯(cuò)ReferenceError var foo = 2; let bar = 3;塊級(jí)作用域
ES6明確允許在塊級(jí)作用域中聲明函數(shù)。但是盡量避免在塊級(jí)作用域內(nèi)聲明函數(shù),如果需要也要寫(xiě)成函數(shù)表達(dá)式,而不是函數(shù)聲明語(yǔ)句。
在ES6中,塊級(jí)作用域之中,函數(shù)聲明的語(yǔ)句的行為類似let,在塊級(jí)作用域之外不能被引用。
let實(shí)際上為javascript新增了塊級(jí)作用域
外層作用域無(wú)法讀取內(nèi)層作用域的變量
內(nèi)層作用域可以定義外層作用域的同名變量
塊級(jí)作用域?qū)嶋H上使得廣泛運(yùn)用的立即執(zhí)行函數(shù)變得不再必要了。
function f1() { let n =5; if(rue) {let n = 10;} console.log(n); //5,注意只能在f1這個(gè)作用域使用 }
javascript沒(méi)有塊級(jí)作用域,但是用let聲明的變量可以綁定到所在的任意作用域中,換句話說(shuō)let為其聲明的變量隱式的劫持了所在的塊作用域{...}
var foo = true; if(foo) { let bar = foo * 2; bar = something(bar); console.log(bar); //bar只在foo作用域中有效 } console.log(bar); //ReferenceError不太明顯的“死區(qū)”
有興趣的可以自行搜索了解一下TDZ(暫存死區(qū)),記得當(dāng)時(shí)還是看到阮大神的微博知道的~~
function bar(x = y; y = 2) { return [x, y]; } bar(); //報(bào)錯(cuò),此時(shí)相當(dāng)于y未聲明的情況下
let不允許在相同作用域內(nèi)重復(fù)聲明同一個(gè)變量,不能在函數(shù)內(nèi)部重新聲明參數(shù)。const也是這樣。
function(arg) {let arg; //報(bào)錯(cuò)}const
const同樣可以創(chuàng)建塊作用域變量,同樣只在聲明所在的塊級(jí)作用域中有效。但其值是固定的,不可更改,只讀。
一旦聲明變量,就必須立即初始化,不能留到以后賦值。
//只聲明不賦值就會(huì)報(bào)錯(cuò) const foo; //SyntaxError:
const聲明的變量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。
if(true) { console.log(MAX); //ReferenceError const MAX = 5; }
對(duì)于復(fù)合類型的變量,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const只保證變量名指向的地址不變,不保證該地址的數(shù)據(jù)保持不變。不能把foo指向另一個(gè)地址。
const foo = {}; foo.prop = 123; foo.prop; //123 foo = {}; //TypeError:"foo" is read-only頂層對(duì)象的屬性
瀏覽器環(huán)境指的是window對(duì)象 Node中指的是global對(duì)象
ES6中,var命令和function命令聲明的全局變量依舊是頂層對(duì)象的屬性,但是let和const以及class聲明的全局變量不屬于頂層對(duì)象的屬性。
var a = 1; window.a; //1 let b = 1; window.b; //undefined異常
嚴(yán)格模式下LHS查詢失敗時(shí),并不會(huì)創(chuàng)建并返回一個(gè)全局變量,引擎會(huì)拋出同RHS查詢失敗時(shí)類似的ReferenceError異常
如果RHS查詢到一個(gè)變量,嘗試對(duì)這個(gè)變量的值進(jìn)行不合理的操作時(shí),比如對(duì)一個(gè)非函數(shù)類型的值進(jìn)行函數(shù)調(diào)用,或者引用null或undefined類型的值中的屬性,引擎會(huì)拋出另外一中的異常TypeError
ReferenceError同作用域的判別失敗有關(guān),TypeError則表示作用域判別成功了,但是對(duì)結(jié)果的操作是非法的或者不合理的。
查找的目的是對(duì)變量進(jìn)行賦值,那么就會(huì)使用LHS查詢,如果目的是獲取變量的值,那么就會(huì)使用RHS查詢。
像var a = 2這樣的會(huì)被分解兩個(gè)步驟:(1)var a 會(huì)在作用域中聲明新變量,代碼執(zhí)行前進(jìn)行(2)a = 2 會(huì)查詢(LHS)變量a并對(duì)其進(jìn)行賦值。
閉包循環(huán)和閉包
每次迭代都生成一個(gè)新的作用域,使得延遲函數(shù)的回調(diào)可以將新的作用域封閉在每個(gè)迭代內(nèi)部。
for(var i = 0; i <= 5; i++) { (functiong(j) { setTimeout(function timer() { console.log(a); }, 1000); })(i); }
Generator函數(shù)var的循環(huán),每一次循環(huán)都是新的i值覆蓋舊的i值,只有一個(gè)i,所以只輸出最后一個(gè)。
let的循環(huán) 每次循環(huán)都是一個(gè)新的變量i,多個(gè)i,所以會(huì)每個(gè)都輸出,每次迭代都進(jìn)行重新綁定,與閉包有關(guān)
異步
最大的特點(diǎn)就是可以交出函數(shù)的執(zhí)行權(quán)(即暫停執(zhí)行)
函數(shù)名之前加星號(hào).yield表示執(zhí)行到此處,執(zhí)行權(quán)將交給其他協(xié)程。
function* gen(x) { var y = yield x + 2; return y; } var g = gen(1); g.next() //{value:3,done:false} //value是yield語(yǔ)句后面表達(dá)式的值,表示當(dāng)前階段的值,done表示函數(shù)是否執(zhí)行完畢,是否還有下一個(gè)階段。 g.next() //{value:undefined,done:true}
調(diào)用generator函數(shù)會(huì)返回一個(gè)內(nèi)部指針g,執(zhí)行它不會(huì)返回結(jié)果返回的是指針對(duì)象。調(diào)用指針的g的next方法,會(huì)移動(dòng)內(nèi)部指針,指向第一個(gè)遇到的yield語(yǔ)句即x+2處。
Set數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組但是成員的值都是唯一的,沒(méi)有重復(fù)的值。
var s = new Set([1,2,3,4,4]); [...s] //[1,2,3,4]
Set實(shí)例的方法
操作方法和遍歷方法
操作數(shù)據(jù)
(1) 操作方法
add:添加某個(gè)值,放回set結(jié)構(gòu)本身
delete:刪除某個(gè)值返回一個(gè)布爾值,表示刪除是否成功
has(value):返回一個(gè)布爾值,表示該值是否為set的成員
clear:清除所有成員,沒(méi)有返回值
s.add(2).add(3).add(2); s.size //2 s.has(1) //false s.has(2) //true s.has(3) //true s.delete(2); s.has(2) //false
(2) Array.from方法可以將set數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為數(shù)組
var items = new Set([1,2,3,4,5]); var array = Array.from(items);
(3) 擴(kuò)展運(yùn)算符...也可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換一個(gè)數(shù)組
function foo() { var args = [...arguments]; } [...document.querySelectorAll("div")]
(4)數(shù)組去重的另一種方法
function dedupe(array) { return Array.from(new Set(array)); } dedupe([1,1,2,3]) //[1,2,3]
遍歷操作
keys:返回鍵名的遍歷器
values:返回鍵值的遍歷器
entries:返回鍵值對(duì)的遍歷器
forEach:使用回掉函數(shù)遍歷每個(gè)成員
附錄(易錯(cuò)點(diǎn)):隱式的強(qiáng)制轉(zhuǎn)換
3 + true; //4 NaN !== NaN; //true Null == undefined; //true
浮點(diǎn)數(shù)
0.1 + 0.2; //0.300000004 (8).toString(2); //"1000" parseInt("1001", 2); //9
數(shù)據(jù)類型
typeof null; //"object" typeof "hello"; //"string" var s = new String("hello"); typeof s; //"object" var s1 = new String("hello"); var s2 = new String("hello"); s1 === s2; //false s1 == s2; //false NaN !==NaN
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82027.html
摘要:年月,的創(chuàng)造者公司,決定將提交給國(guó)際標(biāo)準(zhǔn)化組織,希望這種語(yǔ)言能夠成為國(guó)際標(biāo)準(zhǔn)。這表示外層代碼塊不受內(nèi)層代碼塊的影響。也可以運(yùn)用于函數(shù)及其他文中就簡(jiǎn)單介紹這么多,想更加了解新特性的可以自尋查看一下阮一峰的一本入門(mén) ES6新特性 最近在項(xiàng)目中遇到了很多ES6的語(yǔ)法,遇到了不少坑坑洼洼,因此,在這里就簡(jiǎn)單介紹一下ES6中的一些新特性 如果想真正的了解ES6和ES5有什么不同,這里推薦看一下...
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...
摘要:額,經(jīng)歷過(guò)上面的知識(shí)了解,應(yīng)該能大概夠理解這段代碼了吧小結(jié)修飾器允許你在類和方法定義的時(shí)候去注釋或者修改它。 閑言 一切都要從公司里的一位老哥給我看的一段代碼說(shuō)起。。。 @controller(/user) @auth @post(/login) async userLogin = (name, pass) => { @required // ... } 以下為對(duì)話:...
摘要:有傳聞?wù)f,箭頭函數(shù)的語(yǔ)法,是受到了的影響,并且它與中的語(yǔ)法一樣,共享上下文。箭頭函數(shù)是新增加的一個(gè)特性。箭頭函數(shù)沒(méi)有自己的值,其值是通過(guò)繼承其它傳入對(duì)象而獲得的通常來(lái)說(shuō)是上一級(jí)外部函數(shù)的的指向。 箭頭函數(shù) 1. 簡(jiǎn)單的定義: 胖箭頭函數(shù) Fat arrow functions,又稱箭頭函數(shù),是一個(gè)來(lái)自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語(yǔ)法=>,...
摘要:本質(zhì)就是一個(gè)編譯器,通過(guò)將源代碼解析成抽象語(yǔ)法樹(shù)將源代碼的結(jié)果一系列轉(zhuǎn)換生成目標(biāo)代碼的將目標(biāo)代碼的轉(zhuǎn)換成代碼。項(xiàng)目構(gòu)建三開(kāi)發(fā)環(huán)境本地服務(wù)器搭建源碼下載地址參考資料入門(mén)阮一峰中文文檔中文網(wǎng) 注:以下教程均在 windows 環(huán)境實(shí)現(xiàn),使用其他操作系統(tǒng)的同學(xué)實(shí)踐過(guò)程可能會(huì)有些出入。 ??在上一章 webpack 項(xiàng)目構(gòu)建:(一)基本架構(gòu)搭建 我們搭建了一個(gè)最基本的 webpack 項(xiàng)目,現(xiàn)...
閱讀 2553·2021-10-11 10:58
閱讀 1038·2019-08-29 13:58
閱讀 1673·2019-08-26 13:32
閱讀 838·2019-08-26 10:40
閱讀 3265·2019-08-26 10:18
閱讀 1764·2019-08-23 14:18
閱讀 1113·2019-08-23 10:54
閱讀 442·2019-08-22 18:39