我想检查一个数是否为负数。我正在寻找最简单的方法,所以预定义的JavaScript函数是最好的选择,但我还没有找到任何相关的函数。这是我目前拥有的代码,但我认为这不是一个好的方式:
function negative(number) {
if (number.match(/^-\d+$/)) {
return true;
} else {
return false;
}
}
我想检查一个数是否为负数。我正在寻找最简单的方法,所以预定义的JavaScript函数是最好的选择,但我还没有找到任何相关的函数。这是我目前拥有的代码,但我认为这不是一个好的方式:
function negative(number) {
if (number.match(/^-\d+$/)) {
return true;
} else {
return false;
}
}
不要编写一个函数来执行此检查,你应该只需使用以下表达式:
(number < 0)
在Javascript中,这个表达式会先尝试将左侧转换为数字再检查它是否小于零,这似乎是你想要的。
x < y
的行为在§11.8.1小于运算符(<)中指定,该部分使用§11.8.5抽象关系比较算法。
如果x
和y
都是字符串,则情况会有很大不同,但由于右侧已经是数字(即(number < 0)
),因此比较将尝试将左侧转换为数字以进行数字比较。如果左侧无法转换为数字,则结果为false
。
请注意,与您基于正则表达式的方法相比,这可能会产生不同的结果,但根据您要做的事情,最终可能会做正确的事情。
"-0" < 0
为false
,这与-0 < 0
也是false
一致(参见:有符号零)。"-Infinity" < 0
为true
(无穷大被承认)"-1e0" < 0
为true
(科学计数法文字被接受)"-0x1" < 0
为true
(十六进制文字被接受)" -1 " < 0
为true
(一些空格形式被允许)对于以上每个示例,基于正则表达式的方法会评估相反的结果(true
而不是false
,反之亦然)。
?:
还应该说明的是,对于这种形式的语句:
if (someCondition) {
return valueForTrue;
} else {
return valueForFalse;
}
可以使用三元/条件运算符?:
(参见§11.12)来重构为:
return (someCondition) ? valueForTrue : valueForFalse;
合理使用?:
操作符可以使代码更加简洁易懂。
Javascript提供了许多调用的函数来执行各种类型转换。
例如下面这样:
if (someVariable) {
return true;
} else {
return false;
}
可以使用 ?:
运算符进行重构,以便改为:
return (someVariable ? true : false);
但你也可以进一步简化为:
return Boolean(someVariable);
这里将Boolean
作为函数调用(§15.16.1)来执行所需的类型转换。同样,你可以调用Number
作为函数(§15.17.1) 来执行转换为数字的操作。
ToNumber
。 - Matthew Flaschenreturn (condition);
中使用括号,它们没有任何作用。而且,这与你所说的代码并不等价,因为它将返回 condition
对象本身,而不是布尔值。也许你的意思是 return !!condition
? - Tim Down!!
,因为使用 Boolean
会涉及到额外的函数调用,因此速度较慢,并且需要更多的字符。 - Tim Downnumber < 1
,并在长度上加1来弥补不足。 - RAMM-HDRfunction negative(n) {
return n < 0;
}
你的正则表达式在处理字符串数字时应该能够正常工作,但这可能更快。(从类似答案的评论中编辑而来,使用+n
进行转换是不必要的。)
这是一个老问题,但有很多人浏览,所以我认为更新它很重要。
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");
}
有没有什么像这样简单的东西:
function negative(number){
return number < 0;
}
第一步是将字符串转换为数字。
'foo' + 1
,你会得到 'foo1'
。所以如果你想强制转换为数字,通常最简单的方法就是使用 *1
。 - Wolph+number
比 number * 1
更高效,但在这种情况下 <
运算符会自动调用 ToPrimitive
方法将 number
转换为数字类型。这种行为在规范中有明确说明,并且在所有实现中都是一致的。 - bcherry'foo' + 1
,他说的是 +number
,对于你的例子,它是 +'foo'
。这会得到预期的 NaN
。你也可以使用 parseInt
或 parseFloat
(取决于你是否需要一个整数结果)。然而,就目前的标准而言(可能存在浏览器错误),这里不需要任何操作。 - Matthew Flaschen如果您真的想深入了解,甚至需要区分-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
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
一个好的方式,也会检查正数和负数...
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