Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I compare a non-existing JavaScript object to undefined without getting a Reference Error?

I want to boolean to come out of this expression

(task === undefined); 

where task is arbitrary and doesn’t appear in the code at all.

However, when I run this in rhino, I get a reference Error. I WANT TRUE

Why don’t I get true?

I want to check if a particular variable has been defined. How do I do it then if this doesn't work?

like image 575
Fawkes5 Avatar asked Jul 08 '12 02:07

Fawkes5


People also ask

How do you check if JavaScript object is undefined?

In a JavaScript program, the correct way to check if an object property is undefined is to use the typeof operator. If the value is not defined, typeof returns the 'undefined' string.

How do I fix JavaScript reference error?

Reference errors in Javascript are mainly thrown when an attempt is made to reference a variable that does not exist or is out of scope. Therefore, in the majority of cases, a ReferenceError can be fixed by making sure that the referenced variable is defined correctly and is being called in the correct scope.

Is undefined JavaScript error?

JavaScript undefined. Undefined means a variable has been declared, but the value of that variable has not yet been defined. In JavaScript there is Undefined ( type ), undefined ( value ) and undefined ( variable ).


2 Answers

Use this:

(typeof task === "undefined") 

When you use (task === undefined), Javascript needs to find the value of task to see if it is the same as undefined, but it can't look up the name because it doesn't exist, giving you the reference error. typeof is special in that it can safely return the type of a name that doesn't exist.

like image 59
Ned Batchelder Avatar answered Oct 09 '22 09:10

Ned Batchelder


Addendum to the accepted answer to understand why it doesn't work with some examples you can try yourself in a javascript console.

Comparing directly with undefined type only works if the variable exist. Below is the output you'll get from the Google Chrome browser:

> task === undefined   ReferenceError: task is not defined 

However if the variable exists it will work:

// continued from above > var task   undefined > task === undefined   true 

This is the reason why you should use typeof solution instead because it will work in all cases without throwing errors (and breaking the execution of javascript code).

// continued from above > typeof notavariable === 'undefined'   true > typeof task === 'undefined'   true 

Note that you don't need the typeof check in some cases, such as the properties in a object literal:

// continued from above > var obj = {}   undefined > obj.test === undefined   true > obj.test = 1   1 > obj.test === undefined   false 

This is because properties in an object behave more like values in an associative array:

// continued from above > obj["test"]   1 > obj["test"] === undefined   false 

However you can't always be sure this is a case in a function where you have no control over the argument input:

// continued from above > function TestFunc(arg1) { console.log(arg1) }   undefined > TestFunc(notavariable)   ReferenceError: notavariable is not defined > TestFunc(task)   undefined   undefined > TestFunc(obj["lol"])   undefined   undefined 

Hope this exercise helps you out to understand the why's of this comparison.

like image 30
Spoike Avatar answered Oct 09 '22 07:10

Spoike