为何在JavaScript中10.333333 | 0的结果为10?
JavaScript中
10.333333 | 0 === 10的原因解析 嘿,这个问题抓得很准!咱们把这个表达式的细节拆解开来说清楚:
先注意运算符优先级的隐藏坑
你写的10.333333 | 0 === 10,在JavaScript里严格相等运算符===的优先级比按位或|更高,所以实际执行顺序是:
10.333333 | (0 === 10)
0 === 10会返回false,而布尔值参与按位操作时会被转成数字:false对应0,true对应1。所以表达式最终简化为10.333333 | 0,结果自然是10,也就等于后面的10了。
核心原因:按位操作会强制截断小数部分
你猜的完全正确!所有JavaScript的按位操作符(包括|、&、^、~等)在处理非整数时,都会先把数值转换为带符号的32位整数,转换规则就是直接丢弃小数部分——既不是四舍五入,也不是向下取整,就是简单砍掉小数位。
举几个例子验证这个逻辑:
10.999999 | 0→ 10(哪怕小数接近1,也直接截断)-10.333 | 0→ -10(这里要注意,和Math.floor(-10.333)得到-11的逻辑不一样)0.5 | 0→ 0
回到你的问题,10.333333转换为32位整数后就是10,再和0做按位或操作:因为0的二进制所有位都是0,按位或任何数都不会改变原数,所以结果还是10。
额外小提示
过去很多开发者会用x | 0来快速对正数取整,因为它的执行效率很高。不过现在更推荐用Math.trunc(),它的语义更清晰,专门用来直接截断小数部分,不管正负都能得到符合直觉的结果。
内容的提问来源于stack exchange,提问作者Amr M. AbdulRahman
相关产品推荐
相关产品推荐

