Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why 'NaN' and 'Undefined' are not reserved keywords in JavaScript?

We can do:

NaN = 'foo'

as well as

undefined = 'foo'

Why are they not reserved keywords?

Edit 1 (downvoters):

  1. I think it should be implemented in order to be sure that when we are looking for a number, it is a number :)

  2. If we should use IsNaN() or typeof, why are NaN or undefined needed?

like image 771
JohnJohnGa Avatar asked Aug 24 '11 10:08

JohnJohnGa


2 Answers

I cannot tell you why, but undefined and NaN are actually properties of the global object:

15.1.1 Value Properties of the Global Object

15.1.1.1 NaN
The value of NaN is NaN (see 8.5). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
(...)
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

There is a difference between the value undefined (NaN) and the corresponding property.

You might notice the [[Writable]]: false. I'm not sure whether this new in ES5 (and might not be adapted by all browsers), but in newer browsers (tested in Firefox 6), assigning a new value to undefined has no effect:

[12:28:15.090] < undefined = "foo"
[12:28:15.093] > "foo"
[12:28:19.882] < undefined
[12:28:19.883] > undefined

So although it seems you can assign a new value, you actually cannot.


Why they are not reserved keywords?

Not sure if there was a specific reason to not make them reserved keywords, but it was decided against it. The language still works. You cannot override these values, so it's fine.

The only way to test whether a number is NaN, is to use isNaN() anyway.

like image 156
Felix Kling Avatar answered Oct 26 '22 11:10

Felix Kling


https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

NaN is a property of the global object.

The initial value of NaN is Not-A-Number — the same as the value of Number.NaN. In modern browsers, NaN is a non-configurable, non-writable property. Even when this is not the case, avoid overriding it.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined

undefined is a property of the global object, i.e. it is a variable in global scope.

The initial value of undefined is the primitive value undefined.

like image 30
ipr101 Avatar answered Oct 26 '22 11:10

ipr101