如何检查一个数字是否为负数?

101

我想检查一个数是否为负数。我正在寻找最简单的方法,所以预定义的JavaScript函数是最好的选择,但我还没有找到任何相关的函数。这是我目前拥有的代码,但我认为这不是一个好的方式:

function negative(number) {
  if (number.match(/^-\d+$/)) {
    return true;
  } else {
    return false;
  }
}

3
质疑你的正则表达式。 -0 呢? - user1723095
1
Math.sign() ... ? https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/sign - GrayedFox
7个回答

375

不要编写一个函数来执行此检查,你应该只需使用以下表达式:

(number < 0)

在Javascript中,这个表达式会先尝试将左侧转换为数字再检查它是否小于零,这似乎是你想要的。


规范和详细信息

x < y的行为在§11.8.1小于运算符(<)中指定,该部分使用§11.8.5抽象关系比较算法

如果xy都是字符串,则情况会有很大不同,但由于右侧已经是数字(即(number < 0)),因此比较将尝试将左侧转换为数字以进行数字比较。如果左侧无法转换为数字,则结果为false

请注意,与您基于正则表达式的方法相比,这可能会产生不同的结果,但根据您要做的事情,最终可能会做正确的事情。

  • "-0" < 0false,这与-0 < 0也是false一致(参见:有符号零)。
  • "-Infinity" < 0true(无穷大被承认)
  • "-1e0" < 0true(科学计数法文字被接受)
  • "-0x1" < 0true(十六进制文字被接受)
  • " -1 " < 0true(一些空格形式被允许)

对于以上每个示例,基于正则表达式的方法会评估相反的结果(true而不是false,反之亦然)。

参考资料

另请参阅


附录1:条件运算符?:

还应该说明的是,对于这种形式的语句:

if (someCondition) {
   return valueForTrue;
} else {
   return valueForFalse;
}

可以使用三元/条件运算符?:(参见§11.12)来重构为:

return (someCondition) ? valueForTrue : valueForFalse;

合理使用?:操作符可以使代码更加简洁易懂。

相关问题


附录2:类型转换函数

Javascript提供了许多调用的函数来执行各种类型转换。

例如下面这样:

if (someVariable) {
   return true;
} else {
   return false;
}

可以使用 ?: 运算符进行重构,以便改为:

return (someVariable ? true : false);

但你也可以进一步简化为:

return Boolean(someVariable);

这里将Boolean作为函数调用(§15.16.1)来执行所需的类型转换。同样,你可以调用Number作为函数(§15.17.1) 来执行转换为数字的操作。

相关问题


1
在ECMAScript 5中,@poly涉及到11.8.5(抽象关系比较)。除非*两侧都是字符串,否则在第3步期间将在两侧上运行抽象操作ToNumber - Matthew Flaschen
1
@poly,我应该在之前回到11.8.1(小于运算符)。第6步明确地将未定义的值强制转换为false。这也适用于其他关系运算符。可能他们决定始终评估为true或false会更简单,即使未定义的值是falsy。 - Matthew Flaschen
1
不需要在 return (condition); 中使用括号,它们没有任何作用。而且,这与你所说的代码并不等价,因为它将返回 condition 对象本身,而不是布尔值。也许你的意思是 return !!condition - Tim Down
2
没问题,那样也可以。但我还是更喜欢使用 !!,因为使用 Boolean 会涉及到额外的函数调用,因此速度较慢,并且需要更多的字符。 - Tim Down
并不总是,Firefox会将<0的值变成负数。我几天前在做一些动画时注意到,在执行... < 0条件时,Firefox会抛出“解析错误”,而且在Android 4.2中也会发生这种情况。因此,我使用了number < 1,并在长度上加1来弥补不足。 - RAMM-HDR
显示剩余3条评论

14
function negative(n) {
  return n < 0;
}

你的正则表达式在处理字符串数字时应该能够正常工作,但这可能更快。(从类似答案的评论中编辑而来,使用+n进行转换是不必要的。)


13

这是一个老问题,但有很多人浏览,所以我认为更新它很重要。

ECMAScript 6引入了函数Math.sign(),它返回数字的正负号(如果是正数则返回1,如果是负数则返回-1),如果不是数字则返回NaN。参考资料

你可以像这样使用它:

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");
}

不错,但目前浏览器和移动设备支持有限,根据:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign - Patrick Refondini

3

有没有什么像这样简单的东西:

function negative(number){
    return number < 0;
}

第一步是将字符串转换为数字。


2
“* 1” 不是必需的,因为如果需要,比较操作将进行隐式的字符串->数字转换。 - Matthew Flaschen
@Matthew Flaschen:我不确定这种行为在所有浏览器中是否一致,所以我加了它。你能确认这在所有浏览器中都是一致的吗?因为我记得过去有些问题。 - Wolph
@Gabe:不会的。试试'foo' + 1,你会得到 'foo1'。所以如果你想强制转换为数字,通常最简单的方法就是使用 *1 - Wolph
2
+numbernumber * 1 更高效,但在这种情况下 < 运算符会自动调用 ToPrimitive 方法将 number 转换为数字类型。这种行为在规范中有明确说明,并且在所有实现中都是一致的。 - bcherry
@WoLpH,他没有说 'foo' + 1,他说的是 +number,对于你的例子,它是 +'foo'。这会得到预期的 NaN。你也可以使用 parseIntparseFloat(取决于你是否需要一个整数结果)。然而,就目前的标准而言(可能存在浏览器错误),这里不需要任何操作。 - Matthew Flaschen
显示剩余3条评论

2

如果您真的想深入了解,甚至需要区分-00,这里有一种方法可以做到。

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

1
在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

1

一个好的方式,也会检查正数和负数...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接