实现一个 isNegtiveZero 函数,只检查 +0 和 -0,-0 返回 true ,+0 返回 false
解析:
在 JavaScript 中,Number 是一种定义为 64 位双精度浮点型的数字类型,首先是符号位,然后是 52 的整数位和 11 位 的小数位。如果符号位为 1,其它各位均为 0,那么这个数值会被表示为 “-0”。
所以 JavaScript 的 "0" 值有两个 +0 和 -0。
解题思路:
1、看到 +0 和 -0 ,大概想尝试把该数字通过 toString() 方法转换成字符串,再使用 indexOf('-') 判断是否等于 0 ,或者 charAr(0) 判断是否等于 "-"。很不幸,数值在调用 toString() 方法时就自动将 -0 转换成 0 了。所以此方法行不通。
2、可以尝试另一个思路,计算机在进行四则及与或模等数值运算时,符号本身也参与运算,JavaScript 也是如此,而使用 0 对一数做加减操作对本身是无影响的,乘法虽然得到 +- 0 的结果,但是又回到了问题本身 +- 0 的判断了,因此我们可以考虑除法,加上数值本身有 Infinity 和 -Infinity 的区分,分别表示正无穷和负无穷,我们很容易想到可以使用一个数值来除以 +-0 得到 +-Infinity。我们使用 -1/0 或 1/-0 得到 -Infinity 的结果。
3、同样的,JavaScript 提供了很多函数供你使用,但结果不外乎借助一个数值进行判断。如:
Math.pow(-0,-1) === -Infinity,
Math.atan2(-0,-1) === -Math.PI
答案:
1、利用 +-Infinity
function isNegtiveZero(num){
if(num !== 0){
throw RangeError("the arguments must be +0 or -0");
}
return 1/num === -Infinity;
}
2、ECMAScript2015 添加了一个方法 Object.is 用于对数值进行比较,可以用于比较 +-0
Object.is(+0,0); //true
Obect.is(-0,0); //false
function isNegtiveZero(num){
if(num !== 0){
throw RangeError("the arguments must be +0 or -0");
}
return !Object.is(num,0);
}