Si lee los comentarios en la inArray
página de jQuery aquí , hay una declaración interesante:
!!~jQuery.inArray(elm, arr)
Ahora, creo que un signo de exclamación doble convertirá el resultado a tipo boolean
, con el valor de true
. Lo que no entiendo es cuál es el uso del ~
operador tilde ( ) en todo esto.
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Refactorizando la if
declaración:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Descompostura:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
También noté que si pongo la tilde al frente, el resultado es -2
.
~!!~jQuery.inArray("one", arr) // -2
No entiendo el propósito de la tilde aquí. ¿Alguien puede explicarlo o señalarme un recurso?
javascript
jquery
operators
bitwise-operators
usuario717236
fuente
fuente
~jQuery.inArray()
es realmente muy útil, posiblemente incluso una muy buena razón por la cual las funciones de búsqueda regresan-1
por falla (el único valor cuyo complemento a dos es falso). Una vez que haya visto y entendido el truco, creo que es aún más legible que!= -1
.!!~
por nada .if (x != -1)
yif (~x)
para mí es que el primero en realidad expresa lo que pretendes hacer. Este último expresa que desea hacer algo completamente diferente ("convierta mi número de 64 bits en un entero de 32 bits, y verifique si el bit a bit NO de ese entero es verdadero"), donde simplemente obtiene el resultado deseado en este Un caso.>= 0
Probablemente no era Leet suficiente, así que cuanto más críptica!!~
se utilizó.Respuestas:
El operador de tilde no es en realidad parte de jQuery en absoluto, es un operador NOT bit a bit en JavaScript.
Ver El gran misterio de la Tilde (~) .
Obtiene números extraños en sus experimentos porque está realizando una operación lógica bit a bit en un entero (que, por lo que sé, puede almacenarse como complemento a dos o algo así ...)
El complemento a dos explica cómo representar un número en binario. Creo que tenía razón.
fuente
Hay una razón específica por la que a veces verá
~
aplicado delante$.inArray
.Básicamente,
es una forma más corta de hacer
$.inArray
devuelve el índice del elemento en la matriz si se encuentra el primer argumento, y devuelve -1 si no se encuentra. Esto significa que si está buscando un booleano de "¿está este valor en la matriz?", No puede hacer una comparación booleana, ya que -1 es un valor verdadero y cuando $ .inArray devuelve 0 (un valor falso ), significa que realmente se encuentra en el primer elemento de la matriz.La aplicación del
~
operador bit a bit hace-1
que se convierta0
y que 0 se convierta en `-1. Por lo tanto, no encontrar el valor en la matriz y aplicar el NOT bit a bit da como resultado un valor falso (0), y todos los demás valores devolverán números distintos de 0 y representarán un resultado veraz.Y funcionará según lo previsto.
fuente
!!~expr
evalúafalse
cuandoexpr
es lo-1
contrariotrue
.Es lo mismo que
expr != -1
, solo roto *Funciona porque las operaciones bit a bit de JavaScript convierten los operandos en enteros con signo de 32 bits en formato de complemento a dos. Así
!!~-1
se evalúa de la siguiente manera:Un valor distinto de
-1
tendrá al menos un bit puesto a cero; invertirlo creará un valor de verdad; la aplicación del!
operador dos veces a un valor verdadero devuelve booleano verdadero.Cuando se usa con
.indexOf()
y solo queremos verificar si el resultado es-1
o no:* se
!!~8589934591
evalúa como falso, por lo que estoabominaciónno se puede utilizar de forma fiable para realizar la prueba-1
.fuente
~foo.indexOf(bar)
, no es un ahorro significativo en personajes o rendimiento, pero es una abreviatura relativamente común de la misma manera que lofoo = foo || {}
es.!!
.>= 0
no tiene el mismo comportamiento que!!~
.!== -1
está más cerca.~foo.indexOf(bar)
es una abreviatura común de representarfoo.contains(bar)
porque lacontains
función no existe.Normalmente, la conversión a booleana no es necesaria debido al concepto de JavaScript de valores "falsos". En este caso, se usa para forzar que la salida de la función sea
true
ofalse
.fuente
jQuery.inArray()
devuelve-1
"no encontrado", cuyo complemento (~
) es0
. Por lo tanto,~jQuery.inArray()
devuelve un valor falso (0
) para "no encontrado" y un valor verdadero (un entero negativo) para "encontrado".!!
luego formalizará el falso / verdadero en un booleanofalse
/ realtrue
. Entonces,!!~jQuery.inArray()
darátrue
por "encontrado" yfalse
por "no encontrado".fuente
El
~
para los 4 bytesint
es igual a esta fórmula-(N+1)
ENTONCES
fuente
~2147483648 != -(2147483648 + 1)
.El
~
operador es el operador de complemento bit a bit. El resultado entero deinArray()
es -1, cuando no se encuentra el elemento, o algún entero no negativo. El complemento bit a bit de -1 (representado en binario como todos los bits 1) es cero. El complemento bit a bit de cualquier entero no negativo es siempre distinto de cero.Así,
!!~i
serátrue
cuando el entero "i" sea un entero no negativo yfalse
cuando "i" sea exactamente -1.Tenga en cuenta que
~
siempre convierte su operando en entero; es decir, fuerza los valores de coma flotante no enteros a enteros, así como los valores no numéricos.fuente
Tilde NO es bit a bit: invierte cada bit del valor. Como regla general, si usa
~
un número, su signo se invertirá y luego se restará 1.Por lo tanto, cuando lo hace
~0
, obtiene -1 (0 invertido es -0, restar 1 es -1).Es esencialmente una forma elaborada y súper micro optimizada de obtener un valor que siempre es booleano.
fuente
Tienes razón: este código volverá
false
cuando laindexOf
llamada devuelva -1; de lo contrariotrue
.Como dices, sería mucho más sensato usar algo como
fuente
.js
. Habiendo dicho eso, podrían usar en>=0
lugar de!==-1
- no hay bytes adicionales para enviar y aún más legible que la versión de bit-twidddling.> -1
es aún más legible, pero probablemente sea muy subjetivo.El
~
operador es el operador NOT bit a bit. Lo que esto significa es que toma un número en forma binaria y convierte todos los ceros en unos y los unos en ceros.Por ejemplo, el número 0 en binario es
0000000
, mientras que -1 es11111111
. Asimismo, 1 está00000001
en binario, mientras que -2 lo es11111110
.fuente
Supongo que está ahí porque tiene unos pocos caracteres más corto (lo que los autores de la biblioteca siempre buscan). También utiliza operaciones que solo toman unos pocos ciclos de máquina cuando se compilan en el código nativo (a diferencia de la comparación con un número).
Estoy de acuerdo con otra respuesta de que es una exageración, pero quizás podría tener sentido en un circuito cerrado (sin embargo, requiere una estimación de ganancia de rendimiento; de lo contrario, puede resultar una optimización prematura).
fuente
Supongo que, dado que es una operación bit a bit, es la forma más rápida (computacionalmente barata) de verificar si la ruta aparece en las rutas modificadas.
fuente
Como
(~(-1)) === 0
, entonces:fuente