1

I am trying to have checkNull1 return true but it returns undefined. My understanding is that checkNull2 should work exactly the same way as checkNull1 but instead uses a variable to store the return result. What am I doing wrong?

Thanks.

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/

Ravvy
  • 199
  • 7
  • 5
    The problem is [automatic semicolon insertion](http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi). – nem035 Dec 10 '15 at 20:16

2 Answers2

4

You're getting caught in a lexing/parsing "quirk".

In JavaScript there is something called Automatic Semicolon Insertion or ASI for short. Basically what this means is that the JavaScript engine will try and fix your some parts code for you by inserting a ; for you, terminating statements where it can. Statements like return, break, throw and continue will always have a semi-colon inserted when a trailing newline is found by the parser.

Your function is getting caught in this. What the engine really does is this:

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

So the fix would be to move the condition up on to the same line as return and more long term fix, even though in this example is not in violation of this, but to remember to always end statements with a semi-colon even though it sometimes is optional.

function checkNull1(obj) {
    return (obj.a === null &&
       obj.b === null &&
       obj.c === null); 
}
Henrik Andersson
  • 37,809
  • 15
  • 88
  • 86
1

Your indentation caused the wrong behavior. Something like this would work:

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

Be careful with semicolons in Javascript: http://es5.github.io/#x7.9

Mr_Pouet
  • 3,322
  • 7
  • 32
  • 45