Javascript: "-0" 是什么意思?

9

这只是一个教育性问题。

我正在开发一款新版本的网络应用程序,这是我们公司早期制作的应用程序。在重写数学方面时,我遇到了这个问题:

document.getElementById("estResidual").value-0;

当我尝试计算时,我认为“-0”没有用处,于是将其删除。但是数字的值偏差非常大。然后我尝试重新添加“-0”,嘿!一切都很好地解决了。

问题: “-0”是如何改变这个值的?


1
注意 - 当您使用 + 0 时,它可能仍然看起来像连接。减号不会引起混淆。 - Floris
1
@Floris - 刚刚重新读了一遍你的评论,意识到了这一点...所以我删除了我的。 :) - Steve
3个回答

19

这是对JavaScript软类型行为的滥用。在这种情况下,它会将一个字符串转换为浮点数:

> "13"
"13"
> "13"-0
13
> "1.01"-0
1.01

一元+也会做同样的事情:

> +"13"
13
> +"9.9"
9.9
请注意,使用 + 会将整数 0 转换为字符串并将其拼接起来:
> "13"+0
"130"

这些都是标准化的。如需了解这些运算符的详细行为,请查看ECMAScript语言规范(例如,加法减法一元正号)。


为什么要说“滥用”呢?学习使用语言的不同方式肯定是有益的,不是吗?或者由于编写不规范代码可能会出现问题的容易性,这是最好避免的做法吗? - DanTheMan
6
@DanTheGameMan说:我个人不喜欢这个,因为它的意图根本不明显。毕竟,你不得不在stackoverflow上询问它的作用=)。然后看到-0有效,你可能会期望+0以相同的方式工作,考虑到算术性质,但那会给你完全不同的结果!我建议使用parseInt()parseFloat() - Claudiu
2
parseFloat 看起来运行得很好,而且它确实更清晰地说明了正在发生的事情。 - DanTheMan

1
JS引擎会动态地重新转换数据类型以使语句正常工作。因此,当您尝试进行数学运算时,JS会将字符串"23"转换为整数23,同样地,如果您执行以下操作,它也会将整数23转换为字符串"23":
var a = 23;
console.log(23 + "asdf");
//outputs "23asdf"

1
这并不是一个静态类型问题。一个静态类型语言也可能有这种行为,其中表达式<string> - <integer>的类型将是<integer> - Claudiu

1
这会强制将对象类型转换为数字而不是字符串。

克劳迪乌的回答比我的好多了。 - Charles380

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