我想在JavaScript中获取数字的绝对值。也就是说,放下标志。 我知道在数学上我可以通过对数字进行平方然后取平方根来做到这一点,但我也知道这是非常低效的。
x = -25
x = x * x
x = Math.sqrt(x)
console.log(x)
JavaScript 中有没有一种方法可以简单地删除数字的符号,并且比数学方法更有效?
这是获取整数绝对值的快速方法。它适用于每种语言:
x = -25;
console.log((x ^ (x >> 31)) - (x >> 31));
但是,这对于绝对值大于 0x80000000 的整数不起作用,因为
>>
会将 x
转换为 32 位。
如果您想了解 JavaScript 如何在幕后实现此功能,您可以查看这篇博客文章。据此,这是基于 chromium 源代码的实现:
// ECMA 262 - 15.8.2.1 function MathAbs(x) { x = +x; return (x > 0) ? x : 0 - x; } console.log(MathAbs(-25));
替代解决方案
Math.max(x,-x)
let abs = x => Math.max(x,-x);
console.log( abs(24), abs(-24) );
此外,Rick 答案可以缩写为
x>0 ? x : -x
只需删除数字的符号:
var x = -25;
x = +`${x}`.replace('-', '');
或者:
var x = -25;
x = +''.replace.call(x, '-', '');
黑客技巧:
Number.prototype.replace = ''.replace;
var x = -25;
x = +x.replace('-', '');
此函数使用零个内置方法或函数。原因是,我想解决编码问题而不依赖它们。
function AbsoluteValue(NEGATIVE) {
const POSITIVE = [];
if (typeof NEGATIVE != "object") {
NEGATIVE = [NEGATIVE];
}
for (let i = 0; i < NEGATIVE.length; i++) {
if (NEGATIVE[i] < 0) {
let attachDigit = "";
NEGATIVE[i] += "";
for (let j = 1; j < NEGATIVE[i].length; j++) {
attachDigit += NEGATIVE[i][j];
attachDigit -= 1;
attachDigit += 1;
}
NEGATIVE[i] -= 1;
NEGATIVE[i] += 1;
POSITIVE[i] = attachDigit;
} else POSITIVE[i] = NEGATIVE[i];
}
return POSITIVE;
}
向(@Endre Simo)大声喊叫。如果没有他对这个问题的回答,这段代码就不可能实现。只是想我会采取不同的做法。
function AbsoluteValue(n) {
let p = (n - 1) ^ (n >> n);
return p;
}