2012-05-31 2 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))) 

От игры вокруг в яваскрипта терминале, я вижу:

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

С ~~ и ParseInt кажутся эквивалентными, Что обоснование использования ParseInt?

+1

[Побитовое отклонение] (https://developer.mozilla.org/en/JavaScript/Reference/operators/bitwise_operators#.7E_ (Bitwise_NOT)) –

+0

TIL о титле побитового оператора NOT в JavaScript. Благодарю. –

ответ

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; —, что (аb) использует 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 (-2147483648) будет "обтекать" из-за пределов подписанного 32-битное целое число.

+3

Возможно, вы захотите точно объяснить, что такое '' '. Как побитовое. – Endophage

+0

@ Эндофаг Спасибо за предложение. – 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.