16

可能重复:
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 的基本原理是什么?

4

4 回答 4

33

它们不是等价的。

  • 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) 使用一元按位非运算符强制结果在有符号 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测试中可以看出,由于有符号 32 位整数的限制,高于 2 31  - 1 ( 2,147,483,647 ) 或低于  - 2 31
( -2,147,483,648 ) 的数字将“环绕”。

于 2012-05-31T21:04:47.703 回答
9

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您可以指定基数。

于 2012-05-31T21:05:23.487 回答
2
~~"red" === 0

isNaN(parseInt("red"))

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

于 2012-05-31T21:05:10.383 回答
1

简单:它是更易读、更方便的变体。

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

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

于 2012-05-31T21:10:33.737 回答