2015-12-10 112 views
1

我試圖讓checkNull1返回true,但它返回undefined。我的理解是,checkNull2應該與checkNull1完全相同,但是使用變量來存儲返回結果。我究竟做錯了什麼?當它返回布爾結果時函數返回undefined

謝謝。

function checkNull1(obj) { 
    return 
    (obj.a === null && 
    obj.b === null && 
    obj.c === null) 
    ; 
} 

function checkNull2(obj) { 
    var isNull = 
    (obj.a === null && 
    obj.b === null && 
    obj.c === null) 
    ; 

    return isNull; 
} 

function checkNull3() { 
    var nullObj = null; 
    return nullObj === null; 
} 

var object1 = {}; 
object1.a = null; 
object1.b = null; 
object1.c = null; 

console.log("checkNull1: " + checkNull1(object1)); 
console.log("checkNull2: " + checkNull2(object1)); 
console.log("checkNull3: " + checkNull3()); 

的jsfiddle:http://jsfiddle.net/Ravvy/ah8hn2qy/

+5

問題是[自動分號插入(http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi)。 – nem035

回答

4

你陷入一個詞法/解析「怪癖」。

在JavaScript中有一些名爲Automatic Semicolon Insertion或ASI的簡稱。基本上,這意味着JavaScript引擎會嘗試通過爲您插入;來修復您的部分代碼,並在可能的地方終止語句。 當解析器找到尾隨換行符時,將總會插入一個分號,如return,break,throwcontinue

你的功能正在被抓住。什麼發動機確實是這樣的:

function checkNull1(obj) { 
    return; 
    // Code below will not be used. it's dead. 
} 

所以解決將是移動狀態下可達到同一行return和更長期的修復,儘管在這個例子是不是違反了這個,但要記住總是用分號結束語句,儘管它有時是可選的。

function checkNull1(obj) { 
    return (obj.a === null && 
     obj.b === null && 
     obj.c === null); 
} 
1

你壓痕導致錯誤的行爲。像這樣的東西會工作:

function checkNull1(obj) { 
    return (obj.a === null && 
    obj.b === null && 
    obj.c === null); 
} 

小心使用分號在Javascript:http://es5.github.io/#x7.9