JavaScript的子集
ADsafe
dojix.secure
Caja
FEJS
Microsoft Web Sandbox
JavaScript的擴(kuò)展
1. 常量和局部變量
- const
const用來聲明一個(gè)常量,它的行為和var的行為十分相似,由于js中沒有塊級(jí)作用域,因此常量會(huì)被提前至函數(shù)定義的頂部。
任何對(duì)常量的重新賦值都會(huì)被忽略,重新聲明常量也會(huì)報(bào)錯(cuò)。 - let
let的四種使用方式:
1.可以作為變量聲明,和var一樣
2.在for或for/in循環(huán)中,作為var的替代方案
3.在語句塊中定義一個(gè)新變量并顯示指定它的作用域
4.定義一個(gè)在表達(dá)式內(nèi)部作用域中的遍歷,這個(gè)遍歷只在表達(dá)式內(nèi)可用
??!通過var聲明的變量在函數(shù)內(nèi)部都是可用的,而通過let聲明的變量則只屬于就近的花括號(hào)括起來的語句塊。
在聲明語句中使用let和在循環(huán)初始化器中使用let的區(qū)別:
- 在聲明語句中使用let變量初始化表達(dá)式是在變量的作用域內(nèi)計(jì)算的。
- 在循環(huán)初始化器中變量的初始化表達(dá)式則是在變量的作用域之外計(jì)算的。
2. 解構(gòu)賦值
在解構(gòu)賦值中,等號(hào)右側(cè)是一個(gè)數(shù)組或?qū)ο螅付ㄗ髠?cè)一個(gè)或多個(gè)變量的語法和右側(cè)的數(shù)組和對(duì)象直接量的語法保持格式一致。
當(dāng)發(fā)生非解構(gòu)賦值時(shí),右側(cè)的數(shù)組和對(duì)象中一個(gè)或多個(gè)的值就會(huì)被提取出來,并賦值給左側(cè)相應(yīng)的變量名。
當(dāng)函數(shù)返回一組結(jié)果時(shí),使用解構(gòu)賦值會(huì)簡(jiǎn)化很多。
- 解構(gòu)賦值右側(cè)的數(shù)組所包含的元素不必和左側(cè)的變量一一對(duì)應(yīng),左側(cè)多余的變量的賦值為undefined,而右側(cè)多余的值則會(huì)忽略。
- 左側(cè)的變量列表可以包含連續(xù)的逗號(hào)用以跳過右側(cè)對(duì)應(yīng)的值。
- 解構(gòu)賦值的右側(cè)也可以是一個(gè)對(duì)象。
//等價(jià)于let sin = Math.sin,cos = Math.cos,tan = Math.tan
let {sin:sin,cos:cos,tan:tan} = Math;
3.迭代
- for/each循環(huán)
for/each并不是遍歷對(duì)象的屬性,而是遍歷屬性的值:
let p = {one:1;two:2;three:3}
for(let p in o) console.log(p); //for/in:輸出'one','two','three'
for each(let v in o)console.log(v) //for/each 輸出1~3
當(dāng)使用數(shù)組時(shí),for/each循環(huán)遍歷的元素,而不是索引:
a = ['one','two','three'];
for(let p in a) console.log(p); //prints array indexes 0,1,2
for each(let v in a) console.log(v); //prints array elts 'one',‘two’,'three' - 迭代器
- 迭代器是一個(gè)對(duì)象,這個(gè)對(duì)象允許對(duì)他的值集合進(jìn)行遍歷,并保持任何必要的狀態(tài)以便能夠跟蹤到當(dāng)前遍歷的“位置”。
- 迭代器必須包含next()方法,每一次調(diào)用next()都返回集合中的下一個(gè)值。
- 當(dāng)?shù)饔糜谟邢薜募蠒r(shí),當(dāng)遍歷完所有的值并且沒有多余的值可迭代時(shí),在調(diào)用nxt()方法會(huì)拋出StopIteration。Stoplteration是全局對(duì)象的屬性,它的值是一個(gè)普通的對(duì)象,只是為了終結(jié)迭代的目的而保留的一個(gè)對(duì)象。
- 我們?cè)趧?chuàng)建一個(gè)可迭代的對(duì)象和它的迭代器的時(shí)候,盡管必須寫一個(gè)itearator()方法并拋出一個(gè)StopIteration異常,但在正常使用時(shí)并不需要我們?nèi)ナ謩?dòng)調(diào)用iterator()方法或手動(dòng)處理StopIteration異常,for/in循環(huán)會(huì)自己處理這種邏輯。
- Iterator()函數(shù)返回耳朵迭代器有兩個(gè)重要的屬性:
1.它只對(duì)自有屬性進(jìn)行遍歷而忽略繼承的屬性
2.如果給Iterator()傳入第二個(gè)參數(shù)true,返回的迭代器只對(duì)屬性名進(jìn)行遍歷,而忽略屬性值。
- 生成器
1.生成器用到了一個(gè)關(guān)鍵字yield,在函數(shù)內(nèi)使用,用法和return類似,返回函數(shù)的一個(gè)值。
2.任何使用yield關(guān)鍵字的函數(shù),都稱為“生成器函數(shù)”。
3.生成器是一個(gè)對(duì)象,用以表示生成器函數(shù)當(dāng)前的執(zhí)行狀態(tài)。它定義了一個(gè)next()方法,后者可恢復(fù)生成器函數(shù)的執(zhí)行,直到遇到下一條yield語句為止。
4.生成器函數(shù)不需要返回。 - 數(shù)組推導(dǎo)
利用另外一個(gè)數(shù)組或可迭代對(duì)象來初始化數(shù)組元素。
數(shù)組推導(dǎo)語法:
【expression for( variable in object ) if ( condition )】 - 生成器表達(dá)式
將數(shù)組推導(dǎo)中的方括號(hào)替換成圓括號(hào),他就成了一個(gè)生成器表達(dá)式,他的返回值是一個(gè)生成器對(duì)象,而不是一個(gè)數(shù)組。
生成器沒有索引,為了得到第n個(gè)值,必須遍歷他之前的n-1個(gè)值。 - 函數(shù)簡(jiǎn)寫
表達(dá)式閉包:如果函數(shù)只計(jì)算一個(gè)表達(dá)式并返回它的值,關(guān)鍵字return和花括號(hào)都可以省略,并將待計(jì)算的表達(dá)式緊接著放在參數(shù)列表之后。
data.sort(function(a,b),b-a); //對(duì)數(shù)組按照數(shù)字大小順序進(jìn)行降序排列 - 多catch從句