2012-05-31 41 views
14

可能重複:
What is the 「double tilde」 (~~) operator in JavaScript?~~ vs parseInt?

的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))) 
    }; 
} 

注意~~(蒂爾達蒂爾達)中:

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函數的原理是什麼?

+1

[Bitwise not](https://developer.mozilla.org/en/JavaScript/Reference/operators/bitwise_operators#.7E_(Bitwise_NOT)) –

+0

關於JavaScript中代字符NOT運算符的TIL。謝謝。 –

回答

27

它們並不等同。

  • parseInt()變成字符串成數字,讀至多並忽略第一個非整數的字符,並且還可能執行基本轉換(例如解釋的字符串作爲八進制或十六進制)。

    parseInt('011');   // 9 
    parseInt('42 cats');  // 42 
    parseInt('0xcafebabe'); // 3405691582 
    parseInt('deadbeef',16); // 3735928559 
    parseInt('deadbeef',36); // 1049836114599 
    
  • var x = ~~y;是一個「特技」 —類似於var x = y << 0; —該(AB)使用unary bitwise NOT operator迫使結果是在一個符號的32位整數的範圍內,丟棄任何非整數部分。

    ~~'011';  // 11   
    ~~'42 cats'; // 0 
    ~~'0xcafebabe'; // -889275714 
    ~~'deadbeef'; // 0 
    

使用~~x往往是因爲做:

  1. 它通常比調用的方法更快。
  2. 鍵入比其他任何東西都快。
  3. 它讓高級用戶感覺很酷,因爲它有點不可思議,也有點合理。 :)

cafebabe測試看出,數字上述2 -1(2,147,483,647)或低於-2 (2,147,483,648)將 「環繞」 由於的極限簽名32位整數。

+3

你可能想解釋一下'〜'是什麼。在按位不是。 – Endophage

+0

@Endophage感謝您的建議。 – Phrogz

+0

@juwiley如果(並且只有當!)你覺得這已經回答了你的問題,請考慮[接受這個答案](http://meta.stackexchange.com/a/5235/153741)。 – Phrogz

2
~~"red" === 0 

isNaN(parseInt("red")) 

parseInt函數可以處理超過32位數字,以及

7

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

+0

這兩條線顯示的是什麼? – gdoron

+0

@gdoron它們顯示的是按位不符合32位值,一旦你達到2^32 – Phrogz

1

簡單:它更可讀和更方便的變體。

按位NOT運算符是爲某些其他用途而設計的,但可能會被誤用於截斷浮點值。在你的例子中,Math.floor也是可能的。

另外,它們在許多情況下並不相似。 parseInt不限於32位,它可以解析用不同位置表示法表示的數字,還可以使用NaN處理非數字值。