Kaip? ~ (Ir ne tilde / bang tilde bit) pakeiskite skambinimo metodo rezultatą?

Jei čia perskaitysite komentarus apie jQuery inArray puslapį, yra įdomus skelbimas:

 !!~jQuery.inArray(elm, arr) 

Dabar manau, kad dvigubas šaukinys konvertuoja rezultatą į boolean tipą, kurio vertė yra true . Ką aš nesuprantu, koks yra „tilde“ operatoriaus ( ~ ) naudojimas visame toje?

 var arr = ["one", "two", "three"]; if (jQuery.inArray("one", arr) > -1) { alert("Found"); } 

Refactoring, if :

 if (!!~jQuery.inArray("one", arr)) { alert("Found"); } 

Struktūra:

 jQuery.inArray("one", arr) // 0 ~jQuery.inArray("one", arr) // -1 (why?) !~jQuery.inArray("one", arr) // false !!~jQuery.inArray("one", arr) // true 

Aš taip pat pastebėjau, kad jei aš įdėsiu tildę, rezultatas būtų -2 .

 ~!!~jQuery.inArray("one", arr) // -2 

Aš nesuprantu tildės tikslo čia. Ar kas nors gali tai paaiškinti arba nukreipti į išteklius?

91
16 февр. nustatė vartotojo717236 vasario 16 d. 2012-02-16 21:08 '12 - 21:08 2012-02-16 21:08
@ 13 atsakymų

„Tilde“ operatorius iš tikrųjų nėra jQuery dalis - tai „bit“ NOT operatorius „JavaScript“.

Žr Tildos Didžioji paslaptis (~) .

Eksperimentuose gausite keistų numerių, nes atliekate bitų loginę operaciją sveikuoju skaičiumi (kuris, kiek aš žinau, gali būti saugomas kaip du papildymai arba kažkas panašaus)

Du papildymai paaiškina, kaip atstovauti skaičių dvejetainiu formatu. Manau, kad teisus.

54
16 февр. atsakymas duotas 16 vasario mėn. 2012-02-16 21:10 '12, 9:10 pm 2012-02-16 21:10

Yra tam tikra priežastis, kodėl kartais matote ~ naudojamus prieš $.inArray .

Iš esmės

 ~$.inArray("foo", bar) 

- trumpesnis būdas

 $.inArray("foo", bar) !== -1 
border=0

$.inArray grąžina masyvo elemento indeksą, jei randamas pirmasis argumentas, ir grąžina -1, jei jis nerastas. Tai reiškia, kad jei ieškote loginės reikšmės „tai yra masyvo reikšmė?“, Negalite atlikti loginio palyginimo, nes -1 yra galiojanti reikšmė, o kai $. rasti pirmame masyvo elemente.

Naudojant bitų operatorių ~ atsiranda -1 0 tampa 0 ir tampa „-1“. Taigi, nerandant reikšmių masyve ir taikant bitų NOT rezultatus į melagingą vertę (0), ir visos kitos vertės grąžina ne 0 skaičių ir parodys tikrąjį rezultatą.

 if (~$.inArray("foo", ["foo",2,3])) { // Will run } 

Ir tai veiks kaip numatyta.

115
16 февр. Viešpaties atsakymas, pateiktas 16 vasario mėn. 2012-02-16 21:16 '12, 9:16 pm 2012-02-16 21:16

!!~expr įvertina false kai expr yra -1 kitaip true .
Tai tas pats, kaip expr != -1 , tik sulaužyta *


Jis veikia, nes „ JavaScript“ bitinti operacijos operandus paverčia dviem papildomais formatais 32-bitų sveikųjų skaičių. Taigi, !!~-1 yra apskaičiuojamas taip:

  -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two complement representation of -1 ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits) !0 = true // ! is logical not (true for falsy) !true = false // duh 

Kitai nei -1 vertė turi bent vieną bitą, lygų nuliui; apverčiant, tai sukurs tikrąją vertę; taikymas ! operatorius du kartus į tikrąją vertę grąžina boolean true.

Naudojant su .indexOf() ir tik norime patikrinti, ar rezultatas yra -1 ar ne:

 !!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false !!~"abc".indexOf("a") // indexOf() returns 0, the expression evaluates to true !!~"abc".indexOf("b") // indexOf() returns 1, the expression evaluates to true 

* !!~8589934591 vertina netikrą, taigi taip bjaurumas negali būti patikimai panaudota bandymui -1 .

99
14 мая '12 в 14:23 2012-05-14 14:23 atsakymą pateikė Salman A gegužės 14 d., 12 val

~foo.indexOf(bar) yra bendroji ~foo.indexOf(bar) santrumpa, nes contains funkcijos.

Paprastai liejimas į loginę yra neprivalomas dėl „JavaScript“ sąvokos su „klaidingomis“ reikšmėmis. Šiuo atveju jis naudojo true ar false išvestį funkcijai.

32
14 мая '12 в 16:13 2012-05-14 16:13 atsakymas pateikiamas zzzzBov gegužės 14 d., 12 val. 18:13 PM 2012-05-14 16:13

jQuery.inArray() grąžina -1 už "nerastas", kurio komplementas ( ~ ) yra 0 . Taigi, „ ~jQuery.inArray() grąžina „falsy“ ( 0 ) reikšmę „nerastas“ ir tinkamą reikšmę (neigiamą sveikąjį skaičių) „rasti“. !! tada įformina netikrą / tiesą į tikrą false / true . Taigi, !!~jQuery.inArray() bus true „rasti“ ir „ false už „nerastas“.

18
16 февр. Atsakymą pateikė Amadan , vasario 16 d. 2012-02-16 21:17 '12 9:17 val. 2012-02-16 21:17

~ visiems 4 baitams, int atitinka šią formulę -(N+1)

SO

 ~0 = -(0+1) // -1 ~35 = -(35+1) // -36 ~-35 = -(-35+1) //34 
11
30 янв. Atsakymas, kurį pateikė Mina Gabriel Jan 30 2014-01-30 00:39 '14 ne 0:39 2014-01-30 00:39

Operatorius „ ~ yra bitų papildomas operatorius. „ inArray() sveikojo skaičiaus rezultatas yra arba -1, kai elementas nerastas, arba kai kuris ne neigiamas sveikasis skaičius. Bitinis komplementas -1 (pateikiamas dvejetainėje formoje kaip visi 1 bitai) yra nulis. Bet kokio neigiamo sveikojo skaičiaus bitų papildas visada yra nulinis.

Taigi, !!~i bus true kai sveikasis skaičius "i" yra ne neigiamas sveikasis skaičius, o false , kai "i" yra -1.

Atkreipkite dėmesį, kad ~ visada suaktyvina savo operandą į sveikąjį skaičių; tai reiškia, kad jis sukelia ne sveikojo skaičiaus slankiojo kablelio reikšmes kaip sveikasis skaičius, taip pat ne skaitines reikšmes.

10
16 февр. Atsakymas pateiktas Pointy 16 vasario mėn. 2012-02-16 21:11 '12, 21:11 2012-02-16 21:11

„Bitwise tilde“ NE - invertuoja kiekvieną vertę. Paprastai, jei naudojate „ ~ “ numeriui, jo ženklas bus apverstas, tada 1 bus atimtas.

Taigi, kai jūs darote ~0 , jūs gausite -1 (0 yra apverstas - 0, atimtis 1 yra -1).

Tai iš esmės yra sudėtingas, itin mikrooptimalus būdas gauti vertę, kuri visada yra logiška.

10
16 февр. Joe paskelbė vasario 16 dieną 2012-02-16 21:12 „12, 12:12 pm 2012-02-16 21:12

Jūs teisus: šis kodas grįš false kai skambutis į indexOf grąžins -1; kitaip true .

Kaip sakote, būtų daug išmintingiau naudoti kažką panašaus

 return this.modifiedPaths.indexOf(path) !== -1; 
8
14 мая '12 в 14:25 2012-05-14 14:25 atsakymą pateikė LukeH gegužės 14 d., 12 val

Operatorius „ ~ yra bitų NE operatorius. Tai reiškia, kad jis užima skaičių dvejetainiu pavidalu ir visus nulius paverčia nuliais.

Pavyzdžiui, skaičius 0 dvejetainiu formatu yra 0000000 , o -1 yra 11111111 . Panašiai 1 yra 00000001 dvejetainiais terminais, o -2 yra 11111110 .

6
16 февр. atsakymą pateikė Frxstrem vasario 16 d. 2012-02-16 21:14 '12 9:14 val. 2012-02-16 21:14

Manau, kad jis egzistuoja, nes jis yra kelis simbolius trumpesnis (bibliotekos autoriai visada yra po to). Jis taip pat naudoja operacijas, kurios atlieka tik kelis mašinų ciklus, kai rengiami į vietinį kodą (o ne lyginant su skaičiumi).

Sutinku su kitu atsakymu į tai, kad ji yra nereikalinga, bet galbūt tai gali būti prasminga griežtai (reikia atlikti veiklos įvertinimą, kitaip gali pasirodyti ankstyvas optimizavimas).

3
14 мая '12 в 14:25 2012-05-14 14:25 atsakymą davė Aleksandras Pavlovas gegužės 12 d., 14:25, 2012-05-14 14:25

Manau, kad tai yra bitų operacija, tai yra greičiausias (skaičiavimo požiūriu pigus) būdas patikrinti, ar kelias rodomas modifikuotuose keliuose.

2
14 мая '12 в 14:30 2012-05-14 14:30 atsakymas pateikiamas panos2point0 gegužės 14 d., 12 val. 2:30 val. 2012-05-14 14:30

Patinka (~(-1)) === 0 , kaip šis:

 !!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false 
1
14 мая '12 в 14:37 2012-05-14 14:37 Inžinieriaus atsakymas gegužės 14, 12 d. 2:37 2012-05-14 14:37