NOTE: As per ECMAScript5.1, section 15.1.1.3, window.undefined is read-only.
- Modern browsers implement this correctly. for example: Safari 5.1, Firefox 7, Chrome 20, etc.
- Undefined is still changeable in: Chrome 14, ...
When I recently integrated Facebook Connect with Tersus, I initially received the error messages Invalid Enumeration Value
and Handler already exists
when trying to call Facebook API functions.
It turned out that the cause of the problem was
object.x === undefined
returning false when there is no property 'x' in 'object'.
I worked around the problem by replacing strict equality with regular equality in two Facebook functions:
FB.Sys.isUndefined = function(o) { return o == undefined;};
FB.Sys.containsKey = function(d, key) { return d[key] != undefined;};
This made things work for me, but seems to hint at some sort of collision between Facebook's JavaScript code and my own.
What could cause this?
Hint: It is well documented that undefined == null
while undefined !== null
. This is not the issue here. The question is how comes we get undefined !== undefined
.
I'd like to post some important information about
undefined
, which beginners might not know.Look at the following code:
If you run this code, where variable
a
HAS NEVER BEEN DECLARED usingvar
, you will get an ERROR EXCEPTION and surprisingly see no alerts at all.Instead of 'Doing important job below', your script will TERMINATE UNEXPECTEDLY, throwing unhandled exception on the very first line.
Here is the only bulletproof way to check for
undefined
usingtypeof
keyword, which was designed just for such purpose:This method works in all possible cases.
The last argument to use it is that
undefined
can be potentially overwritten in earlier versions of Javascript:Hope I was clear enough.
A). I never have and never will trust any tool which purports to produce code without the user coding, which goes double where it's a graphical tool.
B). I've never had any problem with this with Facebook Connect. It's all still plain old JavaScript code running in a browser and
undefined===undefined
wherever you are.In short, you need to provide evidence that your object.x really really was undefined and not null or otherwise, because I believe it is impossible for what you're describing to actually be the case - no offence :) - I'd put money on the problem existing in the Tersus code.
That's a bad practice to use the
==
equality operator instead of===
.The
object.x === undefined
should returntrue
ifx
is unknown property.In chapter Bad Parts of JavaScript: The Good Parts, Crockford writes the following:
The problem is that undefined compared to null using == gives true. The common check for undefined is therefore done like this:
this ensures the type of the variable is really undefined.
From - JQuery_Core_Style_Guidelines
Global Variables:
typeof variable === "undefined"
Local Variables:
variable === undefined
Properties:
object.prop === undefined