~~ vs parseInt?

Возможный дубликат:
Что такое оператор double tilde (~~) в 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?

Ответы

Ответ 1

Они не эквивалентны.

  • 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) использует унарный побитовый оператор NOT заставить результат находиться в диапазоне подписанного 32-битного целого числа, отбрасывая любую нецелую часть.

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

Использование ~~x часто выполняется, потому что:

  • Это обычно быстрее, чем вызов метода.
  • Это быстрее, чем что-либо другое.
  • Это заставляет пользователей власти чувствовать себя круто, потому что это своего рода непостижимое, а также своего рода оправданное.:)

Как видно из теста cafebabe, цифры выше 2 31 -1 (2,147,483,647) или ниже -2 31 (-2,147,483,648) будут "обертываться" из-за до пределов подписанного 32-битного целого числа.

Ответ 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 вы можете указать радиус.

Ответ 3

~~"red" === 0

isNaN(parseInt("red"))

parseInt может обрабатывать также 32-разрядные номера

Ответ 4

Простой: это более читаемый и удобный вариант.

Побитовый оператор NOT предназначен для некоторого другого использования, но может использоваться неправильно для обрезания значений с плавающей запятой. В вашем примере Math.floor также было возможно.

Кроме того, во многих случаях они не очень похожи друг на друга. parseInt не ограничивается 32-битным, он может анализировать числа, представленные в разных позиционных обозначениях, а также обрабатывать нечисловые значения с помощью NaN.