繁体   English   中英

JavaScript - 为什么(0 || -0)返回-0

[英]JavaScript - Why does (0 || -0) return -0

我测试了以下代码0 || -0 Chrome开发者控制台中 0 || -0 ,我得到了-0 ,因此我正在试图找出原因。 此表表示不同JS环境中的结果。

╔══════════════════════════════════════════════════════╗
║ Browser                  ║ Version         ║ 0 || -0 ║
╠══════════════════════════════════════════════════════╣
║Internet Explorer 11      ║ 11.3024.14393.0 ║    0    ║
║Google Chrome             ║ 75.0.3770.100   ║   -0    ║
║Mozilla Firefox (Quantum) ║ 67.0.4          ║   -0    ║
║Microsoft Edge (Chromium) ║ 77.0.197.1      ║   -0    ║
║Microsoft Edge (Chakra)   ║ 44.17763.1.0    ║    0    ║
║Node.js                   ║ 11.1.0          ║   -0    ║
╚══════════════════════════════════════════════════════╝

我的假设是,在第一种情况下,当-0在右侧时,结果为-0 ,但是当它在左侧时,结果为0 这让我相信当二进制逻辑OR操作期间-0在左侧时,符号位被丢弃(无论出于何种原因)并且执行操作,如此0 || 0 0 || 0 而当它在右侧时,因为-运算符存在,它可能在数字上添加了一个符号位,这导致右侧数字有一个额外的位,导致返回右侧值。

更有趣的是,当你使用正数时,行为是不同的。 现在-1 || 4 -1 || 4返回-1 ,而4 || -1 4 || -1返回44 || -1 || 6 4 || -1 || 6 4 || -1 || 6返回4 (不应该返回6 )。 这种行为是由-运算符引起的还是因为我在开发人员控制台中测试此代码?

根据官方规范, a || b a || b评估a a是否真实,或b如果a是假的。 &&以类似的方式工作 - 如果只通过检查左侧的值来确定整个表达式的值,它将评估到左侧,否则将评估到右侧。

MDN

逻辑OR(||)

expr1 || expr2

如果expr1可以转换为true,则返回expr1; 否则,返回expr2。

因为0-0都是假的, 0 || -0 0 || -0 应该评估为-0 ,因为左侧是假的。

相比要比其他号码0 / -0会有不同的效果,因为其他非零数字是不是falsey(除了NaN )。

也许IE和Edge-Chakra只是忽略0-0之间的差异,并且无论如何都显示0 例如,如果在IE的控制台中键入-0 ,则结果为0不是 -0 ):

在此输入图像描述

Edge做同样的事情:

在此输入图像描述

不过,差异可能只是纯粹的视觉效果。 以下代码段在Edge中按预期打印truefalse

 const x = -0; console.log(Object.is(x, -0)); console.log(Object.is(x, 0)); 

二进制逻辑OR ”可能是假设出现问题的地方:有位/二进制或| ,查看二进制数字的数字,以及逻辑或, || ,将每个操作数视为单个真/假值,因此它们是相当不同的。

你有后一个,这就是为什么你得到一个确切的输入而不是它们的“组合”。 这在-1特别明显,因为在两个组件代码中它是111...1111 (在涉及按位操作的情况下是JavaScript的32个 ),因此二进制或任何东西只是再现-1 但是如果是逻辑或者,你将第一个操作数保持不变,如果它是'true-ish',或者你得到第二个操作数,则再次保持不变。

(当然,在另一个答案中描述的带有-0的MS事物肯定会增加一些混淆,但它发生在之前,并且独立于逻辑运算)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM