什么是JavaScript中的結果值?
你知道JavaScript中的每條語句、甚至表達式都有一個結果值嗎?
當你在瀏覽器中測試代碼時,經(jīng)常會在控制臺的輸出結果的最后面多出一條,大部分為undefined,這個undefined就是一個結果值。
ES7的do表達式
先從ES7的一個提案說起吧:do表達式do{...}(注意:不是do{...}while();中的do)
var a,b,c = 3;
a = do {
if (true) {
b = c*3;
}
};
a; //9 目前的瀏覽器暫不支持
表達式do{...}的作用就是返回它后面的語句塊的結果值,功能其實和return類似,只不過return需要通過函數(shù)來封裝后調用。
不過目前來說,我們還無法使用上面的功能,目前的規(guī)范是不允許我們獲得語句的結果值并將其賦值給一個變量的(除了使用eval(),如var a = eval('if (true) {b = c*3;}'),a的值被賦值為eval()內的語句的結果值,不建議使用eval())。
ES5規(guī)范關于結果值的規(guī)定
現(xiàn)在你應該大概理解了什么是結果值了,本人翻看了ES5規(guī)范,發(fā)現(xiàn)JavaScript中,語句塊、語句、甚至表達式都會隱式地返回一個結果值,總結如下:
結果值是語句、表達式經(jīng)過邏輯運算后的值,若無邏輯(按順序執(zhí)行)則為最后一條子語句、表達式的結果值(語句可以包含子語句),簡單地說它就是一個語句、表達式的“隱式的返回值”,JavaScript會計算每一條語句、表達式并返回一個結果值,而對于語句塊的結果值,它是最后一條最外層語句的結果值(非嵌套的子語句)。
部分瀏覽器會在控制臺輸出一段代碼的最后一條語句或語句塊的結果值(本文所有代碼均使用Firefox測試,不同瀏覽器有差別)
結果值可以為任何表達式的值,也可以為空(;、break;、continue;),為空時結果值為undefined。當結果值為空時,瀏覽器會忽略該語句,而打印出上一條同級的非空的語句,若僅有自身一條同級語句則打印出undefined。
特例:var變量聲明語句、函數(shù)聲明語句的結果值為undefined。
1、變量聲明語句算法的返回值實際為表示該變量名稱的字符串,但是這個值被變量語句算法屏蔽掉了(for...in循環(huán)除外),最后返回結果為undefined
2、而對于函數(shù)聲明語句,它的結果值本人按規(guī)范解讀為該函數(shù)對象,但瀏覽器顯示為undefined,具體什么原因,本人還不理解(可能是因為函數(shù)只是定義,未被實際執(zhí)行的原因);
3、函數(shù)執(zhí)行語句的結果值為:
3.1 若有throw語句,則為throw語句的結果值
3.1 若有return語句,則為return語句的結果值
3.2 若無throw、return語句則為undefined
例子:
var a,b,c = 3;
if (true) {b = c*3;} //按順序執(zhí)行到最后一條語句,輸出9
; //undefined 單獨的空語句
var d = 5; //undefined 所有的var聲明語句的結果值均為undefined
function foo(a){
a = a+2;
return a;
}
//undefined 函數(shù)聲明語句的最終結果值也為undefined
foo(1); //3 函數(shù)執(zhí)行語句的結果值為函數(shù)throw、return語句的結果值,若無throw、return語句,則為undefined
if(true){a=1;}else{b=2;} //1 按邏輯計算結果執(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
下面來具體看看表達式的結果值有什么用:
大部分表達式只有結果值,沒有副作用,如:var a = 2; var b = a + 3;,這里的表達式a+3的結果值為5,被賦值給了b。
而有副作用的表達式,如:
function foo(){
a++;
}
var a=0;
foo(); //結果值為undefined,副作用是改變了a的值
又如:
var a = 0;
var b = a++;
a; //1
b; //0
var c = a++; //結果值為undefined 副作用是c被賦值了,a變成了2
var d = a++, a; //結果值為undefined,副作用是d被賦值為2,a變成了3,實際執(zhí)行的是var d = a++;
var d = (a++,a);//結果值為undefined,副作用是d被賦值為3,a變成了3,實際執(zhí)行的是var d = ++a;
function foo(){
var e = f = 1; //表達式f=1的結果值為1,1又被賦值給e
}
foo();
f; //1 創(chuàng)建了全局變量f
e; //ReferenceError
賦值語句的副作用是將'='右邊的表達式的結果值賦值給了左邊的變量,最終整個賦值語句的結果值為變量的值,為此我們可以這樣:
function foo(a){
var b;
if(a&&(b = a*10;)<50){
...
}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
javascript中獲取元素標簽中間的內容的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨avascript中獲取元素標簽中間的內容的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
前端JavaScript經(jīng)典操作之數(shù)組常用方法總結
數(shù)組操作是JavaScript中非常重要也非常常用的技巧,這篇文章主要給大家介紹了關于前端JavaScript經(jīng)典操作之數(shù)組常用方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07
javascript委托(Delegate)blur和focus用法實例分析
這篇文章主要介紹了javascript委托(Delegate)blur和focus用法,實例分析了javascript委托的用法及針對常見瀏覽器的使用技巧,需要的朋友可以參考下2015-05-05
JS中onpropertychange和onchange事件區(qū)別小結
當一個HTML元素的屬性用js改變的時候,都能通過onpropertychange來捕獲。例如一個文本text對象的value屬性被頁面的腳本修改的時候,onchange無法捕獲到,而onpropertychange卻能夠捕獲。2010-07-07

