250 votes

Ce que fait ~ ~ (« double tilde ») faire en Javascript ?

J’ai été vérifier une bibliothèque physique des jeux en ligne aujourd'hui et suis tombé sur le ~ ~ opérateur. Je sais une seule ~ est une opération NOT, cela ferait ~ ~ un pas d’un pas, ce qui rendrait la même valeur, wouldn ' t it ?

287voto

PleaseStand Points 16718

Il supprime tout ce qui est après la virgule parce que les opérateurs au niveau du bit convertir implicitement leurs opérandes signé nombres entiers de 32 bits. Cela fonctionne si les opérandes sont (à virgule flottante) de nombres ou de chaînes de caractères, et le résultat est un nombre.

En d'autres termes, il donne:

function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);
}

seulement si x est compris entre -(231) et 231 - 1. Sinon, le dépassement de capacité se produit et le numéro de "envelopper".

Cela peut être considéré comme utile pour convertir une fonction de l'argument chaîne de caractères en nombre, mais en raison de la possibilité de dépassement de capacité et qu'il est incorrect pour une utilisation avec des nombres non entiers, je ne voudrais pas l'utiliser de cette façon, à l'exception de "code de golf" (c'est à dire inutilement parage octets désactivé le code source de votre programme au détriment de la lisibilité et de la robustesse). Je voudrais utiliser +x ou Number(x) à la place.


Comment c'est le PAS de la PAS

Le nombre -43.2, par exemple:

-43.210 = 111111111111111111111111110101012

comme signé (complément à deux) nombre binaire de 32 bits. (JavaScript ignore ce qui est après la virgule.) En inversant les bits donne:

PAS -4310 = 000000000000000000000000001010102 = 4210

L'inversion donne à nouveau:

PAS 4210 = 111111111111111111111111110101012 = -4310

Ce qui diffère de l' Math.floor(-43.2) en que négatif les nombres sont arrondis à zéro, pas loin de lui. (La fonction floor, qui serait égale à -44, toujours arrondi vers le bas à la prochaine nombre entier inférieur, peu importe si le nombre est positif ou négatif).

36voto

Shanti Points 141

Le premier ~ exploitant les forces de l'opérande à un nombre entier (éventuellement après le fait de contraindre la valeur à une chaîne ou un booléen), puis inverse le plus bas 31 bits. Officiellement ECMAScript nombres sont tous à virgule flottante, mais certains numéros sont mis en œuvre sur 31 bits entiers dans la SpiderMonkey moteur.

Vous pouvez l'utiliser pour tourner, 1 élément de tableau en entier. Floating points sont convertis selon la C la règle, c'est à dire. la troncature de la partie fractionnaire.

La deuxième ~ opérateur puis inverse les bits, de sorte que vous savez que vous aurez un nombre entier. Ce n'est pas le même que le fait de contraindre une valeur booléenne dans un rapport de condition, car un objet vide {} est évaluée à true, alors qu' ~~{} renvoie la valeur false.

js>~~"yes"
0
js>~~3
3
js>~~"yes"
0
js>~~false
0
js>~~""
0
js>~~true
1
js>~~"3"
3
js>~~{}
0
js>~~{a:2}
0
js>~~[2]
2
js>~~[2,3]
0
js>~~{toString: function() {return 4}}
4
js>~~NaN
0
js>~~[4.5]
4
js>~~5.6
5
js>~~-5.6
-5

14voto

L' ~ semble n' -(N+1). Donc, ~2 == -(2 + 1) == -3 Si vous la faites à nouveau sur -3 il le tourne dos: ~-3 == -(-3 + 1) == 2 Il est probablement juste convertit une chaîne en un nombre dans un rond-point.

Voir ce fil: http://www.sitepoint.com/forums/showthread.php?t=663275

Aussi, une information plus détaillée est disponible ici: http://dreaminginjavascript.wordpress.com/2008/07/04/28/

11voto

jsumners Points 6247

Compte tenu de est , est alors . Qui, évidemment, conduit à une Astuce.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X