你不知道的 JavaScript 系列中, 13 - 特殊数值 零值

JavaScript 有一个常规的 0 和一个 -0

var a = 0/-3; // -0
var b = 0*-3; // -0

负零进行字符串转化会返回 0;

(-0).toString(); // 0
-0 + ''; // 0
String(-0); // 0
JSON.stringify(-0); // 0

有意思的是,如果反过来将其从字符串转化为数字,得到的结果是准确的:

+'-0'; // -0
Number('-0'); // -0
JSON.parse('-0'); // -0

负零转化为字符串的结果令人费解,比较操作也是如此

-0 === 0; // true
0 > -0; // false

抛开学术上的繁枝褥节,我们为什么需要负零呢?

有些应用程序中的数据需要以级数形式来表示(比如动画帧的移动速度),数字的符号位用来代表其他信息(比如移动的方向)。此时如果一个值为 0 的变量失去了它的符号位,它的方向信息就会丢失。所以保留 0 的符号位可以防止这类事情发生