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
Number.NaN // not a number
Math.sign(8) // 1
Math.sign(-8) // -1
Math.sign(0) // 0
Math.sign(-0) // -0
Math.sign(Number.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 解释得最清楚。
现在,除了学术上的琐事,我们为什么要用负零呢?
在某些应用中,开发人员用一个值的大小来表示一个信息(比如每帧动画的运动速度),并使用这个数字的符号来表示另一个信息(比如运动的方向)。
在这些应用中,举一个例子,如果一个变量到达零点时就失去了符号,那么在它到达零点之前,你就会失去它移动方向的信息。保留零的符号可以防止潜在的不需要的信息丢失。
Math.sign 浏览器支持
对所有现代浏览器的支持都很不错。可惜的是,Internet Explorers 太时髦了,不能跟其他人一起玩耍,所以不支持该方法。
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
}
}
资源参考
- MDN Web Docs - Math.sign()
- Stack Overflow: Number sign in JavaScript
- Leetcode Solution: Reverse an integer
- Stack Overflow: How to check the value given is a positive or negative integer?
- Stack Overflow: JS Negative Number
本文由 吳文俊 翻译,原文地址 Math.sign: How to Check if a Number is Positive or Negative in JavaScript