为什么(x^0===x)输出x而不是true/false?

4

我在做一个关于如何测试变量是否为整数的练习。其中一个提供的解决方案是x ^ 0 === x,然而当我在Chrome浏览器的控制台、codepen.io或者这里进行尝试时,它返回的是x。为什么会这样呢?

function isInteger(x) {
  console.log(x ^ 0 === x);
}

isInteger(5);
isInteger(124.124)
isInteger(0);


2
顺便提一下,Number.isInteger() 是在 ECMAScript 6 中引入的。不再需要重新发明轮子了。 - Patrick Roberts
是的,只是一次练习 :) - user736893
3个回答

5

由于您未在x^0周围添加(),因此导致您的条件评估错误:

function isInteger(x) {
  console.log((x ^ 0) === x);
}

isInteger(5);
isInteger(124.124)
isInteger(0);


1
这种情况发生在我们所有人身上 xD - messerbill
1
希望这种事情不要发生在我身上,尤其是在新工作的编码测试前4个小时 ¯\(ツ) - user736893
5
至少这不是在考试期间发生的。 - BoltClock
1
你一定能做到这个,我相信你。 - messerbill
尚未可知! - user736893

3

虽然messerbill的回答解释了问题,但还有另一个问题。这不是一个好的使用方法:

function isInteger(x) {
  console.log((x ^ 0) === x);
}

isInteger(281474976710656);

因为位运算符会将操作数强制转换为32位,所以最好使用以下方式: 位运算符

function isInteger(x) {
  console.log((x % 1) === 0);
}

isInteger(5);
isInteger(124.124)
isInteger(0);
isInteger(281474976710656);


我爱你。在做这个练习的时候,取模运算是我脑海中首先浮现的东西,也是我使用的方法。当我查看可能的解决方案时,它却不在其中。我认为也许这不是个好主意。感谢你无意中给我的肯定和鼓励!(编辑:它确实在那里,只是我漏看了,但仍然……) - user736893
1
@ScottBeeson 谢谢你提供这个链接 - 我会把它发给我现在也在学习 JS 的兄弟 :D - messerbill
@ScottBeeson 它确实可以:function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); },尽管我已经假设我们只会向函数传递数字输入。看来一切都不确定了。 - Patrick Roberts

0

作为提供答案的补充,与此问题相关的概念是“运算符优先级”。当我在JS中遇到这种问题时,我会去那个页面(不同的语言可能有稍微不同的运算符优先级,例如JS中的指数运算符**php)。

所以从答案中的例子来看:

(x ^ 0) === x

需要括号

x % 1 === 0

不是。


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