如何检查一个数字是不是为负数?
Posted
技术标签:
【中文标题】如何检查一个数字是不是为负数?【英文标题】:How to check if a number is negative?如何检查一个数字是否为负数? 【发布时间】:2011-04-04 01:22:45 【问题描述】:我想检查一个数字是否为负数。我正在寻找最简单的方法,所以预定义的 javascript 函数是最好的,但我还没有找到任何东西。这是我目前所拥有的,但我认为这不是一个好方法:
function negative(number)
if (number.match(/^-\d+$/))
return true;
else
return false;
【问题讨论】:
只是质疑你的正则表达式。 -0 呢? Math.sign() ... ? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 【参考方案1】:您应该能够使用以下表达式,而不是编写一个函数来执行此检查:
(number < 0)
Javascript 将通过首先尝试将左侧转换为数字值来评估此表达式,然后检查它是否小于零,这似乎是您想要的。
规格和细节
x < y
的行为在 §11.8.1 小于运算符 (<
) 中指定,它使用 §11.8.5 抽象关系比较算法 em>。
如果x
和y
都是字符串,情况就大不相同了,但由于右侧已经是(number < 0)
中的数字,比较将尝试将左侧转换为数字进行数值比较。如果左边不能转换为数字,则结果为false
。
请注意,与基于正则表达式的方法相比,这可能会产生不同的结果,但取决于您尝试做什么,它最终可能会做正确的事情。
"-0" < 0
是false
,这与-0 < 0
也是false
的事实一致
(参见:signed zero)。
"-Infinity" < 0
是 true
(确认无穷大)
"-1e0" < 0
是 true
(接受科学记数法文字)
"-0x1" < 0
是 true
(接受十六进制文字)
" -1 " < 0
是 true
(允许使用某些形式的空格)
对于上述每个示例,正则表达式方法的结果都会相反(true
而不是 false
,反之亦然)。
参考文献
ECMAScript 5 (PDF) ECMAScript 3, §11.8.1 The Less-than Operator (<
)
ECMAScript 3, §11.8.5 The Abstract Relational Comparison Algorithm
另见
regular-expressions.info/Matching Floating Point Numbers with a Regular Expression附录一:条件运算符?:
也应该说这种形式的陈述:
if (someCondition)
return valueForTrue;
else
return valueForFalse;
可以重构为使用三元/条件 ?:
运算符 (§11.12) 来简单地:
return (someCondition) ? valueForTrue : valueForFalse;
?:
的惯用用法可以使代码更加简洁易读。
相关问题
javascript if alternative To Ternary or Not To Ternary?附录2:类型转换函数
Javascript 具有可以调用来执行各种类型转换的函数。
类似于以下内容:
if (someVariable)
return true;
else
return false;
可以使用?:
运算符重构为:
return (someVariable ? true : false);
但您也可以进一步简化为:
return Boolean(someVariable);
这会调用 Boolean
作为函数 (§15.16.1) 来执行所需的类型转换。类似地,您可以将 Number
作为函数 (§15.17.1) 调用以执行到数字的转换。
相关问题
How can I convert a string to boolean in JavaScript? what is the purpose of javascript new Boolean() ?【讨论】:
@poly,在 ECMAScript 5 中,它归结为 11.8.5(抽象关系比较)。除非 both 两边都是字符串,否则抽象操作ToNumber
在第 3 步期间在两边都运行。
@poly,我之前应该回到 11.8.1(小于运算符)。第 6 步显式强制 undefined 为 false。这也适用于其他关系运算符。可能,他们认为总是评估为真或假会更简单,即使 undefined 是假的。
不需要return (condition);
中的括号,它们什么也没做。此外,这并不等同于您所说的代码,因为它将返回 condition
对象本身而不是布尔值。也许你的意思是return !!condition
?
是的,这行得通。我还是更喜欢!!
,因为使用Boolean
涉及额外的函数调用,因此速度较慢,而且字符数也更多。
@Tim, @Matthew:好的,所以在下一个修订版中,我计划有附录 3,使用运算符进行类型转换,用双补码代替 Boolean
,用一元加号代替 Number
。还有什么我应该补充的吗?我想也许~~
也可以代替+
,但这就是我能想到的。【参考方案2】:
function negative(n)
return n < 0;
您的正则表达式应该可以很好地处理字符串数字,但这可能更快。 (根据上述类似答案中的评论编辑,不需要使用+n
进行转换。)
【讨论】:
【参考方案3】:这是一个老问题,但它有很多观点,所以我认为更新它很重要。
ECMAScript 6 带来了函数Math.sign()
,它返回一个数字的符号(如果是正数则返回1,如果是负数则返回-1)或如果不是数字则返回NaN。 Reference
您可以将其用作:
var number = 1;
if(Math.sign(number) === 1)
alert("I'm positive");
else if(Math.sign(number) === -1)
alert("I'm negative");
else
alert("I'm not a number");
【讨论】:
不错,但目前浏览器和移动设备支持受限于:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案4】:这样简单的事情怎么样:
function negative(number)
return number < 0;
* 1
部分是将字符串转换为数字。
【讨论】:
* 1
不是必需的,因为比较会在需要时进行隐式字符串->数字转换。
@Matthew Flaschen:我不确定所有浏览器中的行为是否一致,所以我添加了它。您能否确认这在所有浏览器中都是一致的,因为我记得过去遇到过一些问题。
如果您担心确保将其转换为数字,+number
不会做同样的事情吗?
@Gabe:不,不会。尝试做'foo' + 1
,你会得到'foo1'
。因此,如果您想强制转换为数字,通常最简单的方法是使用 *1
。
+number
将比number * 1
更有效,但在这种情况下,<
将导致ToPrimitive
被number
单独调用,并带有提示Number
。这种行为在规范中,并且在所有实现中都是一致的。【参考方案5】:
在 ES6 中,您可以使用 Math.sign 函数来确定是否,
1. its +ve no
2. its -ve no
3. its zero (0)
4. its NaN
console.log(Math.sign(1)) // prints 1
console.log(Math.sign(-1)) // prints -1
console.log(Math.sign(0)) // prints 0
console.log(Math.sign("abcd")) // prints NaN
【讨论】:
【参考方案6】:如果你真的想深入研究,甚至需要区分-0
和0
,这里有一个方法。
function negative(number)
return !Object.is(Math.abs(number), +number);
console.log(negative(-1)); // true
console.log(negative(1)); // false
console.log(negative(0)); // false
console.log(negative(-0)); // true
【讨论】:
【参考方案7】:一种同时检查正面和负面的好方法......
function ispositive(n)
return 1/(n*0)===1/0
console.log( ispositive(10) ) //true
console.log( ispositive(-10) ) //false
console.log( ispositive(0) ) //true
console.log( ispositive(-0) ) //false
基本上将Infinity
与-Infinity
进行比较,因为0===-0// true
【讨论】:
以上是关于如何检查一个数字是不是为负数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]