Se você leu os comentários na inArray
página jQuery aqui , há uma declaração interessante:
!!~jQuery.inArray(elm, arr)
Agora, acredito que um ponto de exclamação duplo converterá o resultado em tipo boolean
, com o valor de true
. O que eu não entendo é qual é o uso do ~
operador til ( ) em tudo isso?
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Refatorando a if
declaração:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Demolir:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
Também notei que se eu colocar o til na frente, o resultado é -2
.
~!!~jQuery.inArray("one", arr) // -2
Não entendo o propósito do til aqui. Alguém pode me explicar ou indicar um recurso?
javascript
jquery
operators
bitwise-operators
user717236
fonte
fonte
~jQuery.inArray()
é realmente muito útil - possivelmente até mesmo um bom motivo pelo qual as funções de pesquisa retornam-1
para falha (o único valor cujo complemento de dois é falso). Depois de ver e entender o truque, sinto que é ainda mais legível do que!= -1
.!!~
para nada .if (x != -1)
eif (~x)
para mim é que o primeiro realmente expressa o que você pretende fazer. Este último expressa que você deseja fazer algo totalmente diferente ("por favor, converta meu número de 64 bits em um inteiro de 32 bits e verifique se o NÃO bit a bit desse inteiro é verdadeiro"), onde você obtém o resultado desejado neste Um caso.>= 0
provavelmente não era pequeno o suficiente, então o mais enigmático!!~
foi usado.Respostas:
O operador til não faz parte do jQuery - é um operador NOT bit a bit no próprio JavaScript.
Veja O Grande Mistério do Til (~) .
Você está recebendo números estranhos em seus experimentos porque está realizando uma operação lógica bit a bit em um número inteiro (que, pelo que sei, pode ser armazenado como complemento de dois ou algo parecido ...)
O complemento de dois explica como representar um número em binário. Eu acho que estava certo.
fonte
Há um motivo específico que às vezes você verá
~
aplicado antes$.inArray
.Basicamente,
é uma maneira mais curta de fazer
$.inArray
retorna o índice do item na matriz se o primeiro argumento for encontrado e retorna -1 se não for encontrado. Isso significa que se você estiver procurando por um booleano de "este valor está no array?", Você não pode fazer uma comparação booleana, pois -1 é um valor verdadeiro e quando $ .inArray retorna 0 (um valor falso ), significa que ele realmente foi encontrado no primeiro elemento da matriz.A aplicação do
~
operador bit a bit-1
torna0
e faz com que 0 se torne `-1. Portanto, não encontrar o valor na matriz e aplicar o NOT bit a bit resulta em um valor falso (0), e todos os outros valores retornarão números diferentes de 0 e representarão um resultado verdadeiro.E funcionará conforme o planejado.
fonte
!!~expr
avaliafalse
quandoexpr
é-1
diferentetrue
.É o mesmo que
expr != -1
, apenas quebrado *Funciona porque as operações bit a bit do JavaScript convertem os operandos em inteiros assinados de 32 bits no formato de complemento de dois. Assim,
!!~-1
é avaliado da seguinte forma:Um valor diferente de
-1
terá pelo menos um bit definido como zero; invertê-lo criará um valor verdadeiro; aplicar o!
operador duas vezes a um valor verdadeiro retorna verdadeiro booleano.Quando usado com
.indexOf()
e queremos apenas verificar se o resultado é-1
ou não:*
!!~8589934591
avalia como falso, então esteabominaçãonão pode ser usado de forma confiável para testar-1
.fonte
~foo.indexOf(bar)
, não é uma economia significativa em personagens ou desempenho, mas é um atalho relativamente comum da mesma maneira quefoo = foo || {}
é.!!
.>= 0
não tem o mesmo comportamento que!!~
.!== -1
está mais próxima.~foo.indexOf(bar)
é uma abreviatura comum de representarfoo.contains(bar)
porque acontains
função não existe.Normalmente, a conversão para booleano é desnecessária devido ao conceito de valores "falsos" do JavaScript. Nesse caso, é usado para forçar a saída da função a ser
true
oufalse
.fonte
jQuery.inArray()
retorna-1
para "não encontrado", cujo complemento (~
) é0
. Portanto,~jQuery.inArray()
retorna um valor falso (0
) para "não encontrado" e um valor verdadeiro (um número inteiro negativo) para "encontrado".!!
irá então formalizar o falso / verdadeiro em booleano realfalse
/true
. Então,!!~jQuery.inArray()
darátrue
para "encontrado" efalse
para "não encontrado".fonte
O
~
para todos os 4 bytesint
é igual a esta fórmula-(N+1)
TÃO
fonte
~2147483648 != -(2147483648 + 1)
.O
~
operador é o operador de complemento bit a bit. O resultado inteiro deinArray()
é -1, quando o elemento não é encontrado, ou algum inteiro não negativo. O complemento bit a bit de -1 (representado em binário como todos os bits 1) é zero. O complemento bit a bit de qualquer inteiro não negativo é sempre diferente de zero.Assim,
!!~i
serátrue
quando o inteiro "i" for um inteiro não negativo efalse
quando "i" for exatamente -1.Observe que
~
sempre coage seu operando para inteiro; isto é, ele força valores de ponto flutuante não inteiros para inteiros, bem como valores não numéricos.fonte
Til NÃO é bit a bit - ele inverte cada bit do valor. Como regra geral, se você usar
~
em um número, seu sinal será invertido e, em seguida, 1 será subtraído.Portanto, ao fazer isso
~0
, você obtém -1 (0 invertido é -0, subtrair 1 é -1).É essencialmente uma maneira elaborada e supermicrotimizada de obter um valor que é sempre booleano.
fonte
Você está certo: Este código retornará
false
quando aindexOf
chamada retornar -1; caso contráriotrue
.Como você disse, seria muito mais sensato usar algo como
fonte
.js
. Dito isso, eles poderiam usar>=0
ao invés de!==-1
- nenhum byte extra para enviar e ainda mais legível do que a versão bit-twiddling.> -1
é ainda mais legível, mas provavelmente muito subjetivo.O
~
operador é o operador NOT bit a bit. O que isso significa é que ele pega um número na forma binária e transforma todos os zeros em uns e os uns em zeros.Por exemplo, o número 0 em binário é
0000000
, enquanto -1 é11111111
. Da mesma forma, 1 está00000001
em binário, enquanto -2 está11111110
.fonte
Meu palpite é que está lá porque tem alguns caracteres mais curtos (o que os autores da biblioteca sempre buscam). Ele também usa operações que levam apenas alguns ciclos de máquina quando compiladas no código nativo (em oposição à comparação com um número).
Concordo com outra resposta de que é um exagero, mas talvez possa fazer sentido em um ciclo restrito (requer estimativa de ganho de desempenho, caso contrário, pode acabar sendo uma otimização prematura).
fonte
Suponho que, por ser uma operação bit a bit, é a maneira mais rápida (computacionalmente barata) de verificar se o caminho aparece emmodedPaths.
fonte
Como
(~(-1)) === 0
, então:fonte