【第1913期】Math.sign:在Javascript中如何检查一个数字是正数还是负数
前言
你输入的越多,你的解决问题的工具箱就越丰富。今日早读文章由@排骨翻译投稿,Gitlab@samanthaming授权分享。
正文从这开始~~
现在有了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 Gotcha
一个常见的误区是认为Math.sign返回转换后的参数值。Math.sign只返回一个数字的符号。它并不返回值。
Math.sign(-8);
// ✅ return -1
// ❌ It doesn't return -8
Math.sign vs 比较
社区里提出了一个很好的问题:
既然可以用比较运算符,为什么还要用Math.sign?
if (number > 0) {
// Positive
} else {
// Negative
}
versus
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返回的是负数0。
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 Polyfill
或者继续使用Math.sign,只需从MDN中添加这个Polyfill就可以了
f (!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
Math.sign MDN Polyfill
Stack Overflow: How to check the value given is a positive or negative integer?
Stack Overflow: JS Negative Number
为你推荐