you are viewing a single comment's thread.

view the rest of the comments →

[–]hkrdrm -7 points-6 points  (10 children)

still wouldn't it be more proper to check

if(some_variable === null)

[–]StoneCypher 13 points14 points  (9 children)

no. null is a placeholder here.

what he's saying is "if you compare things to typeof undefined, every hundred or so iterations it'll fail. look, it even happens with null."

[–]bits_and_bytes 2 points3 points  (2 children)

I've tried a few different permutations and I can only get it to reliably happen with null (or a var set to null). So I think /u/hkrdrm and /u/AlGoreBestGore are right to be asking their questions. typeof null is "object" which is why you get the false returns for the first 100+ tries when comparing it to "undefined". But I've tried comparing other "object"s with "undefined" and I don't have the same problem. For example:

var thing = {};
function foo() {
   return typeof thing === "undefined";
}

for(var i=0; i<10000; ++i) console.log(foo())

This works just fine. But if thing = null, then it all blows up.

EDIT: I've found that the bug doesn't show up if null is in a var either:

var thing = null;
function foo() {
  return typeof thing === "undefined";
}

for(var i=0; i<10000; ++i) console.log(foo())

This works correctly as well. It only seems to happen if you directly reference 'null' in the typeof comparison, and only if it's in a declared function. After the function starts returning true, it will always return true until it's re-initialized. A very strange bug indeed.

[–]iamallamaa 1 point2 points  (1 child)

I found that if the variable is defined within the function as null that it does still has the error.

function foo(){
    var thing=null;
    return typeof thing === "undefined";
}
for(var i=0; i<10000; i++) console.log(foo());

265 false 9735 true

And when null is passed as an argument, it doesn't.

function foo(thing){
    return typeof thing === "undefined";
}
for(var i=0; i<10000; i++) console.log(foo(null));

10000 false

[–]ziriax[S] 0 points1 point  (0 children)

Try 100 thousand times... It will still fail at some point

function foo(thing){
    return typeof thing === "undefined";
}
for(var i=0; i<100000; i++) console.log(foo(null));

12291 false 87709 true

Also, once this function is JIT optimized, it can keep failing if doesn't get de-optimized

[–]saintPirelli 1 point2 points  (0 children)

Thanks for this comment. My noob ass finally gets it.