x = 12.245; // Issa number
x = 'School'; // Not a number
y = parseInt(x)
if isNaN(y)
console.log('Not a number');
else
console.log('Issa number');
// Issa number
而使用y = ~~x则是完全不同的情况
x = 12.245; // Issa number
x = 'School'; // Issa number
y = ~~x;
if isNaN(y)
console.log('Not a number');
else
console.log('Issa number');
7条答案
按热度按时间wmomyfyw1#
很好的问题!前几天我真的要处理这个问题!写parseInt看起来像是一个后藤,但是等等!我们可以更花哨一些。
所以我们可以用位运算符来做很多事情,这似乎是一个很好的情况!假设我有你问题中的数字,12.345,我可以用位运算符'~'来反转数字中的所有位,并在这个过程中将数字转换为int!我喜欢JS。
所以现在我们有了数的反转位表示,如果我们再次'~'它,我们得到........ drum roll.........我们的数没有小数!不幸的是,它不进行舍入。
我们可以使用Math.round()来实现这一点。不过,您可以在JSperf上尝试一下,看看您得到的轻微加速效果!希望这对您有所帮助!
5ssjco0h2#
我认为这是一个很好的例子
14ifxucb3#
只需执行:~~(x + 0.5)
干杯Z
k4emjkb14#
带零的算术OR就可以了。
ecfsfe2w5#
parseInt(x)
执行此工作。如果您在不知道输入是什么的情况下运行检查以查看返回值是否实际上是int。
而使用
y = ~~x
则是完全不同的情况wsewodh26#
如果你不关心舍入的细节,
Math.trunc()
是简单的、标准的和可读的。我还没有测试过性能,但是它肯定比Math.round()
和parseInt()
好。ndh0cuux7#
在我自己的测试中,我发现性能的经验法则是:
1.按位运算(
~~num, num|0, num^0, num&0xFFFFFFFF
)num - (num % 1)
位运算符的问题是在这个过程中数字会被转换成32位整数,如果这对你的用例来说是好的,那么继续。请参阅bitwise OR,bitwise NOT,bitwise AND和bitwise XOR上的MDN文档或它们各自的ECMAScript文档。
parseInt
函数通常比其他函数慢很多,很可能是因为它需要一个字符串作为参数。modulo operator的解决方案应该谨慎使用,因为它可能会咬你的屁股有时由于浮点问题,但几乎一样快的数学方法。