~~ 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
.