var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
? 'value'
: 'innerHTML'
Je l'ai vu dans une réponse, et je ne l'ai jamais vu auparavant.
Qu'est-ce que ça veut dire?
javascript
syntax
bit-manipulation
wwaawaw
la source
la source
Réponses:
~
est un opérateur au niveau du bit qui retourne tous les bits de son opérande.Par exemple, si votre numéro était
1
, sa représentation binaire du flottant IEEE 754 (comment JavaScript traite les nombres) serait ...~
Convertit donc son opérande en un entier 32 bits (les opérateurs au niveau du bit en JavaScript le font) ...S'il s'agissait d'un nombre négatif, il serait stocké dans le complément à 2: inversez tous les bits et ajoutez 1.
... puis retourne tous ses bits ...
Il a plusieurs utilisations. Si vous écrivez des trucs de bas niveau, c'est pratique. Si vous avez profilé votre application et trouvé un goulot d'étranglement, il pourrait être rendu plus performant en utilisant des astuces au niveau du bit (comme un outil possible dans un sac beaucoup plus grand).
Il est aussi un (généralement) pas clair truc à tourner
indexOf()
est trouvé valeur de retour dans truthy (tout en faisant pas trouvé que falsy ) et les gens utilisent souvent pour son effet secondaire de tronquer nombres à 32 bits (et laissant tomber sa place décimale en le doublant, effectivement les mêmes queMath.floor()
pour les nombres positifs).Je dis pas clair, car il n'est pas immédiatement évident à quoi il sert. Généralement, vous voulez que votre code communique clairement aux autres personnes qui le lisent. Bien que l'utilisation
~
puisse sembler cool , elle est généralement trop intelligente pour son propre bien. :)C'est aussi moins pertinent maintenant que JavaScript a
Array.prototype.includes()
etString.prototype.includes()
. Ceux-ci renvoient une valeur booléenne. Si votre ou vos plates-formes cibles le prennent en charge, vous devriez le préférer pour tester l'existence d'une valeur dans une chaîne ou un tableau.la source
value = value || default
en JavaScript est un idiome courant et valide tant que vous savez quand vous pouvez et ne pouvez pas l'utiliser.v = t ? a : b;
. Je trouve cela beaucoup plus clair que d'var v; if (t} { v = a; } else { v = b; }
habitude réparti sur 5+ lignes et aussi plus clair quevar v = b; if (t) { v = a; }
ce qui serait généralement 4+ lignes. Mais je connais beaucoup de gens qui ne connaissent pas les? :
opérateurs qui préféreraient la deuxième ou la troisième voie. Je trouve que le premier est plus lisible. Je suis d'accord avec le principe général, clarifiez le code, n'utilisez pas de hacks. Je suppose que je vois juste~v.indexOf('...')
être très clair une fois que je l'ai appris.~
idiomatique. cela fait techniquement partie de la spécification de langue , mais ce n'est pas tellement une partie de la langue en général .L'utiliser avant une
indexOf()
expression vous donne effectivement un résultat vrai / faux au lieu de l'index numérique qui est directement renvoyé.Si la valeur de retour est
-1
, alors~-1
c'est0
parce que-1
c'est une chaîne de tous les 1 bits. Toute valeur supérieure ou égale à zéro donnera un résultat différent de zéro. Donc,entraînera l'
if
exécution du code lorsque "quelque chose" est dans "someString". Si vous essayez de l'utiliser.indexOf()
directement en tant que booléen, cela ne fonctionnera pas, car il retourne parfois zéro (lorsque "quelque chose" est au début de la chaîne).Bien sûr, cela fonctionne aussi:
et c'est beaucoup moins mystérieux.
Parfois, vous verrez également ceci:
L'utilisation de l'
~
opérateur deux fois comme cela est un moyen rapide de convertir une chaîne en un entier 32 bits. Le premier~
effectue la conversion et le second~
retourne les bits. Bien sûr, si l'opérateur est appliqué à quelque chose qui ne peut pas être converti en nombre, vous obtenezNaN
le résultat. ( modifier - en fait, c'est la seconde~
qui est appliquée en premier, mais vous avez l'idée.)la source
~
lorsqu'il est effectué sur des entiers est égal à-(x + 1)
.0
êtrefalse
et de l' être non nultrue
, du moins au C dans les années 70 et probablement à beaucoup d'autres langages de programmation de systèmes alors contemporains. Cela découle probablement du fonctionnement du matériel; de nombreux processeurs définissent un bit zéro après une opération et ont une instruction de branchement correspondante pour la tester.| 0
, auquel cas sa seule opération.~~
exactement de la même manière.L' opérateur
~
est Bitwise NOT ,~x
est à peu près le même que-(x+1)
. C'est plus facile à comprendre, en quelque sorte. Alors:Considérez
-(x+1)
.-1
peut effectuer cette opération pour produire un0
.En d'autres termes,
~
utilisé avec une plage de valeurs numériques produira une valeur fausse (contraindre àfalse
partir de0
) uniquement pour la-1
valeur d'entrée, sinon, toute autre valeur vraie.Comme nous le savons,
-1
est communément appelé une valeur sentinelle . Il est utilisé pour de nombreuses fonctions qui renvoient des>= 0
valeurs de réussite et-1
d' échec en langage C. Dont la même règle de valeur de retourindexOf()
en JavaScript.Il est courant de vérifier la présence / absence d'une sous-chaîne dans une autre chaîne de cette manière
Cependant, il serait plus facile de le faire
~
comme ci-dessousYou Don't Know JS: Types & Grammar par Kyle Simpson
la source
-(x+1)
si je l'ai vu dans une déclaration if. Le tilde me dit exactement ce qu'il fait pour compenser la nature basée sur 0 de Javascript. Aussi, moins il y a de parenthèses, mieux c'est pour lireif (a.indexOf("Ba") > -1) {// found} //true
ce qui, bien qu'un peu plus long que les exemples tilde, est considérablement moins que les deux exemples que vous avez donnés et pour les nouveaux programmeursvar opinion = !~-1 ? 'more' : 'less'
compréhensibles.~indexOf(item)
revient assez souvent, et les réponses ici sont excellentes, mais peut-être que certaines personnes ont juste besoin de savoir comment l'utiliser et "sauter" la théorie:la source
++
et--
parce qu'ils "encouragent les ruses excessives" et pourtant ont~
survécu (caché dans l'ombre) github.com/airbnb/javascript/issues/540list.indexOf(item) >= 0
or... > -1
puisque javascript est basé sur zéro et n'a pas choisi de résoudre ce problème dès le départ. De plus, juste une opinion (identique à celle d'Airbnb), quiconque fait quelque chose de significatif en javascript le sait++
, et bien que ce--
soit moins courant, le sens peut être inféré.++
et--
dans un certain temps en raison des méthodes primitives commemap
,forEach
etc. Mon point est plus pourquoi ils ne considéraient pas aussi~
excessivement difficile quand tout standard utilisé comprend incrémentation et les opérateurs décrémentation. Interdire quelque chose pour que CIS101 n'a aucun sens.Pour ceux qui envisagent d'utiliser l'astuce tilde pour créer une valeur véridique à partir d'un
indexOf
résultat, il est plus explicite et a moins de magie pour utiliser laincludes
méthode à la placeString
.Notez qu'il s'agit d'une nouvelle méthode standard à partir d'ES 2015, elle ne fonctionnera donc pas sur les anciens navigateurs. Dans les cas où cela est important, envisagez d'utiliser le polyfill String.prototype.includes .
Cette fonctionnalité est également disponible pour les tableaux utilisant la même syntaxe :
Voici le polyfill Array.prototype.includes si vous avez besoin d'un support de navigateur plus ancien.
la source