Is null considered zero and undefined not a number on arithmetic expressions?

后端 未结 3 1562
离开以前
离开以前 2020-12-17 10:45

Is null evaluated to 0 and undefined to NaN on arithmetic expressions?

According to some testing it seems so:

相关标签:
3条回答
  • 2020-12-17 11:02

    Is null evaluated to 0 and undefined to NaN on arithmetic expressions? Is it safe or correct to assume this?

    Yes, it is. An "arithmetic expression" would use the ToNumber operation:

     Argument Type | Result
     --------------+--------
     Undefined     | NaN
     Null          | +0
     …             |
    

    It is used in the following "arithmetic" expressions:

    • prefix/postfix increment and decrement
    • the unary + and - operators
    • the + operator if none of the two arguments is a string
    • subtraction, multiplication, division and modulo operation
    • relational operators if not both arguments are strings

    It is not used by the equality operators, so null == 0 is false (and null !== 0 anyway)!

    0 讨论(0)
  • 2020-12-17 11:16

    Without being type bound,

    null == false == 0
    
    null !== false !== 0
    

    http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN#0_6

    With that said, null == 0, null + 4 = 4

    I hope this helps.

    0 讨论(0)
  • 2020-12-17 11:19

    It seems safe to assume so since, in an arithmetic expression (e.g. addition), the method ToNumber would be called on it, evaluating NaN and +0 from undefined and null respectively:

                         To Number Conversions
    ╔═══════════════╦════════════════════════════════════════════╗
    ║ Argument Type ║                   Result                   ║
    ╠═══════════════╬════════════════════════════════════════════╣
    ║ Undefined     ║ NaN                                        ║
    ║               ║                                            ║
    ║ Null          ║ +0                                         ║
    ║               ║                                            ║
    ║ Boolean       ║ The result is 1 if the argument is true.   ║
    ║               ║ The result is +0 if the argument is false. ║
    ║               ║                                            ║
    ║ Number        ║ The result equals the input argument (no   ║
    ║               ║ conversion).                               ║
    ║               ║                                            ║
    ║ String        ║ See grammar and note below.                ║
    ║               ║                                            ║
    ║ Object        ║ Apply the following steps:                 ║
    ║               ║   1. Let primValue be ToPrimitive(input    ║
    ║               ║      argument, hint Number).               ║
    ║               ║   2. Return ToNumber(primValue).           ║
    ╚═══════════════╩════════════════════════════════════════════╝
    

    ECMAScript Language Specification - ECMA-262 Edition 5.1

    0 讨论(0)
提交回复
热议问题