vlambda博客
学习文章列表

【第1913期】Math.sign:在Javascript中如何检查一个数字是正数还是负数

前言

你输入的越多,你的解决问题的工具箱就越丰富。今日早读文章由@排骨翻译投稿,Gitlab@samanthaming授权分享。

正文从这开始~~

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

 
   
   
 
  1. const positive = 5;

  2. const negative = -5;

  3. const zero = 0;


  4. Math.sign(positive); // 1

  5. Math.sign(negative); // -1

  6. Math.sign(zero); // 0

Math.sign 返回值

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

 
   
   
 
  1. 1 // positive number

  2. -1 // negative number

  3. 0 // positive zero

  4. -0 // negative zero

  5. NaN // not a number

 
   
   
 
  1. Math.sign(8); // 1

  2. Math.sign(-8); // -1


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

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


  5. Math.sign(NaN); // NaN

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

  7. Math.sign(); //NaN

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

Math.sign Gotcha

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

 
   
   
 
  1. Math.sign(-8);


  2. // ✅ return -1

  3. // ❌ It doesn't return -8

Math.sign vs 比较

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

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

 
   
   
 
  1. if (number > 0) {

  2. // Positive

  3. } else {

  4. // Negative

  5. }

versus
 
   
   
 
  1. if (Math.sign(number) > 0) {

  2. // Positive

  3. } else {

  4. // Negative

  5. }

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

 
   
   
 
  1. const number = 5;


  2. number > 0; // true

  3. Math.sign(number); // 1

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

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

 
   
   
 
  1. Input: 123;

  2. Output: 321;


  3. Input: -123;

  4. Output: -321;

 
   
   
 
  1. function reverseInteger(num) {

  2. const numArray = Math.abs(num) // Get the absolute value of our number > 321

  3. .toString() // Convert our number to a string > '321'

  4. .split('') // Convert our string of numbers to an array > [3, 2, 1]

  5. .reverse() // Reverse our array of numbers > [1, 2, 3]

  6. .join(''); // Convert our array back to a string > 123


  7. const sign = Math.sign(num); // -1

  8. return numArray * sign;

  9. // Multiply our reverse string with the sign will produce the correct reverse number

  10. }


  11. reverseInteger(-321); // -123

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

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

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

负零

所以,你可能会注意到Math.sign返回的是负数0。

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

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

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

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

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

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

Math.sign浏览器支持

对所有现代的支持都很不错。可惜的是,Internet Explorers太时髦了,不能跟其他人一起玩耍,所以没有支持那里。

IE的代码花絮

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

 
   
   
 
  1. const positive = 5;

  2. const negative = -5;

  3. const zero = 0;


  4. positive === 0 ? positive : positive > 0 ? 1 : -1; // 1

  5. negative === 0 ? negative : negative > 0 ? 1 : -1; // -1

  6. zero === 0 ? zero : zero > 0 ? 1 : -1; // 0

Math.sign Polyfill

或者继续使用Math.sign,只需从MDN中添加这个Polyfill就可以了

 
   
   
 
  1. f (!Math.sign) {

  2. Math.sign = function(x) {

  3. return (x > 0) - (x < 0) || +x;

  4. };

  5. }

资源

  • 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

为你推荐