isNaN(null) == false

J

Java script Dude

Small glitch (IMHO) in JavaScript is related to isNaN() boolean
function. If passed a null, it returns true which is incorrect.

This one cause me quite a bit of grief until I detected it and was
able to code around it.

Anybody know the reasoning for the result being false and not true for
isNaN(null).

- JsD
 
T

Thomas 'PointedEars' Lahn

Java script Dude wrote:
^^^^^^^^^^^^^^^^
Nomen est omen? One ECMAScript implementation that is discussed here
is called _JavaScript_ and does not have anything to do with Java.
Small glitch (IMHO) in JavaScript is related to isNaN() boolean
function. If passed a null, it returns true which is incorrect.

It is not a glitch and it is correct, not only because it is specified so
but because `null' is definitely not (interpretable as) a number since it is
"a primitive value that represents the null, empty, or non-existent
reference." (ES3 Final, 4.3.11)
This one cause me quite a bit of grief until I detected it and was
able to code around it.

It is always best if you know what you are doing.
Anybody know the reasoning for the result being false and not true for
isNaN(null).

| 15.1.2.4 isNaN (number)
|
| Applies ToNumber to its argument, then returns true if the result is NaN,
| and otherwise returns false.

See my previous posting for the definition of ToNumber() and the equals
operator (`==').


PointedEars
 
T

Thomas 'PointedEars' Lahn

Thomas 'PointedEars' Lahn wrote/zu Deiner Priorität-Alpha-1-Nachricht von
Sternzeit 16.01.2008 05:24:
Java script Dude wrote:
^^^^^^^^^^^^^^^^
Nomen est omen? One ECMAScript implementation that is discussed here
is called _JavaScript_ and does not have anything to do with Java.


It is not a glitch and it is correct, not only because it is specified so

See the evaluation on the bottom.
but because `null' is definitely not (interpretable as) a number since it is
"a primitive value that represents the null, empty, or non-existent
reference." (ES3 Final, 4.3.11)

Ignore that; you have confused me with saying `false' in the header, `true'
here and `false' below. isNaN(null) returns _false_.
[...]
Anybody know the reasoning for the result being false and not true for
isNaN(null).

| 15.1.2.4 isNaN (number)
|
| Applies ToNumber to its argument, then returns true if the result is NaN,
| and otherwise returns false.

My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
is called by ToNumber(ToPrimitive(null, hint=Number)) that is called by
ToNumber(null) throws an exception and so there is no result for the latter
call, and no result means that `false' is returned from the method:

isNaN(null)
= ToNumber(null)
= ToNumber(ToPrimitive(null, hint=Number))
= ToNumber(null.[[DefaultValue]](hint=Number))

1. null.[[Get]]("valueOf")
1. typeof null.valueOf == "undefined".
...
4. null.[[Prototype]] == null
return undefined
2. typeof undefined != "object"
....
5. null.[[Get]]("toString")
1. typeof null.value == "undefined".
...
4. null.[[Prototype]] == null
return undefined
6. typeof undefined != "object"
....
9. throw TypeError

return false


PointedEars
 
T

Thomas 'PointedEars' Lahn

Thomas said:
It is not a glitch and it is correct, not only because it is specified
so

See the evaluation on the bottom.
but because `null' is definitely not (interpretable as) a number since
it is "a primitive value that represents the null, empty, or
non-existent reference." (ES3 Final, 4.3.11)

Ignore that; you have confused me with saying `false' in the header, `true'
above and `false' below. isNaN(null) returns _false_, which would be
consistent with `null' being convertible to 0.
[...]
Anybody know the reasoning for the result being false and not true
for isNaN(null).

| 15.1.2.4 isNaN (number) | | Applies ToNumber to its argument, then
returns true if the result is NaN, | and otherwise returns false.

My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
is called by ToNumber(ToPrimitive(null, hint=Number)) that is called by
ToNumber(null) throws an exception and so there is no result for the latter
operation, and no result means that `false' is returned from the method:

isNaN(null)
= ToNumber(null)
= ToNumber(ToPrimitive(null, hint=Number))
= ToNumber(null.[[DefaultValue]](hint=Number))

1. null.[[Get]]("valueOf")
1. null.valueOf does not exist
...
4. null.[[Prototype]] == null
return undefined
2. Type(undefined) != Object
....
5. null.[[Get]]("toString")
1. null.toString does not exist
...
4. null.[[Prototype]] == null
return undefined
6. Type(undefined) != Object
....
9. throw TypeError

return false


PointedEars
-- Anyone who slaps a 'this page is best viewed with Browser X' label on a
Web page appears to be yearning for the bad old days, before the Web, when
you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee
 
A

AKS

My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
is called by ToNumber(ToPrimitive(null, hint=Number)) that is called by
ToNumber(null) throws an exception and so there is no result for the latter
operation, and no result means that `false' is returned from the method:

Why do you think that -toPrimitive- is needed? Null is primitive.
 
M

morbidKK

My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
is called by ToNumber(ToPrimitive(null, hint=Number)) that is called by
ToNumber(null) throws an exception and so there is no result for the latter
operation, and no result means that `false' is returned from the method:

Why do you think that -toPrimitive- is needed? Null is primitive.
These are some good questions on the same topic .....

Is true or false ?

1) NaN == NaN -->
2) null == undefined -->
3) false==0 -->
4) false===0 -->
5) "5"==5 -->
"5"===5 -->

Just try to answer all these

some more simple but good question here
http://ketankhairnar.blogspot.com/2007/02/sample-javascript-test.html
Anyways to get clear idea.. read below
This is the text from the Wrox: Profession JavaScript book

When performing conversions, follow these basic rules:
â‘ If an operand is a Boolean value, convert it into a numeric value
before checking for equality.
A value of false converts to 0; whereas a value of true converts to 1.
â‘ If one operand is a string and the other is a number, attempt to
convert the string into a number
before checking for equality.
â‘ If one operand is an object and the other is a string, attempt to
convert the object to a string
(using the toString() method) before checking for equality.
â‘ If one operand is an object and the other is a number, attempt to
convert the object to a number
before checking for equality.

The operators also follow these rules when making comparisons:
â‘ Values of null and undefined are equal.
â‘ Values of null and undefined cannot be converted into any other
values for equality checking.
â‘ If either operand is NaN, the equal operator returns false and the
not equal operator returns
true. Important note: Even if both operands are NaN, the equal
operator returns false because,
by rule, NaN is not equal to NaN.
â‘ If both operands are objects, then the reference values are
compared. If both operands point to
the same object, then the equal operator returns true. Otherwise, the
two are not equal.
The following table lists some special cases and their results:

Expression Value
--------------------------
null == undefined true
“NaN†== NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
“5†== 5 true
 
T

Thomas 'PointedEars' Lahn

AKS said:
My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
is called by ToNumber(ToPrimitive(null, hint=Number)) that is called by
ToNumber(null) throws an exception and so there is no result for the latter
operation, and no result means that `false' is returned from the method:

Why do you think that -toPrimitive- is needed? Null is primitive.

Yes, it is. However, the specified ToNumber() algorithm for an argument of
type Object makes no distinction about whether or not ToPrimitive() actually
needs to be invoked, so that question is moot. Only following the algorithm
to the letter will bring understanding about the observed result.


PointedEars
 
T

Thomas 'PointedEars' Lahn

AKS said:
Argument of type Object??? The null value has the same (null) type.

Ahh, thanks, this is where I went wrong (it *was* late ;-)): I completely
overlooked the row for the Null type. So the explanation is much more
obvious than I thought: isNaN(number) should return `true' if
ToNumber(number) is NaN, `false' otherwise. Since ToNumber(null) returns
+0, which is not NaN, the return value of isNaN(null) is `false'.


Regards,

PointedEars
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,175
Latest member
Vinay Kumar_ Nevatia
Top