在算术表达式中,null被视为零,而undefined不是数字吗?

20

null 在算术表达式中是否被解释为 0undefined 是否被解释为 NaN

根据一些测试结果看起来是这样的:

> null + null
0

> 4 + null
4

> undefined + undefined
NaN

> 4 + undefined
NaN

假设这样做安全可靠吗?(如果有文档引用的话那就更好了)。


4
规范。 - Pointy
2
就像一个拿着十支火把的杂耍者一样安全。如果他确切知道自己在做什么,那么就是安全的。 - Luca Rainone
1
@talles 它是完全相同的运算符 - + - Pointy
1
@Pointy,仅仅因为是相同的字符,并不意味着它们是相同的运算符。string + <thing> 是字符串连接,而 int + <thing> 是整数加法。 - Brian S
1
@BrianS 嗯,显然操作是不同的;我的观点是规范中描述的过程决定了涉及该运算符的表达式的含义。换句话说,表达式语法不区分数字加法和字符串连接。 - Pointy
显示剩余6条评论
3个回答

16
“null”在算术表达式中会被转换为0,“undefined”则会被转换为NaN。可以安全地假设如此。 “算术表达式”将使用ToNumber操作
 Argument Type | Result
 --------------+--------
 Undefined     | NaN
 Null          | +0
 …             |

它用于以下“算术”表达式中: 它不被equality运算符使用,所以null == 0是false(而且null !== 0)!

5
在算术表达式中(例如addition),可以安全地假设会调用ToNumber方法,并从undefinednull分别计算出NaN+0。请注意,保留HTML标记。
                     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语言规范 - ECMA-262第5.1版


1
请注意,如果+另一个操作数是字符串,则会调用ToString并执行字符串连接。因此,null + "hello"是字符串"nullhello" - Pointy

1

我认为可以说:请不要在标准操作中依赖null。虽然在JS中可以使用,但这是非常糟糕的做法。 - aaron-bond
我完全同意,这严格来说是一种非类型绑定语言的缺陷或优势,这取决于你如何看待它。 - Churk
是的,这很可能取决于你开始的地方。如果你从一种更结构化的语言转到JS,想以那种方式使用它会让人感到可怕。如果你从JS开始,你会接触到一种结构化语言,并想知道为什么不能做所有有用的事情! - aaron-bond
使用非严格相等运算符false == 0,虽然false0不相等,但它们都不等于null。你试过了吗? - Bergi
链接似乎已经损坏。 - Stephen Turner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接