2015-12-10 83 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