摘要:你知道中的每條語句甚至表達(dá)式都有一個結(jié)果值嗎當(dāng)你在瀏覽器中測試代碼時,經(jīng)常會在控制臺的輸出結(jié)果的最后面多出一條,大部分為,這個就是一個結(jié)果值。特例變量聲明語句函數(shù)聲明語句的結(jié)果值為。
你知道JavaScript中的每條語句、甚至表達(dá)式都有一個結(jié)果值嗎?
當(dāng)你在瀏覽器中測試代碼時,經(jīng)常會在控制臺的輸出結(jié)果的最后面多出一條,大部分為undefined,這個undefined就是一個結(jié)果值。
ES7的do表達(dá)式先從ES7的一個提案說起吧:do表達(dá)式do{...}(注意:不是do{...}while();中的do)
var a,b,c = 3; a = do { if (true) { b = c*3; } }; a; //9 目前的瀏覽器暫不支持
表達(dá)式do{...}的作用就是返回它后面的語句塊的結(jié)果值,功能其實(shí)和return類似,只不過return需要通過函數(shù)來封裝后調(diào)用。
不過目前來說,我們還無法使用上面的功能,目前的規(guī)范是不允許我們獲得語句的結(jié)果值并將其賦值給一個變量的(除了使用eval(),如var a = eval("if (true) {b = c*3;}"),a的值被賦值為eval()內(nèi)的語句的結(jié)果值,不建議使用eval())。
ES5規(guī)范關(guān)于結(jié)果值的規(guī)定現(xiàn)在你應(yīng)該大概理解了什么是結(jié)果值了,本人翻看了ES5規(guī)范,發(fā)現(xiàn)JavaScript中,語句塊、語句、甚至表達(dá)式都會隱式地返回一個結(jié)果值,總結(jié)如下:
結(jié)果值是語句、表達(dá)式經(jīng)過邏輯運(yùn)算后的值,若無邏輯(按順序執(zhí)行)則為最后一條子語句、表達(dá)式的結(jié)果值(語句可以包含子語句),簡單地說它就是一個語句、表達(dá)式的“隱式的返回值”,JavaScript會計(jì)算每一條語句、表達(dá)式并返回一個結(jié)果值,而對于語句塊的結(jié)果值,它是最后一條最外層語句的結(jié)果值(非嵌套的子語句)。
部分瀏覽器會在控制臺輸出一段代碼的最后一條語句或語句塊的結(jié)果值(本文所有代碼均使用Firefox測試,不同瀏覽器有差別)
結(jié)果值可以為任何表達(dá)式的值,也可以為空(;、break;、continue;),為空時結(jié)果值為undefined。當(dāng)結(jié)果值為空時,瀏覽器會忽略該語句,而打印出上一條同級的非空的語句,若僅有自身一條同級語句則打印出undefined。
特例:var變量聲明語句、函數(shù)聲明語句的結(jié)果值為undefined。
變量聲明語句算法的返回值實(shí)際為表示該變量名稱的字符串,但是這個值被變量語句算法屏蔽掉了(for...in循環(huán)除外),最后返回結(jié)果為undefined
而對于函數(shù)聲明語句,它的結(jié)果值本人按規(guī)范解讀為該函數(shù)對象,但瀏覽器顯示為undefined,具體什么原因,本人還不理解(可能是因?yàn)楹瘮?shù)只是定義,未被實(shí)際執(zhí)行的原因);
函數(shù)執(zhí)行語句的結(jié)果值為:
3.1 若有throw語句,則為throw語句的結(jié)果值 3.1 若有return語句,則為return語句的結(jié)果值 3.2 若無throw、return語句則為undefined
例子:
var a,b,c = 3; if (true) {b = c*3;} //按順序執(zhí)行到最后一條語句,輸出9
; //undefined 多帶帶的空語句
var d = 5; //undefined 所有的var聲明語句的結(jié)果值均為undefined
function foo(a){ a = a+2; return a; } //undefined 函數(shù)聲明語句的最終結(jié)果值也為undefined
foo(1); //3 函數(shù)執(zhí)行語句的結(jié)果值為函數(shù)throw、return語句的結(jié)果值,若無throw、return語句,則為undefined
if(true){a=1;}else{b=2;} //1 按邏輯計(jì)算結(jié)果執(zhí)行a=1;語句
{ var a = 1,b = 2; if(true){a;}else{b;} //輸出1,最后一條空語句會被忽略 ; }
var a = 5; switch(a){ case 1: a+1; break; case 5: a+5; break; case 3: a+3; break; } //10 空的break;語句會被忽略
var a = 5; switch(a){ case 1: a+1; break; case 5: break; //執(zhí)行這里,它這里無同級語句 case 3: a+3; break; } //undefined
下面來具體看看表達(dá)式的結(jié)果值有什么用:
大部分表達(dá)式只有結(jié)果值,沒有副作用,如: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
賦值語句的副作用是將"="右邊的表達(dá)式的結(jié)果值賦值給了左邊的變量,最終整個賦值語句的結(jié)果值為變量的值,為此我們可以這樣:
function foo(a){ var b; if(a&&(b = a*10;)<50){ ... } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80608.html
摘要:前端工作面試問題備注本包含了一些前端面試問題用于考查候選者。不建議對單個候選者問及每個問題那需要好幾個小時。列舉不同的清除浮動的技巧,并指出它們各自適用的使用場景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對象,數(shù)組,元素?cái)?shù)組,對象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...
摘要:前端工作面試問題備注本包含了一些前端面試問題用于考查候選者。不建議對單個候選者問及每個問題那需要好幾個小時。列舉不同的清除浮動的技巧,并指出它們各自適用的使用場景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對象,數(shù)組,元素?cái)?shù)組,對象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...
摘要:前端工作面試問題備注本包含了一些前端面試問題用于考查候選者。不建議對單個候選者問及每個問題那需要好幾個小時。列舉不同的清除浮動的技巧,并指出它們各自適用的使用場景。選擇器字符串,字符串,回調(diào)函數(shù),元素,對象,數(shù)組,元素?cái)?shù)組,對象等。 https://github.com/darcyclarke/Front-end-Developer-Interview-Questions 前端工作面...
摘要:任何一個函數(shù)都可以使用來調(diào)用,因此其實(shí)并不存在構(gòu)造函數(shù),而只有對于函數(shù)的構(gòu)造調(diào)用。不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會拋出一個錯誤。 this關(guān)鍵字是JavaScript中最復(fù)雜的機(jī)制之一,是一個特別的關(guān)鍵字,被自動定義在所有函數(shù)的作用域中,但是相信很多JsvaScript開發(fā)者并不是非常清楚它究竟指向的是什么。聽說你很懂this,是真的嗎? 請先回答第一個問題:如何準(zhǔn)...
閱讀 1109·2021-11-16 11:45
閱讀 3130·2021-10-13 09:40
閱讀 721·2019-08-26 13:45
閱讀 1200·2019-08-26 13:32
閱讀 2174·2019-08-26 13:23
閱讀 916·2019-08-26 12:16
閱讀 2828·2019-08-26 11:37
閱讀 1754·2019-08-26 10:32