【问题标题】:~~ vs parseInt? [duplicate]~~ vs parseInt? [复制]
【发布时间】:2012-06-06 03:49:08
【问题描述】:

可能重复:
What is the “double tilde” (~~) operator in JavaScript?

D3 教程给出了一个产生随机序列的函数:

var t = 1297110663, // start time (seconds since epoch)
    v = 70, // start value (subscribers)
    data = d3.range(33).map(next); // starting dataset

function next() {
  return {
    time: ++t,
    value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))
  };
}

注意 ~~ (tilda tilda) 在:

    value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))

通过在 javascript 终端中玩耍,我看到了:

~~1
1
~~-1
-1
~~-1.3
-1
parseInt(5)
5
parseInt(-5)
-5
parseInt(-5.3)
-5
parseInt(5.3)
5

既然 ~~ 和 parseInt 似乎是等价的,那么使用 parseInt 的基本原理是什么?

【问题讨论】:

  • TIL 关于 JavaScript 中的波浪号按位非运算符。谢谢。

标签: javascript


【解决方案1】:

它们不相等。

  • parseInt() 将字符串转换为数字,读取并忽略第一个非整数字符,还可能执行基本转换(例如,将字符串解释为八进制或十六进制)。

console.log(



  parseInt(011)           +'\n'+ // 9
  parseInt('011')         +'\n'+ // 11
  parseInt('42 cats')     +'\n'+ // 42
  parseInt('0xcafebabe')  +'\n'+ // 3405691582
  parseInt('deadbeef',16) +'\n'+ // 3735928559
  parseInt('deadbeef',36) +'\n'  // 1049836114599



);
  • var x = ~~y; 是一个“技巧”——类似于 var x = y << 0;——它 (ab) 使用 unary bitwise NOT operator 强制结果在带符号的 32 位整数范围内,丢弃任何非整数部分。李>

console.log(



  parseInt(011)                +'\n'+// 9
  parseInt('011')              +'\n'+// 11
  parseInt('42 cats')          +'\n'+// 42
  parseInt('0xcafebabe')       +'\n'+// 3405691582
  parseInt('deadbeef',16)      +'\n'+// 3735928559
  parseInt('deadbeef',36)      +'\n' // 1049836114599



);

经常使用~~x,因为:

  1. 通常比调用方法更快。
  2. 打字比其他任何东西都快。
  3. 它让高级用户感觉很酷,因为它有点不可思议,也有点合理。 :)

cafebabe 测试中所见,数字大于 231  -1 ( 2,147,483,647 ) 或小于 -231
( -2,147,483,648 ) 由于有符号 32 位整数的限制,将“环绕”。

【讨论】:

  • 您可能想准确解释一下~ 是什么。就像按位不一样。
  • @Endophage 感谢您的建议。
  • @DavidFregoli 因为octal parsing
  • @DavidFregoli 如果你坚持使用parseInt 而不是one of the better choices,那么如果你想要结果11,你应该使用parseInt('011',10)
  • 在实现 ECMAscript 5 的现代浏览器中,默认情况下不会对前导零的字符串进行八进制解析,因此 parseInt('011'); 将在其中返回 11。像 IE8 这样的旧浏览器仍然返回 9,因此您必须指定明确的基数以避免歧义。
【解决方案2】:

parseInt 不限于有符号的 32 位数字。

   // Top range for a bitwise operator provides a valid result
~~((Math.pow(2,32)/2)-1); // 2147483647

   // Beyond the top range provides undesired result
~~(Math.pow(2,32)/2); // -2147483648

另外,您可以使用parseInt 指定基数。

【讨论】:

  • @gdoron 他们表明按位不钳位到 32 位值,一旦你达到 2^32 就会滚动到有符号补码区域
【解决方案3】:
~~"red" === 0

isNaN(parseInt("red"))

parseInt 也可以处理超过 32 位的数字

【讨论】:

    【解决方案4】:

    简单:它更易读、更方便。

    按位 NOT 运算符设计用于其他用途,但可能被误用于截断浮点值。在您的示例中,Math.floor 也是可能的。

    此外,它们在许多情况下的行为并不相似。 parseInt 不限于 32 位,它可以解析以不同位置表示法表示的数字,还可以处理 NaN 的非数字值。

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 2013-10-02
      • 2012-02-04
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2013-09-10
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多