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 ?
Réponses
Trop de publicités?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).
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
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/