【发布时间】:2010-05-26 06:19:32
【问题描述】:
我必须编写一个例程,如果变量的类型为 number,则将其值加 1,如果不是,则将 0 分配给变量,其中变量最初为 null 或 undefined。
第一个实现是v >= 0 ? v += 1 : v = 0,因为我认为任何不是数字的东西都会使算术表达式为假,但这是错误的,因为null >= 0 被评估为真。然后我了解到null 的行为类似于 0,并且以下表达式都被评估为 true。
null >= 0 && null <= 0!(null < 0 || null > 0)null + 1 === 11 / null === InfinityMath.pow(42, null) === 1
当然,null 不是 0。null == 0 被评估为假。这使得看似重言式的表达(v >= 0 && v <= 0) === (v == 0) 为假。
为什么null 像0,虽然它实际上不是0?
【问题讨论】:
-
他在谈论 Javascript。您的示例在 PHP 中。在 PHP 中 operator== 以一种特殊的方式比较值。您可以进行一些非常疯狂的比较,例如“10”==“1e1”(这是真的)。如果你使用 operator===,你会得到一个完全不同的结果,因为它会检查类型是否匹配以及值是否匹配。查看此链接:php.net/manual/en/language.operators.comparison.php
-
PHP '==' 运算符确实以“特殊”方式工作。
-
如果您的要求是从 1 而不是 0 开始计数,那么有一种非常简洁的方法可以增加最初为
null或undefined的计数器:c = -~c // Results in 1 for null/undefined; increments if already a number -
undefined是一个变量值,用于未初始化的变量。另一方面,null是一个空对象值,不应与数字混合。null不应与数字组合,因此 null 不应表现得像数字。 -
@AtesGoral - 简洁,但不明显。值得提醒人们,每当做一些不明显的事情时,请添加注释来解释代码的作用。在大多数情况下,我会认为这是一种“过早的优化”,因为它会用清晰度换取微小的性能提升。
标签: javascript null comparison equality