【问题标题】:What's the function of the "|" (pipe) operator? [duplicate]“|”的作用是什么(管道)操作员? [复制]
【发布时间】:2012-03-17 09:29:15
【问题描述】:

我有这行是从其他地方复制过来的:

Total += parseFloat($(this).val())|0;

运算符|的作用是什么?当我更改数字时,我会得到不同的结果。

【问题讨论】:

  • MDN 有一个 JavaScript 参考:developer.mozilla.org/en/JavaScript/…
  • 嗨,感谢您的所有回答,请注意,当输入字段值为“3.5”时,函数返回“3”,当我更改“0”并输入“2”时,我得到“5”......总变量......我认为这是与位置相关的参数......
  • @Nicolas400:有人赞成我的答案(已接受的答案),这让我看着它来提醒自己它是什么,我很不高兴发现它是错误 .它说|0 就像Math.floor,这仅适用于正数。固定,仅供参考。

标签: javascript operators


【解决方案1】:

JavaScript 中的|integer bitwise OR operator。在这种情况下,它会去除parseFloat 返回的任何小数部分。表达式parseFloat($(this).val()) 将产生一个带有(可能)小数部分的数字,但随后|0 将是convert it to an integer number,或者它带有0(这意味着它不会改变),所以总体结果是得到一个整数。

所以在功能上,它截断数字的小数部分。 -1.5 变为 -11.5 变为 1。这类似于 Math.floor,但截断而不是四舍五入“向下”(Math.floor(-1.5)-2——下一个最低整数——而不是 -1,因为 |0 版本给了我们)。

所以也许这就是为什么使用它来切掉(而不是“地板”)数字的小数部分。

或者,它可能是一个错字。该代码的作者可能打算写这个(注意||而不是|):

Total += parseFloat($(this).val()) || 0;

这可以防止$(this).val() 返回"" 或类似的可能性,从而导致parseFloat 返回NaN。在这种情况下,它使用the curiously-powerful || operator 返回0 而不是NaN。 (并且有一个广告在您的运算符周围放置空格。)必须知道代码的上下文才能说明在添加到 Total 时截断为整数 (|) 是否有意义,或者如果他们只是为NaN 案辩护。

【讨论】:

  • 在哪些情况下使用位运算符很有帮助?
  • @Jasper:很多时候你都需要按位运算符,这只是一个不寻常的用法。
  • 它还将NaN 转换为0,并确保.val() 被评估为十进制,其中parseInt 需要额外的基数arg。
  • @amnotiam:大声笑,我只是在编辑我的答案以提及NaN,但与||而不是|有关。
【解决方案2】:

javascript 中的| 运算符是按位或运算符

此运算符将操作数视为 32 位整数,如果其中一个为 1,则每个位返回 1,否则返回 0。

【讨论】:

  • 如何将操作数转换为 32 位整数?
  • @Shiplu:在规范中定义:es5.github.com/#x9.5(这并不意味着浏览器真的这样做)。
  • @Shiplu 我不确定它是如何做到的。可能首先将它们转换为数字,然后四舍五入为 32 位整数。
  • @Shiplu:是的,它会将其转换为 32 位整数 (es5.github.com/#x9.5) -- 暂时用于计算。然后将 32 位整数转换回 IEEE 64 位浮点数(JavaScript 仅有的一种数字,除了像这样的计算期间的临时整数),但此时小数部分已被删除(例如, Math.floor).
  • 感谢您的解释。我也虽然结果是浮动的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多