Math.sign:在 Javascript 中如何检查一个数字是正数还是负数

现在有了 ES6 的 Math.sign 👏,判断一个数字的符号就变得超级简单了,它可以显示出数字是正数、负数还是零。

const positive = 5;
const negative = -5;
const zero = 0;

Math.sign(positive); // 1
Math.sign(negative); // -1
Math.sign(zero); // 0

#Math.sign 返回值

Math.sign() 有 5 个可能的返回值。

1; // positive number
-1; // negative number
0; // positive zero
-0; // negative zero
NaN; // not a number
Math.sign(8); // 1
Math.sign(-8); // -1

Math.sign(0); // 0
Math.sign(-0); // -0

Math.sign(NaN); // NaN
Math.sign('hello'); // NaN
Math.sign(); //NaN

注意,传递给这个函数的参数将被隐式转换为数字类型。

注意 Math.sign 的返回值

一个常见的误区认为 Math.sign 返回转换后的参数值。Math.sign 只返回一个数字的符号。它并不返回值。

Math.sign(-8);

// ✅ return -1
// ❌ It doesn't return -8

#Math.sign 与比较运算符

社区提出一个很好的问题:

既然可以用比较运算符,为什么还要用 Math.sign

if (number > 0) {
  // Positive
} else {
  // Negative
}

相对的:

if (Math.sign(number) > 0) {
  // Positive
} else {
  // Negative
}

实际上,如果你只是检查布尔状态,那么我只需要使用比较运算符,而不是使用 Math.sign。但 Math.sign 的闪光点在于它返回一个数字值。这意味着你可以进行计算。

const number = 5;

number > 0; // true
Math.sign(number); // 1

#用 Math.sign 解决一个算法挑战

于是,它让我解决了这个算法挑战:"反转一个整数"

Input: 123;
Output: 321;

Input: -123;
Output: -321;
function reverseInteger(num) {
  const numArray = Math.abs(num) // Get the absolute value of our number > 321
    .toString() // Convert our number to a string > '321'
    .split('') // Convert our string of numbers to an array > [3, 2, 1]
    .reverse() // Reverse our array of numbers > [1, 2, 3]
    .join(''); // Convert our array back to a string > 123

  const sign = Math.sign(num); // -1
  return numArray * sign;
  // Multiply our reverse string with the sign will produce the correct reverse number
}

reverseInteger(-321); // -123

这道算法题来自于 Leetcode 的《反转整数》。为了简化我们的演示,我把这道题的要求编辑了一下。要看实际的解法,这种解法是来自@loia5tqd001

这其实是我第一次发现这个函数。这也是我喜欢看别人的解决方案的原因。看别人是怎么解决的,总是很有意思。即使解决方法不好,我也会看那些,因为它教我如何避免 😉。没有知识是浪费的 💪。所有这些都是扩展我的工具箱。就像那些机器学习一样,你输入的数据越多,它就越好。我想我的大脑也是这样的。我需要看到很多解决方案,才能让我变得更好 😄

这就是为什么在我的很多花絮中,我都会涉及到不同的解题方法。因为永远没有一个最好的方法。最好的方法总是要看情况而定。你的工具箱越大,你就越有可能找到最好的方法 👍。

#负数零

所以,你可能会注意到 Math.sign 返回了负数零。

Math.sign(0); // 0
Math.sign(-0); // -0

而你的下一个问题是,这个负零到底是什么?在你不懂 JS 的 Kyle Simpson 解释得最清楚。

现在,除了学术上的琐事,我们为什么要用负零呢?

在某些应用中,开发人员用一个值的大小来表示一个信息(比如每帧动画的运动速度),并使用这个数字的符号来表示另一个信息(比如运动的方向)。

在这些应用中,举一个例子,如果一个变量到达零点时就失去了符号,那么在它到达零点之前,你就会失去它移动方向的信息。保留零的符号可以防止潜在的不需要的信息丢失。

引自:YDKJS - Type & Grammer - Zeros

#Math.sign 浏览器支持

对所有现代浏览器的支持都很不错。可惜的是,Internet Explorers 太时髦了,不能跟其他人一起玩耍,所以不支持该方法。

MDN 上关于 Math.sign 浏览器支持表

#IE 的代码花絮

但不用担心,这里有一个代码片段可供选择。这段代码可以在 IE 浏览器和老版本的浏览器上使用 👍。

const positive = 5;
const negative = -5;
const zero = 0;

positive === 0 ? positive : positive > 0 ? 1 : -1; // 1
negative === 0 ? negative : negative > 0 ? 1 : -1; // -1
zero === 0 ? zero : zero > 0 ? 1 : -1; // 0

#Math.sign 填充

或者继续使用 Math.sign,仅仅需要添加 MDN 的填充代码

if (!Math.sign) {
  Math.sign = function(x) {
    return (x > 0) - (x < 0) || +x;
  };
}

#资源参考