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

資訊專(zhuān)欄INFORMATION COLUMN

你知道JavaScript中的結(jié)果值是什么嗎?

YanceyOfficial / 2626人閱讀

摘要:你知道中的每條語(yǔ)句甚至表達(dá)式都有一個(gè)結(jié)果值嗎當(dāng)你在瀏覽器中測(cè)試代碼時(shí),經(jīng)常會(huì)在控制臺(tái)的輸出結(jié)果的最后面多出一條,大部分為,這個(gè)就是一個(gè)結(jié)果值。特例變量聲明語(yǔ)句函數(shù)聲明語(yǔ)句的結(jié)果值為。

你知道JavaScript中的每條語(yǔ)句、甚至表達(dá)式都有一個(gè)結(jié)果值嗎?

當(dāng)你在瀏覽器中測(cè)試代碼時(shí),經(jīng)常會(huì)在控制臺(tái)的輸出結(jié)果的最后面多出一條,大部分為undefined,這個(gè)undefined就是一個(gè)結(jié)果值。

ES7的do表達(dá)式

先從ES7的一個(gè)提案說(shuō)起吧:do表達(dá)式do{...}(注意:不是do{...}while();中的do

var a,b,c = 3;
a = do {
      if (true) {
           b = c*3;
      }
};
a; //9 目前的瀏覽器暫不支持

表達(dá)式do{...}的作用就是返回它后面的語(yǔ)句塊的結(jié)果值,功能其實(shí)和return類(lèi)似,只不過(guò)return需要通過(guò)函數(shù)來(lái)封裝后調(diào)用。

不過(guò)目前來(lái)說(shuō),我們還無(wú)法使用上面的功能,目前的規(guī)范是不允許我們獲得語(yǔ)句的結(jié)果值并將其賦值給一個(gè)變量的(除了使用eval(),如var a = eval("if (true) {b = c*3;}"),a的值被賦值為eval()內(nèi)的語(yǔ)句的結(jié)果值,不建議使用eval())。

ES5規(guī)范關(guān)于結(jié)果值的規(guī)定

現(xiàn)在你應(yīng)該大概理解了什么是結(jié)果值了,本人翻看了ES5規(guī)范,發(fā)現(xiàn)JavaScript中,語(yǔ)句塊、語(yǔ)句、甚至表達(dá)式都會(huì)隱式地返回一個(gè)結(jié)果值,總結(jié)如下:
結(jié)果值是語(yǔ)句、表達(dá)式經(jīng)過(guò)邏輯運(yùn)算后的值,若無(wú)邏輯(按順序執(zhí)行)則為最后一條子語(yǔ)句、表達(dá)式的結(jié)果值(語(yǔ)句可以包含子語(yǔ)句),簡(jiǎn)單地說(shuō)它就是一個(gè)語(yǔ)句、表達(dá)式的“隱式的返回值”,JavaScript會(huì)計(jì)算每一條語(yǔ)句、表達(dá)式并返回一個(gè)結(jié)果值,而對(duì)于語(yǔ)句塊的結(jié)果值,它是最后一條最外層語(yǔ)句的結(jié)果值(非嵌套的子語(yǔ)句)。

部分瀏覽器會(huì)在控制臺(tái)輸出一段代碼的最后一條語(yǔ)句或語(yǔ)句塊的結(jié)果值(本文所有代碼均使用Firefox測(cè)試,不同瀏覽器有差別)

結(jié)果值可以為任何表達(dá)式的值,也可以為空(;break;、continue;),為空時(shí)結(jié)果值為undefined。當(dāng)結(jié)果值為空時(shí),瀏覽器會(huì)忽略該語(yǔ)句,而打印出上一條同級(jí)的非空的語(yǔ)句,若僅有自身一條同級(jí)語(yǔ)句則打印出undefined。

特例:var變量聲明語(yǔ)句、函數(shù)聲明語(yǔ)句的結(jié)果值為undefined。

變量聲明語(yǔ)句算法的返回值實(shí)際為表示該變量名稱(chēng)的字符串,但是這個(gè)值被變量語(yǔ)句算法屏蔽掉了(for...in循環(huán)除外),最后返回結(jié)果為undefined

而對(duì)于函數(shù)聲明語(yǔ)句,它的結(jié)果值本人按規(guī)范解讀為該函數(shù)對(duì)象,但瀏覽器顯示為undefined,具體什么原因,本人還不理解(可能是因?yàn)楹瘮?shù)只是定義,未被實(shí)際執(zhí)行的原因);

函數(shù)執(zhí)行語(yǔ)句的結(jié)果值為:

3.1 若有throw語(yǔ)句,則為throw語(yǔ)句的結(jié)果值
3.1 若有return語(yǔ)句,則為return語(yǔ)句的結(jié)果值
3.2 若無(wú)throw、return語(yǔ)句則為undefined

例子:

var a,b,c = 3;
if (true) {b = c*3;} //按順序執(zhí)行到最后一條語(yǔ)句,輸出9

; //undefined 多帶帶的空語(yǔ)句
var d = 5; //undefined 所有的var聲明語(yǔ)句的結(jié)果值均為undefined

function foo(a){
  a = a+2;
  return a;
}
//undefined 函數(shù)聲明語(yǔ)句的最終結(jié)果值也為undefined

foo(1); //3 函數(shù)執(zhí)行語(yǔ)句的結(jié)果值為函數(shù)throw、return語(yǔ)句的結(jié)果值,若無(wú)throw、return語(yǔ)句,則為undefined
if(true){a=1;}else{b=2;} //1 按邏輯計(jì)算結(jié)果執(zhí)行a=1;語(yǔ)句

{
  var a = 1,b = 2;
  if(true){a;}else{b;}  //輸出1,最后一條空語(yǔ)句會(huì)被忽略
  ;
}
var a = 5;
switch(a){
  case 1:
    a+1;
    break;
  case 5:
    a+5;
    break;
  case 3:
    a+3;
    break;
}
//10 空的break;語(yǔ)句會(huì)被忽略
var a = 5;
switch(a){
  case 1:
    a+1;
    break;
  case 5:
    break;  //執(zhí)行這里,它這里無(wú)同級(jí)語(yǔ)句
  case 3:
    a+3;
    break;
}
//undefined 

下面來(lái)具體看看表達(dá)式的結(jié)果值有什么用:
大部分表達(dá)式只有結(jié)果值,沒(méi)有副作用,如:var a = 2; var b = a + 3;,這里的表達(dá)式a+3的結(jié)果值為5,被賦值給了b。

而有副作用的表達(dá)式,如:

function foo(){
    a++;
}
var a=0;
foo(); //結(jié)果值為undefined,副作用是改變了a的值

又如:

var a = 0; 
var b = a++;
a; //1
b; //0
var c = a++; //結(jié)果值為undefined 副作用是c被賦值了,a變成了2 
var d = a++, a; //結(jié)果值為undefined,副作用是d被賦值為2,a變成了3,實(shí)際執(zhí)行的是var d = a++;
var d = (a++,a);//結(jié)果值為undefined,副作用是d被賦值為3,a變成了3,實(shí)際執(zhí)行的是var d = ++a;
function foo(){
    var e = f = 1;   //表達(dá)式f=1的結(jié)果值為1,1又被賦值給e
}
foo();
f; //1 創(chuàng)建了全局變量f
e; //ReferenceError

賦值語(yǔ)句的副作用是將"="右邊的表達(dá)式的結(jié)果值賦值給了左邊的變量,最終整個(gè)賦值語(yǔ)句的結(jié)果值為變量的值,為此我們可以這樣:

function foo(a){
    var b;
    if(a&&(b = a*10;)<50){
        ...
    }
}

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

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

相關(guān)文章

  • Front-end-Developer-Interview-Questions

    摘要:前端工作面試問(wèn)題備注本包含了一些前端面試問(wèn)題用于考查候選者。不建議對(duì)單個(gè)候選者問(wèn)及每個(gè)問(wèn)題那需要好幾個(gè)小時(shí)。列舉不同的清除浮動(dòng)的技巧,并指出它們各自適用的使用場(chǎng)景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對(duì)象,數(shù)組,元素?cái)?shù)組,對(duì)象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...

    array_huang 評(píng)論0 收藏0
  • Front-end-Developer-Interview-Questions

    摘要:前端工作面試問(wèn)題備注本包含了一些前端面試問(wèn)題用于考查候選者。不建議對(duì)單個(gè)候選者問(wèn)及每個(gè)問(wèn)題那需要好幾個(gè)小時(shí)。列舉不同的清除浮動(dòng)的技巧,并指出它們各自適用的使用場(chǎng)景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對(duì)象,數(shù)組,元素?cái)?shù)組,對(duì)象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...

    shadajin 評(píng)論0 收藏0
  • Front-end-Developer-Interview-Questions

    摘要:前端工作面試問(wèn)題備注本包含了一些前端面試問(wèn)題用于考查候選者。不建議對(duì)單個(gè)候選者問(wèn)及每個(gè)問(wèn)題那需要好幾個(gè)小時(shí)。列舉不同的清除浮動(dòng)的技巧,并指出它們各自適用的使用場(chǎng)景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對(duì)象,數(shù)組,元素?cái)?shù)組,對(duì)象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...

    13651657101 評(píng)論0 收藏0
  • 嗨,真的懂this?

    摘要:任何一個(gè)函數(shù)都可以使用來(lái)調(diào)用,因此其實(shí)并不存在構(gòu)造函數(shù),而只有對(duì)于函數(shù)的構(gòu)造調(diào)用。不可以當(dāng)作構(gòu)造函數(shù),也就是說(shuō),不可以使用命令,否則會(huì)拋出一個(gè)錯(cuò)誤。 this關(guān)鍵字是JavaScript中最復(fù)雜的機(jī)制之一,是一個(gè)特別的關(guān)鍵字,被自動(dòng)定義在所有函數(shù)的作用域中,但是相信很多JsvaScript開(kāi)發(fā)者并不是非常清楚它究竟指向的是什么。聽(tīng)說(shuō)你很懂this,是真的嗎? 請(qǐng)先回答第一個(gè)問(wèn)題:如何準(zhǔn)...

    morgan 評(píng)論0 收藏0
  • 真的知道JS?

    摘要:你真的知道嗎是一門(mén)奇怪的語(yǔ)言,要真正掌握并不容易。廢話不多說(shuō),來(lái)一個(gè)快速測(cè)試,道題目,看看你對(duì)是否真正掌握。操作符用來(lái)判斷某個(gè)屬性屬于某個(gè)對(duì)象,可以是對(duì)象的直接屬性,也可以是通過(guò)繼承的屬性。很多人會(huì)認(rèn)為打印的是。 你真的知道JavaScript嗎 ????JavaScript是一門(mén)奇怪的語(yǔ)言,要真正掌握并不容易。廢話不多說(shuō),來(lái)一個(gè)快速測(cè)試,5道題目,看看你對(duì)JavaScript是否真正...

    Half 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<