Ce face ‘!!~’ în Javascript? [duplicat] (Programare, Javascript, Operatori Bitwise)

msc a intrebat.
a intrebat.

Am văzut următoarea bucată de cod pe github.

/**
 * Filters an array of objects with multiple criteria.
 *
 * @param  {Array}  array: the array to filter
 * @param  {Object} filters: an object with the filter criteria as the property names
 * @return {Array}
 */
function multiFilter(array, filters) {
  const filterKeys = Object.keys(filters);
  // filters all elements passing the criteria
  return array.filter((item) => {
    // dynamically validate all filter criteria
    return filterKeys.every(key => !!~filters[key].indexOf(item[key]));
  });
}

Nu înțeleg, ce face !!~ face aici?

PS: Cunosc limbajele C și C++ și dar sunt începător cu Javascript. Știu despre acești operatori, dar nu înțeleg, de ce se folosește dubla negație(!!) cu bitwise not(~)?

Comentarii

  • Ia negația unei negații, care este o modalitate de a o transforma în boolean. Pentru un motiv bizar, au făcut apoi o negație bitwise pe care. –  > Por jhpratt.
  • Este doar o altă modalitate de a „cast” la un boolean, nu sunt sigur pentru ce fel de motiv există negarea suplimentară de tip bitwise, care este, pentru mine, complet inutilă, cu excepția cazului în care transformă cumva indexof. –  > Por briosheje.
  • Aș dori să știu dacă !!~ mai rapid decât != -1? –  > Por Terry Wei.
  • @TerryWei: Am rmb văzut că cineva a făcut comparația și bitwise este puțin mai rapid. Dar cantitatea este neglijabilă –  > Por Isaac.
  • utilizați includes() care returnează un boolean ( true sau false ). dacă doriți să știți dacă un element se află în interiorul unui array/string. Nu este nevoie să folosiți acest lucru ~ deoarece este foarte greu de citit și de înțeles dacă cineva se va uita vreodată peste codul tău. Doar pentru că puteți folosi ceva nu înseamnă că ar trebui să o faceți 🙂 –  > Por Mihai T.
4 răspunsuri
SandroKSG

indexOf va returna indexul 0-x dacă elementul este găsit, -1 în caz contrar.

~ va schimba toți biții din număr, transformând -1 în 0 (reprezentarea binară a lui -1 este 1111 1111 ...).

0 este o valoare falsă, toate celelalte numere sunt adevărate.

!! va converti o valoare falsă în false și o valoare veridică în true. Nu ar fi necesar aici, deoarece every nu-i pasă dacă primește o valoare adevărată sau adevărată.

După cum au menționat și alții, în prezent ați putea folosi includes. Cu toate acestea, includes este mai nou în ecosistemul JavaScript decât indexOf, , deci această soluție ar funcționa în IE, soluția cu include nu ar funcționa. Ați putea folosi în continuare includes în IE, fie prin furnizarea unui polyfill fie prin transpunerea codului dvs.

CertainPerformance

Tilda transformă codul rezultat în indexOf este adevărată dacă elementul este găsit și falsă dacă elementul nu este găsit. !! convertește apoi rezultatul într-un boolean dintr-un număr. (ceea ce nu este deloc util, deoarece every îi interesează doar dacă rezultatul este adevărat sau fals).

Este teribil de neclar. Ar fi mult mai bine să folosiți acest lucru în schimb:

return array.filter((item) => {
  // dynamically validate all filter criteria
  return filterKeys.every(key => filters[key].includes(item[key]));
});

Comentarii

  • Oh. Deci tilda este de fapt inteligentă în acest caz. Frumos. –  > Por briosheje.
  • Clever în detrimentul altora care pot înțelege codul tău cu ușurință nu este de fapt deloc inteligent, IMO. –  > Por CertainPerformance.
  • inteligența mea se referea la faptul că ai ghicit că tilda a fost acolo din acest motiv anume, nu chiar la lizibilitatea codului 😛 -.  > Por briosheje.
Isaac

Poate fi împărțit în pași ca mai sus pentru a încerca să înțelegi ce se întâmplă. Bitwise operator: ~ este o modalitate obișnuită de a înlocui urâtul 0/-1 comparație atunci când se utilizează indexOf metoda. O dublă negație folosind !! ne va da un boolean care ne va spune dacă a fost sau nu găsit.

Harshal Patil

!!~ înseamnă bitwise not ~ urmată de o dublă negație !!.

Bitwise not operează prin inversarea tuturor biților din operand.