36

I am trying to test to see whether a Javascript variable is undefined.

You will see that I am not expecting the value of predQuery[preId] to be 'undefined' if I don't first get an alert saying "its unbelievable". But I often do, so I am guessing that my statement

 predQuery[preId]=='undefined') 

is not matching the undefined elements properly.

if((predQuery.length < preId) || (predQuery[preId]=="") || (predQuery[preId]=='undefined')){
   alert("its unbelievable");
   alert(predQuery[preId]);
   queryPreds[variables] = preId;
   queryObjs[variables] = objId;
   predQuery[preId] = variables;
}
else {
    alert(predQuery[preId]);
   var predIndex = predQuery[preId];
   queryPreds[predIndex] = preId;
   queryObjs[predIndex] = objId;
}

I can add more code if needed.

Sonny Chivas
  • 17
  • 10
Ankur
  • 47,089
  • 107
  • 237
  • 309
  • I have used (typeof(predQuery[preId])=='undefined') as my clause in my if statement. – Ankur Apr 20 '10 at 06:58
  • @deceze ... I meant that, I have changed my code. I haven't edited the question however as that won't help future people with the same problem. – Ankur Apr 21 '10 at 02:00
  • I see, sorry for the misunderstanding. :o) – deceze Apr 21 '10 at 02:03

7 Answers7

73

array[index] == 'undefined' compares the value of the array index to the string "undefined".
You're probably looking for typeof array[index] == 'undefined', which compares the type.

deceze
  • 471,072
  • 76
  • 664
  • 811
  • 3
    +1 comparing against the immutable type instead of the mutable `undefined` – Sky Sanders Apr 20 '10 at 06:58
  • 2
    This alone cannot distinguish between `[undefined][0]` and `[][0]`. If there's any chance that your array could be empty, you will likely encounter this scenario. – sighrobot Mar 15 '16 at 19:31
14

You are checking it the array index contains a string "undefined", you should either use the typeof operator:

typeof predQuery[preId] == 'undefined'

Or use the undefined global property:

predQuery[preId] === undefined

The first way is safer, because the undefined global property is writable, and it can be changed to any other value.

Christian C. Salvadó
  • 723,813
  • 173
  • 899
  • 828
8
predQuery[preId]=='undefined'

You're testing against the string 'undefined'; you've confused this test with the typeof test which would return a string. You probably mean to be testing against the special value undefined:

predQuery[preId]===undefined

Note the strict-equality operator to avoid the generally-unwanted match null==undefined.

However there are two ways you can get an undefined value: either preId isn't a member of predQuery, or it is a member but has a value set to the special undefined value. Often, you only want to check whether it's present or not; in that case the in operator is more appropriate:

!(preId in predQuery)
bobince
  • 498,320
  • 101
  • 621
  • 807
4

There are more (many) ways to Rome:

//=>considering predQuery[preId] is undefined:
predQuery[preId] === undefined; //=> true
undefined === predQuery[preId] //=> true
predQuery[preId] || 'it\'s unbelievable!' //=> it's unbelievable
var isdef = predQuery[preId] ? predQuery[preId] : null //=> isdef = null

cheers!

KooiInc
  • 104,388
  • 28
  • 131
  • 164
2

Check for

if (predQuery[preId] === undefined)

Use the strict equal to operator. See comparison operators

rahul
  • 174,563
  • 47
  • 223
  • 254
  • 1
    almost - but best practice is as deceze says, compare typeof because that cannot be redefined as undefined can be. – Sky Sanders Apr 20 '10 at 06:57
  • 1
    Not foolproof, as undefined can be defined. Simply with `window.undefined="lolz";` – Warty Apr 20 '10 at 06:58
  • 5
    It's impossible to write JavaScript that guards against every builtin being redefined (almost anything can be). I don't advocate making code less readable just to avoid redefinitions. `typeof` does have another use, to detect datatypes in cross-window scripting, but that doesn't apply to `undefined` anyway. – bobince Apr 20 '10 at 07:47
  • ES5 enforces `undefined` as readonly. – Warty Aug 11 '18 at 01:25
2

try: typeof(predQuery[preId])=='undefined'
or more generally: typeof(yourArray[yourIndex])=='undefined'
You're comparing "undefined" to undefined, which returns false =)

Warty
  • 6,709
  • 1
  • 26
  • 47
1

This code works very well

function isUndefined(array, index) {
    return ((String(array[index]) == "undefined") ? "Yes" : "No");
}
Farside
  • 8,130
  • 2
  • 41
  • 55