负零是假值吗?
Is minus zero a falsy value?
我还没有在 Javascript 中找到任何关于虚假值的讨论或文章,其中提到负零,而我看到 !!-0
产生 false
。这是为什么?
更新:
我现在认为大多数总结虚假值的作者要么不知道 -0
是一个值,要么不知道 0
+0
和 -0
.
原因如下:
这里的-0是先计算出来的。它不会只计算负号本身,因此它包括数字。然后输出 0
然后是运行通过!
运算符两次。第一个 !
运算符将 0
转换或解析为布尔值,然后反转或伪造布尔值。
!0
returns true
第二个再次反转它,返回 false
这是个很好的问题。 Javascript 确实区分 -0.0 和 0.0。 (IEEE754 也是如此。)
我们可以通过以下方式进行测试:
var X = -0.0; X
-> "-0"
所以它是一个不同于 0.0 的值。
`!-0.0` -> true
所以你是对的,虚假值列表也应该明确列出 -0.0。
可能他们没有列出它是因为:
0.0 === -0.0 -> true
然而,如果我们认为 javascript 在某些关系中不一致(例如非传递),这不是一个好的理由。
简单地说,the ECMAScript specification表示-0
的布尔转换结果为false
。这在抽象操作 ToBoolean
的 table 转换中说明,第 7.1.2 节。
If argument is +0, -0, or NaN, return false; otherwise return true.
我还没有在 Javascript 中找到任何关于虚假值的讨论或文章,其中提到负零,而我看到 !!-0
产生 false
。这是为什么?
更新:
我现在认为大多数总结虚假值的作者要么不知道 -0
是一个值,要么不知道 0
+0
和 -0
.
原因如下:
这里的-0是先计算出来的。它不会只计算负号本身,因此它包括数字。然后输出 0
然后是运行通过!
运算符两次。第一个 !
运算符将 0
转换或解析为布尔值,然后反转或伪造布尔值。
!0
returns true
第二个再次反转它,返回 false
这是个很好的问题。 Javascript 确实区分 -0.0 和 0.0。 (IEEE754 也是如此。) 我们可以通过以下方式进行测试:
var X = -0.0; X
-> "-0"
所以它是一个不同于 0.0 的值。
`!-0.0` -> true
所以你是对的,虚假值列表也应该明确列出 -0.0。
可能他们没有列出它是因为:
0.0 === -0.0 -> true
然而,如果我们认为 javascript 在某些关系中不一致(例如非传递),这不是一个好的理由。
简单地说,the ECMAScript specification表示-0
的布尔转换结果为false
。这在抽象操作 ToBoolean
的 table 转换中说明,第 7.1.2 节。
If argument is +0, -0, or NaN, return false; otherwise return true.