isNaN(null) == false

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Java script Dude

    isNaN(null) == false

    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

  • Thomas 'PointedEars' Lahn

    #2
    Re: isNaN(null) == false

    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
    --
    var bugRiddenCrashP ronePieceOfJunk = (
    navigator.userA gent.indexOf('M SIE 5') != -1
    && navigator.userA gent.indexOf('M ac') != -1
    ) // Plone, register_functi on.js:16

    Comment

    • AKS

      #3
      Re: isNaN(null) == false

      On Jan 16, 9:57 am, Thomas 'PointedEars' Lahn <PointedE...@we b.de>
      wrote:
      My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
      is called by ToNumber(ToPrim itive(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.

      Comment

      • morbidKK

        #4
        Re: isNaN(null) == false

        On Jan 16, 11:08 am, AKS <aksus...@yande x.ruwrote:
        On Jan 16, 9:57 am, Thomas 'PointedEars' Lahn <PointedE...@we b.de>
        wrote:
        >
        My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
        is called by ToNumber(ToPrim itive(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

        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

        Comment

        • Thomas 'PointedEars' Lahn

          #5
          Re: isNaN(null) == false

          AKS wrote:
          [...] Thomas 'PointedEars' Lahn [...] wrote:
          >My guess would be that ToNumber(null.[[DefaultValue]](hint=Number)) that
          >is called by ToNumber(ToPrim itive(null, hint=Number)) that is called by
          >ToNumber(nul l) 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
          --
          realism: HTML 4.01 Strict
          evangelism: XHTML 1.0 Strict
          madness: XHTML 1.1 as application/xhtml+xml
          -- Bjoern Hoehrmann

          Comment

          • AKS

            #6
            Re: isNaN(null) == false

            On 16 ÑÎ×, 15:48, Thomas 'PointedEars' Lahn <PointedE...@we b.de>
            wrote:
            >šHowever, the specified ToNumber() algorithm for an argument of
            type Object ...
            Argument of type Object??? The null value has the same (null) type.

            Comment

            • Thomas 'PointedEars' Lahn

              #7
              Re: isNaN(null) == false

              AKS wrote:
              [...] Thomas 'PointedEars' Lahn [...] wrote:
              > However, the specified ToNumber() algorithm for an argument of
              >type Object ...
              >
              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
              --
              Use any version of Microsoft Frontpage to create your site.
              (This won't prevent people from viewing your source, but no one
              will want to steal it.)
              -- from <http://www.vortex-webdesign.com/help/hidesource.htm>

              Comment

              Working...