views:

177

answers:

3

I'm doing some experimenting with this malicious JavaScript line: var undefined = true;

Every uninitialized variable in JavaScript has the value of undefined which is just a variable that holds the special value of 'undefined', so the following should execute the alert:

var undefined = true, 
    x;

if (x) {
    alert('ok');
}

But it doesn't, and my question is why?

On further experimentation, I tried the following:

var undefined = true, 
    x = undefined;

if (x) {
    alert('ok');
}

This time, the alert is executed.

So my question is...since in the first snippet x holds undefined (because it is not initialized), why didn't the alert execute? The strange thing is that when explicitly stating that x is undefined (x = undefined), the alert executed...

A: 

Just declaring a variable called "undefined" does not mean that you're overriding the built-in concept of what the native "undefined" value is.

Imagine if Java would let you use "null" as an identifier. Well, I guess Java doesn't have the same coercion as Javascript. Anyway the Javascript statement

if (x) alert("foo");

involves an implicit coercion of the value of "x" to boolean. The value isn't defined, so its coercion to "boolean" results in false.

Pointy
@Andreas Grech - Bizarrely, `"\n\t" == true` is also actually `false`.
JulianR
Actually, the concept of true in JavaScript is every value except null, undefined, the empty string '', `NaN`, `0` and `false`
Andreas Grech
+10  A: 

There is a difference between a variable named undefined and the value called undefined.

var undefined = true, 
    x;

In this example, the variable undefined is set to the value true, and x to the value (not the variable!) undefined.

var undefined = true, 
    x = undefined;

In this example, the variable undefined is set to the value true as well, and x is set to the value contained in the variable undefined (which is true).

So, while you can declare a variable named undefined, you cannot change the fact that non-initialized variables are set to the value undefined.

dtb
Hehe; what would happen if the variable `undefined` was the value `undefined`?
Pindatjuh
@Pindatjuh: the same as if the variable had any other name. There is nothing special about a variable named `undefined`.
dtb
A: 

Uninitialized variables get the special value undefined. When you assign a variable to another variable you're giving it a string that references a variable you've defined within the current scope. In this case you've defined a variable named undefined so the JavaScript engine will look first through the variables, see that you've named one undefined and then assign it that variable.

Bob