03 語法

ES7中有一項(xiàng) do表達(dá)式 提案千贯,類似

var a , b;
a = do {
    if(true){
        b = 4 + 38;
    }
};
a; // 42

其目的是將語句當(dāng)作表達(dá)式來處理恰梢,從而不需要將語句封裝為函數(shù)再調(diào)用return 來返回值捎迫。

5.1.2 表達(dá)式副作用

最常見的有副作用的表達(dá)式是函數(shù)調(diào)用:

function foo() {
    a = a + 1;
}
var a = 1;
foo();   // 結(jié)果值: undefined 匠抗。副作用: a 的值被改變

可使用统刮,語句系列逗號(hào)運(yùn)算符將多個(gè)獨(dú)立的表達(dá)式語句串聯(lián)成一個(gè)語句:

var a = 42, b;
b = ( a++, a );
a;  // 43
b; // 43

a++, a 中第二個(gè)表達(dá)式a在a++之后執(zhí)行紊遵,結(jié)果為43,并被賦值給b侥蒙。

var a, b, c;
a = b = c = 42;

鏈?zhǔn)劫x值常常被誤用暗膜,例如var a = b = 42; 看似和前面的例子差不多,實(shí)則不然鞭衩。如果變量b沒有在作用域中象var b 這樣聲明過学搜,則var a = b =c = 42 不會(huì)對(duì)變量b進(jìn)行聲明娃善。在嚴(yán)格模式中會(huì)產(chǎn)生錯(cuò)誤,或者會(huì)無意中創(chuàng)建一個(gè)全局變量瑞佩。

5.1.3 上下文規(guī)則

  1. 大括號(hào)
    (1)對(duì)象常量
// 假定bar() 已定義
var a = {
    foo: bar()
}

{..}被賦值給a,因?yàn)樗且粋€(gè)對(duì)象常量聚磺。

(2)標(biāo)簽
如果將上例中的 var a = 去掉會(huì)發(fā)生什么情況呢?

{
        foo: bar()
    }  

{..}在這里只是一個(gè)普通的代碼塊炬丸。語法是完全合法的瘫寝,特別是和let在一起時(shí)非常有用。

但foo: bar() 這樣奇怪的語法為什么也合法呢稠炬?

這里涉及JS中一個(gè)不為人知的特性焕阿,叫做"標(biāo)簽語句",foo是語句bar() 的標(biāo)簽(后面沒有;)

如果JS有g(shù)oto語句首启,理論上可使用goto foo跳轉(zhuǎn)到foo處執(zhí)行暮屡。但JS不支持goto。

然而JS通過標(biāo)簽跳轉(zhuǎn)能實(shí)現(xiàn)goto的部分功能闽坡。continue和break語句都可帶一個(gè)標(biāo)簽栽惶,因此能像goto那樣進(jìn)行跳轉(zhuǎn)。

// 標(biāo)簽為foo的循環(huán)
foo: fro ( var i = 0;  i<4;  i++) {
    for(var j = 0; j<4;  j++){
        // 如果j和i相等疾嗅,繼續(xù)外層循環(huán)
        if(j == i) {
              // 跳轉(zhuǎn)到foo的下一個(gè)循環(huán)
              continue foo;
        }
        // 跳過奇數(shù)結(jié)果
        if( (j*i) % 2 == 1 ){
            // 繼續(xù)內(nèi)層循環(huán)(沒有標(biāo)簽的)
            continue;
        }
        console.log( i, j );
    }
}

continue foo 并不是指“跳轉(zhuǎn)到標(biāo)簽foo所在位置繼續(xù)執(zhí)行”外厂,而是"執(zhí)行foo循環(huán)的下一輪循環(huán)"。

帶標(biāo)簽的循環(huán)跳轉(zhuǎn)一個(gè)更大的用處在于代承,和 break __ 一起使用可實(shí)現(xiàn)從內(nèi)層循環(huán)跳轉(zhuǎn)到外層循環(huán)汁蝶。

// 標(biāo)簽為foo的循環(huán)
foo: for( var i = 0;  i < 4;  i++){
    for(var j=0; j<4; j++){
        if( (i*j) >= 3){
            console.log("stopping!", i, j);
            break foo;
        }
        console.log(i, j);
    }
}

標(biāo)簽也能用于非循環(huán)代碼塊,但只有break才可以论悴。我們可對(duì)帶標(biāo)簽的代碼塊使用break __掖棉,但是不能對(duì)帶標(biāo)簽的非循環(huán)代碼塊使用continue __,也不能對(duì)不帶標(biāo)簽的代碼塊使用break;

// 標(biāo)簽為bar的代碼塊
function foo(){
    bar: {
        console.log("Hello");
        break bar;
        console.log( "never runs" );
    }
    console.log( "world" );
}
foo();
// Hello
// World
  1. 對(duì)象解構(gòu)
function getData() {
    return {
        a: 42,
        b: "foo"
    }
}
var {a, b} = getData();

console.log(a, b);  // 42 "foo"

{a, b} = ..就是ES6中的解構(gòu)賦值膀估,相當(dāng)于下面的代碼:

var res = getData();
var a = res.a;
var b = res.b;

{..}還可用作函數(shù)命名參數(shù)的對(duì)象解構(gòu)幔亥,方便隱式地用對(duì)象屬性賦值:

function foo({a, b, c}){
    // 不再需要這樣:
    // var a = obj.a,  b = obj.b,  c =obj.c

    console.log(a, b, c);
}
foo({
    c: [1, 2, 3],
    a: 42,
    b: 'foo'
})


5.2.1 短路

對(duì)&& 和 || 來說,如果從左邊的操作數(shù)能夠得出結(jié)果察纯,就可忽略右邊的操作數(shù)帕棉。我們將這種現(xiàn)象稱為"短路"。

function doSomething(opts){
    if(opts.cache || primeCache()){
        //..
    }
}

5.5 函數(shù)參數(shù)

function foo( a = 42, b = a + 1){
    console.log(a, b);
}
foo();   // 42 43
foo( undefined );  // 42 43
foo( 5 );  // 5 6
foo( void 0, 7);  // 42 7
foo( null );  // null 1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饼记,一起剝皮案震驚了整個(gè)濱河市香伴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌具则,老刑警劉巖即纲,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異博肋,居然都是意外死亡低斋,警方通過查閱死者的電腦和手機(jī)蜂厅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔稳,“玉大人葛峻,你說我怎么就攤上這事锹雏“捅龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵礁遵,是天一觀的道長(zhǎng)轻绞。 經(jīng)常有香客問我,道長(zhǎng)佣耐,這世上最難降的妖魔是什么政勃? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮兼砖,結(jié)果婚禮上奸远,老公的妹妹穿的比我還像新娘。我一直安慰自己讽挟,他們只是感情好懒叛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耽梅,像睡著了一般薛窥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眼姐,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天诅迷,我揣著相機(jī)與錄音,去河邊找鬼众旗。 笑死罢杉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贡歧。 我是一名探鬼主播滩租,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艘款!你這毒婦竟也來了持际?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤哗咆,失蹤者是張志新(化名)和其女友劉穎蜘欲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌柬,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姥份,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年郭脂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈歉。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡展鸡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃难,到底是詐尸還是另有隱情莹弊,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布涡尘,位于F島的核電站忍弛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏考抄。R本人自食惡果不足惜细疚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望川梅。 院中可真熱鬧疯兼,春花似錦、人聲如沸贫途。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潮饱。三九已至来氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間香拉,已是汗流浹背啦扬。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凫碌,地道東北人扑毡。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盛险,于是被迫代替她去往敵國(guó)和親瞄摊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容