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()文字列を数値に変換し、最初の非整数文字まで読み取って無視し、場合によっては基数変換を実行します(たとえば、文字列を8進数または16進数として解釈します)。

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)単項ビット単位のNOT演算子を使用して、結果を符号付き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テストで見られるように、2 31-1(2,147,483,647)より上または  -2 31  ( -2,147,483,648)より下 数値は、符号付き32ビット整数の制限により「ラップアラウンド」します。

于 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演算子は他の用途向けに設計されていますが、float値の切り捨てに誤用される可能性があります。あなたの例でMath.floorは、も可能でした。

また、多くの場合、同じように動作しません。parseInt32ビットに制限されていません。さまざまな位置表記で表された数値を解析でき、。を使用して数値以外の値も処理できますNaN

于 2012-05-31T21:10:33.737 に答える