2012-05-31 44 views
14

Duplicar posible:
What is the “double tilde” (~~) operator in JavaScript?~~ vs parseInt?

El tutorial D3 da una función que produce una secuencia aleatoria:

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

Nota el ~~ (Tilda) en:

value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5))) 

De jugar en la terminal de Javascript, que veo:

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

Desde ~~ y parseInt parecen ser equivalentes, cuál es la razón para usar parseInt?

+1

[No bitwise] (https://developer.mozilla.org/es/JavaScript/Reference/operators/bitwise_operators#.7E_ (Bitwise_NOT)) –

+0

TIL sobre el operador tilde bit a bit NOT en JavaScript. Gracias. –

Respuesta

27

No son equivalentes.

  • parseInt() convierte cadenas en números, la lectura hasta e ignorando el primer carácter no entero, y también posiblemente realizar la conversión de base (por ejemplo, la interpretación de una cadena como octal o hexadecimal).

    parseInt('011');   // 9 
    parseInt('42 cats');  // 42 
    parseInt('0xcafebabe'); // 3405691582 
    parseInt('deadbeef',16); // 3735928559 
    parseInt('deadbeef',36); // 1049836114599 
    
  • var x = ~~y; es un 'truco' — similar a var x = y << 0; — que (ab) utiliza el unary bitwise NOT operator para forzar el resultado a estar en el rango de un entero de 32 bits con signo, desechando cualquier porción no entero.

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

Usando ~~x se hace a menudo porque:

  1. Por lo general es más rápido que llamar a un método.
  2. Es más rápido escribir que cualquier otra cosa.
  3. Hace que los usuarios avanzados se sientan bien porque es inescrutable y también justificable. :)

Como se ve en la prueba cafebabe, números por encima de 2 -1 (2147483647) o por debajo de -2 (-2147483648) será "wrap around", debido a los límites de una firmaron Entero de 32 bits

+3

Es posible que desee explicar exactamente qué es '~'. Como en bitwise no. – Endophage

+0

@Endophage Gracias por la sugerencia. – Phrogz

+0

@juwiley Si (y solo si!) Siente que esto ha respondido a su pregunta, considere [aceptar esta respuesta] (http://meta.stackexchange.com/a/5235/153741). – Phrogz

2
~~"red" === 0 

isNaN(parseInt("red")) 

parseInt puede manejar más de 32 números de bits, así

7

parseInt no se limita a números con signo de 32 bits.

// 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 

Además, con parseInt puede especificar la raíz.

+0

¿Qué muestran esas dos líneas? – gdoron

+0

@gdoron Muestran que no se fija en bit a valores de 32 bits, rodando en un terreno con complemento de signo una vez que tocas 2^32 – Phrogz

1

Simple: Es la variante más legible y conveniente.

El operador NOT bit a bit está diseñado para otro uso, pero se puede utilizar incorrectamente para truncar los valores float. En su ejemplo, también fue posible Math.floor.

Además, no se comportan de forma similar en muchos casos. parseInt no está limitado a 32 bits, puede analizar números representados en diferentes notaciones posicionales y también maneja valores no numéricos con NaN.

Cuestiones relacionadas