js判断负数_【第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

关于本文 作者:@samanthaming 原文:https://www.samanthaming.com/tidbits/29-check-if-number-is-positive-or-negative/

5b6b0fccffc95f4b991ea023b1e53fe7.png

为你推荐

【第1639期】如何使用JSDoc保证你的Javascript类型安全性

【第1803期】如何在Web上构建一个插件系统

【第1599期】一个无名前端的10年前端路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值