Bu nədir? (not) operatoru javascriptdə?

Mən bir operator tərəfindən istifadə edilən iki nişan nöqtəsi kimi tanımadığım kodunu gördüm, məsələn: !! . Kimsə bu operatorun nə etdiyini izah edə bilərmi?

Gördüyüm kontekst bu idi

 this.vertical = vertical !== undefined ? !!vertical : this.vertical; 
2569
24 апр. Altı ayaq nəzəriyyəsi 24 aprel tarixində müəyyən edilmişdir 2009-04-24 11:13 '09 at 11:13 2009-04-24 11:13
@ 33 cavab
  • 1
  • 2

oObject üçün oObject . Yanlış olarsa (məsələn, 0, null , undefined , və s.), false , əks halda true .

 !oObject //Inverted boolean !!oObject //Non inverted boolean so true boolean representation 

Beləliklə !! operator deyil, yalnız bir operator ! iki dəfə.

Real-dünya nümunəsi "Test IE Version":

 let isIE8 = false; isIE8 = !! navigator.userAgent.match(/MSIE 8.0/); console.log(isIE8); // returns true or false 

Əgər ⇒

 console.log(navigator.userAgent.match(/MSIE 8.0/)); // returns null 

lakin əgər ⇒

 console.log(!!navigator.userAgent.match(/MSIE 8.0/)); // returns true or false 
2304
24 апр. 24 Aprel tarixində stevehipwellə cavab verdi 2009-04-24 11:18 '09 at 11:18 'da 2009-04-24 11:18

Bu növ dönüşüm etmək üçün olduqca qaranlıq bir yoldur.

! QEYD Beləliklə, !true - false!false - true . !0 - true!1 - false .

border=0

Beləliklə, dəyəri mantıksal birinə çevirsən, sonra ters çevir və onu yenidən ters çevir.

 // Maximum Obscurity: val.enabled = !!userId; // Partial Obscurity: val.enabled = (userId != 0) ? true : false; // And finally, much easier to understand: val.enabled = (userId != 0); 
778
10 сент. Cavab Tom Ritter Sep 10 2009-09-10 20:28 '09 saat 20:28 'də 2009-09-10 20:28

ifadəsi ifadənin ehtimalına əsasən bir boolean dəyəri ( true və ya false ) qaytarır. Bu qeyri-null tiplərdə istifadə edildikdə məna verir. Bu nümunələri, xüsusən üçüncü nümunəni və kənarını düşünün:

  !!false === false !!true === true !!0 === false !!parseInt("foo") === false // NaN is falsy !!1 === true !!-1 === true // -1 is truthy !!"" === false // empty string is falsy !!"foo" === true // non-empty string is truthy !!"false" === true // ...even if it contains a falsy value !!window.foo === false // undefined is falsy !!null === false // null is falsy !!{} === true // an (empty) object is truthy !![] === true // an (empty) array is truthy; PHP programmers beware! 
408
15 мая '12 в 12:06 2012-05-15 12:06 cavab Salman A 15 may, 12: 12-da verilir 2012-05-05 12:06

Bir neçə çayın bişirilməsi:

!! operator deyil. Bu cüt istifadə edir ! - bu məntiqi "deyil" operator.


Teorik olaraq:

! bir dəyər deyil həqiqətini müəyyənləşdirir:

  • Həqiqət true deyil ki, false true (belə nəticələr !false

  • Həqiqət true deyil ki, (nə üçün !true


!! olmayanların "həqiqətini" müəyyənləşdirir:

  • true həqiqət true deyildir (buna görə də !!true dönər)

  • Həqiqət false deyil (yəni, false deməkdir)


Müqayisə edərkən müəyyən etmək istədiyimiz şey, linkin özü deyil, linkin mənası haqqında "həqiqət "dir. Dəyərin həqiqəti bilməsi üçün lazım olan bir nümunə var, hətta dəyərin false (və ya falsey) olmasını gözləyirik və ya dəyəri boolean tipi olmasını gözləmirik.


Praktikada:

Dinamik giriş (aka "ördək") istifadə edərək funksionallığı (və bu halda, platforma uyğunluğu) aşkar edən qısa funksiyanı nəzərdən keçirin. Istifadəçi brauzeri HTML5 <audio> elementini dəstəkləyirsə, funksiyanı yazmaq istəmirik, lakin funksiyanı <audio> tanımadıysa bir səhv vermək istəmirik; və biz try ... catch etmək istəmirik try ... catch hər hansı mümkün səhvləri həll etmək üçün try ... catch (çünki onlar kobud); və biz bu funksiya haqqında həqiqəti göstərməyəcəyik (məsələn, document.createElement('audio') HTML5 <audio> dəstəklənməsə belə, adını <audio> ilə bir element yaratmağa imkan verməyəcək bir funksiyanı daxilində bir çek istifadə etmək istəmirik) .


Burada üç yanaşma var:

 // this won't tell us anything about HTML5 `<audio>` as a feature var foo = function(tag, atr) { return document.createElement(tag)[atr]; } // this won't return true if the feature is detected (although it works just fine) var bar = function(tag, atr) { return !document.createElement(tag)[atr]; } // this is the concise, feature-detecting solution we want var baz = function(tag, atr) { return !!document.createElement(tag)[atr]; } foo('audio', 'preload'); // returns "auto" bar('audio', 'preload'); // returns false baz('audio', 'preload'); // returns true 

Hər bir funksiya <tag> və ardıcıllıq üçün arqument alır, lakin onların hər biri müqayisələrin müəyyənləşdirildiklərinə görə fərqli bir dəyər verir.

Amma daha çox gözləyin!

Bəziləri, bu xüsusi nümunədə, obyektin əmlaka malik olub olmadığını yoxlamaq üçün bir az daha effektiv vasitəni istifadə edə biləcəyini nəzərə ala bilər. Bunun iki yolu var:

 // the native `hasOwnProperty` method var qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); } // the `in` operator var quux = function(tag, atr) { return atr in document.createElement(tag); } qux('audio', 'preload'); // returns true quux('audio', 'preload'); // returns true 

Çaşqın vəziyyətə düşdük ...

Bu hallar nə qədər nadir hallarda olursa olsun, ən səmərəli, ən təsirli və buna görə də qeyri-sıfır dəyərdən, həqiqətən də, müəyyənləşdirilməmiş həqiqətdən istifadə etmək üçün ən əlverişli yollar bir neçə ssenaridir ola bilər !! . Ümid edirəm ki, bu gülünccə onu təmizləyir.

139
23 февр. Benny'nin 23 Fevralda verdiyi cavabı 2013-02-23 02:45 '13 saat 02:45 'da 2013-02-23 02:45

!! dəyəri sağa bərabər bir boolean dəyərə çevirir. (Onun "döküm" kimi pis bir yola malik olduğunu düşünün). Bir qayda olaraq, oxucuya kodun dəyişən dəyişikliyə nə dərəcədə diqqət etmədiyini, ancaq "əsl" bir dəyər olduğunu bildirmək niyyətindədir.

90
10 сент. Cavab Crescent Fresh 10 Sep verilir. 2009-09-10 20:26 '09 saat 20:26 'də 2009-09-10 20:26

!!foo , unary operatorunu iki dəfə istifadə edir və unary plus +foo istifadə edərək mantıksal bir növü məcbur etmək üçün istifadə olunur və boş simli ''+foo bir dize çevirmək üçün birləşdirir.

Bu hacks əvəzinə, dəyərlərin açıq dəyəri üçün ibtidai növlərə ( new istifadə etmədən) uyğun olan konstruktor funksiyalarından istifadə edə bilərsiniz, yəni.

 Boolean(foo) === !!foo Number(foo) === +foo String(foo) === ''+foo 
62
11 сент. 11 sentyabrda Christoph tərəfindən verilmiş cavab 2009-09-11 00:15 '09 da 0:15 'da 2009-09-11 00:15

Çox cavablar yarım işi edir. Bəli, !!X "X həqiqəti" kimi oxuya bilər. Lakin !! Əslində, bir dəyişən (hətta çox dəyişən) doğru və ya yalan olub olmadığını öyrənmək vacib deyil. !!myVar === true yalnız myVar uyğun myVar . "Real" boolean ilə müqayisə !!X çox faydalı deyil.

Nə kömək ilə alırsınız !! təkrarlanan, standartlaşdırılmış (və JSL üçün əlverişli) üsulla bir-birinə qarşı bir neçə dəyişənlərin ehtimalını test etmək bacarığıdır.

Sadə qala: (

Yəni ...

  • 0 === false - false .
  • !!0 === false - true .

Yuxarıdakılar çox faydalı deyil. if (!0) eyni nəticələr if (!!0 === false) . Mən bir boolean dəyişən casting üçün yaxşı bir halda düşünmək və sonra bir "doğru" boolean ilə müqayisə edə bilməz.

Bax: "== və! =" JSLint istiqamətindən (Qeyd: Crockford saytınızı bir az hərəkət edir, bu link bir nöqtədə ölür)

Operatorlar == və! = Tətbiq etməzdən əvvəl məcburiyyətin növünü müqayisə edin. Bu pisdir, çünki '\ t \ r \ n' = 0 etibarlıdır. Bu, maska ​​tipi səhvlər ola bilər. JSLint == düzgün istifadə edildiyinin etibarlı bir şəkildə müəyyənləşdirilə bilməz, beləliklə == və = = istifadə etməmək yaxşıdır və ümumiyyətlə, həmişə daha etibarlı operatorlardan istifadə edin === və! ==.

Qiymətin əsl və ya yalan olduğuna diqqət etməsəniz, qısa formanı istifadə edin. Əvəzinə (foo != 0)

yalnız deyim (foo)

və əvəzinə (foo == 0)

deyirlər
(!foo)

Boolean ədədləri bir ədədlə müqayisə edərkən booleanın bir sıra ( true 1 -ə düşmüş və 0 false sayda) düşəcəyi bəzi qeyri-intuitiv hallar var . Bu vəziyyətdə !! Zehni faydalı ola bilər. Yenə də, bu, qeyri-null dəyərləri ciddi bir səhv olan çətin tipli məntiqi ifadə ilə müqayisə etdiyiniz hallardır. if (-1) hələ də burada qalır.

 ╔═══════════════════════════════════════╦═══════════════════╦═══════════╗ ║ Original ║ Equivalent ║ Result ║ ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║ ║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║ ║ Order doesn't matter... ║ ║ ║ ║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║ ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best ╚═══════════════════════════════════════╩═══════════════════╩═══════════╝ 

Hər şey sizin mühərrikinizdən asılı olaraq hətta daha xeyirlidir. Məsələn, WScript bir mükafat qazanır.

 function test() { return (1 === 1); } WScript.echo(test()); 

Mesaj qutusundakı -1-i göstərəcək bəzi tarixi jiva Windows sayəsində ! Komanda satırında cmd.exe-i cəhd edin və baxın! Ancaq WScript.echo(-1 == test()) hələ də 0 və ya WScript yalanını verir. Bir göz atın. Bu, iyrəncdir.

İstehsal müqayisəsi :)

Amma iki məna varsa mənə bərabər həqiqəti / saxtakarlıqları yoxlamaq lazımdırmı?

myVar1 = 0; ki, myVar1 = 0;myVar2 = undefined; .

  • myVar1 === myVar2 0 === undefined və açıq-aydın yanlış.
  • !!myVar1 === !!myVar2 var !!0 === !!undefined ! Eyni həqiqət! (Bu halda, hər ikisi də "saxtakarlığın məqbulluğu var").

Belə ki, hər iki dəyişənin eyni hüquqlara malik olub olmadığını yoxladığınız bir vəziyyət varsa, "məntiqi dəyişənlər" istifadə etmək üçün lazım olan yeganə yer ola bilərmi? Yəni, istifadə edin !! iki varsın doğru və ya yanlış (və ya) olduğundan əmin olmaq lazımdırsa, yəni eşit (və ya) doğru deyildir.

Bunun üçün böyük, təsadüfi istifadə vəziyyətini düşünmürəm. Bəlkə də formada "əlaqəli" sahələr var?

 if (!!customerInput.spouseName !== !!customerInput.spouseAge ) { errorObjects.spouse = "Please either enter a valid name AND age " + "for your spouse or leave all spouse fields blank."; } 

Belə ki, indi saxta və həyat yoldaşınızın adı və yaşı üçün düzgünlük varsa, davam edə bilərsiniz. Əks təqdirdə, dəyəri (və ya çox erkən nikah) olan yalnız bir sahəyə errorObjects və səhv errorObjects kolleksiyasında əlavə bir səhv errorObjects .


EDİT 24 Oktyabr 2017:

Açıq məntiqi dəyərləri gözləyən üçüncü tərəf kitabxanaları

Burada maraqlı bir vəziyyət ... !! Üçüncü tərəf kitabxanaları açıq Boolean dəyərlərini gözlədikdə bu faydalı ola bilər.

Məsələn, JSX (React)-də saxta sadə saxtakarlıqla işləməyən xüsusi bir məna var. JSX-də aşağıdakı kimi bir şeyə dönməyə çalışarsanız, mesajCount-də int ...

{messageCount <div>You have messages!</div>}

... sıfır mesajlarınız olduğunda React'in 0 edəcəyini görmək üçün təəccüblənə bilərsiniz. JSX üçün göstərilməməsi üçün açıq şəkildə yalnış qayıtmaq lazımdır. Yuxarıdakı bəyanat 0 qaytarır, bu da JSX-nin xoşbəxtliklə görüntülüyünü göstərir. Count: {messageCount <div>Get your count to zero!</div>} olmadığını söyləyə bilməz Count: {messageCount <div>Get your count to zero!</div>} (və ya daha az kontrived).

  • Bir düzeltme bangbang daxildir, bu, 0 dan 0 ə qüvvəyə minir, false :
    {!!messageCount <div>You have messages!</div>}

  • JSX sənədləri daha aydın olmağınızı, öz-özünə şərh kodunu yazmanızı və məcburi emal gücünü müqayisə etmək üçün istifadə etdiyini göstərir. {messageCount > 0 <div>You have messages!</div>}

  • Mən saxta bir üçlü ilə manipulyasiya etmək daha əlverişlidir -
    {messageCount ? <div>You have messages!</div> : false}

Bunun bir JSX konvensiyası olduğunu, tək bir JavaScript xüsusiyyətinin olmadığını unutmayın .

Amma işlənmiş JSX-də qəribə bir 0 görürsünüzsə, saxta sərbəst idarə olunma barədə düşünün.

54
29 апр. Cavab ruffin Apr 29 verilir 2015-04-29 21:14 '15 at 21:14 2015-04-29 21:14

Bu, yalnız iki dəfə məntiqi olmayan operator deyil - məsələn, bir şeyi booleana çevirmək üçün istifadə olunur:

 true === !!10 false === !!0 
48
24 апр. Cavab Greg 24 apr. 2009-04-24 11:18 '09 at 11:18 'da 2009-04-24 11:18

Sonuncu bir boolean dəyərinə çevrilir.

29
10 сент. Paul McMillan tərəfindən verilmiş cavab 10 sentyabr 2009-09-10 20:27 '09 da 20:27 'da

Bu ikiqat əməliyyat not . Birincisi ! dəyəri booleana çevirir və onun boolean dəyərini ters çevirir. İkincisi ! qaytarılması dəyərini inverts.

23
10 сент. Bill Lizard tərəfindən verilmiş cavab 10 Sep. 2009-09-10 20:28 '09 saat 20:28 'də 2009-09-10 20:28

Boolean() döküm funksiyasının davranışını simüle edir. Əvvəlcədən işlədilmədən asılı olmayaraq məntiqi bir dəyər qaytarır. İkincisi, Booleanın dəyərini qəbul NOT və bu səbəbdən də dəyişənin məntiqi dəyərini true . Nəticə bu dəyər üçün Boolean() funksiyasından istifadə etməklə eynidır.

21
23 марта '11 в 14:53 2011-03-23 14:53 Cavab Prakash 23 mart '11, saat 14:53 'də verilir 2011-03-23 ​​14:53

Görünür, operator !! ikiqat inkarına gətirib çıxarır.

 var foo = "Hello World!"; !foo // Result: false !!foo // Result: true 
20
24 апр. 24 Aprel tarixində Steve Harrison tərəfindən cavab verildi 2009-04-24 11:20 '09 at 11:20 'da 2009-04-24 11:20

!! "məntiqli deyil", bu, əsasən, "məna vermək" mənasını əks etdirir. İkincisi! bu dəyəri çevirir. Beləliklə, !!enable " !!enable verməyin" deməkdir ki, bu funksiyanı mantıksallıq kimi enable .

17
10 сент. Annika Backstrom tərəfindən verilmişdir cavab Sep 10 2009-09-10 20:29 '09 da 20:29 'də 2009-09-10 20:29

Mən düşünürəm ki, bir məntiqi VƏ / VƏ ilə birləşdirilmiş vəziyyət məntiqi bir dəyər verməyəcək, lakin sonuncu uğur və ya halda ilk uğursuzluq, eləcə də ilk uğur və ya sonuncu uğursuzluq || zəncir şərtləri.

 res = (1  2); // res is 2 res = (true  alert) // res is function alert() res = ('foo' || alert) // res is 'foo' 

Həqiqi bir Boolean əlifbasına şərait tətbiq etmək üçün, ikiqat neytrallıqdan istifadə edə bilərik:

 res = !!(1  2); // res is true res = !!(true  alert) // res is true res = !!('foo' || alert) // res is true 
16
25 мая '16 в 13:18 2016-05-25 13:18 Cavab 25 iyun 'da 13:18' də Grey tərəfindən verilir . 2016-05-25 13:18

İnşaat !! hər hansı bir JavaScript ifadəsini boolean ekvivalentinə çevirmək üçün asan bir yoldur.

Məsələn: !!"he shot me down" === true!!0 === false .

13
09 апр. Navin Rauniyar tərəfindən verilmiş cavab 09 Apr 2014-04-09 07:29 '14 də 7:29 2014-04-09 07:29

Bu bir operator deyil, iki. Bu, aşağıdakılara bərabərdir və boolean dəyərə dəyər vermək üçün sürətli bir vasitədir.

 val.enabled = !(!enable); 
11
11 сент. Cavab 11 sentyabrda Justin Johnson tərəfindən verilir . 2009-09-11 00:19 '09 da 0:19 'da 2009-09-11 00:19

Operatorlar və operatoru və operatoru ? kodun hansı sahəsini işlədəcəyini müəyyən etmək üçün həqiqət dəyərlərini istifadə edin. Məsələn, NaN və boş simli sıfır nömrələri yalan, lakin digər nömrələr və strings doğru. Nesneler doğrudur, lakin qeyri-müəyyən və null səhvdir.

Cüt təkzib operatoru !! dəyərin həqiqət dəyərini hesablayır. Bunlar əslində iki operatordur, burada !!x deməkdir !(!x) və aşağıdakı kimi davranır:

  • !x xəta deyilsə, !x true!!x false .
  • !x xətt varsa, !x false!!x !x xəttidir.

Üst səviyyədə istifadə edərkən bir boolean kontekstində ( if , və ya ? ) Operator !! davranışla işləmir. Məsələn, if (x)if (!!x) eyni şey deməkdir.

Praktiki istifadə

Ancaq bir neçə praktiki tətbiq var.

Bir istifadə etmək asanlıqla bir obyektin həqiqət dəyərinə kompres edilməsidir ki, kodunuzda böyük bir obyektə müraciət yoxdur və onu saxlaya bilərsiniz. !!some_big_object yerine !!some_big_object bir dəyişən təyin etmək üçün zibil kolleksiyasına some_big_object imkan verir. Bu, bir obyektin yaradılan hallarda və ya brauzer funksiyasının aşkarlanması kimi null və ya müəyyən olmayan bir dəyər kimi saxta dəyər yaradır.

C-müvafiq operatoru haqqında cavabda qeyd etdiyim başqa bir istifadə !! , - bu, ümumi çap və çap diaqnostikasını axtarmaq edən "lint" vasitələridir. Məsələn, C və JavaScript-də, boolean əməliyyatlar üçün bəzi ümumi misprintlər çox Boolean olmayan digər davranışlar yaradır:

  • if (a = b) , b həqiqətinin dəyərinin istifadəsinin ardından tapşırıqdırsa; if (a == b) - bərabərlik müqayisəsi.
  • if (a b) bitməzdirsə və; if (a b) məntiqidirsə, 2 5 - 0 (yanlış dəyər); 2 5 doğru.

Operator !! yazdığınız şeyin nə demək olduğunu anlamadığını təmin edir: bu əməliyyatı yerinə yetirin, sonra nəticəin əsl dəyərini götürün.

Üçüncü istifadə məntiqi XOR və məntiqi XNORun yaradılmasıdır. C və JavaScript-də a b mantıksal bir (və hər iki tərəf doğru olduqda) yerinə yetirir və a b bitwise yerinə yetirir. AND a || b a || b mantıksal OR (gerçəkdən ən azı biri doğru) və a | b a | b bitsin VEYƏ yerinə yetirir. XOR (eksklüziv VEYA) bir bit bənzəri var, bəli, lakin məntiqi XOR üçün heç bir daxili operator yoxdur (bir tərəf doğru olduğunda doğru). Məsələn, bir istifadəçinin iki sahədən birində mətn daxil etməsinə icazə verə bilərsiniz. Nə edə bilərsən onları həqiqətə çevirmək və onları müqayisə etmək !!x !== !!y .

8
06 марта '16 в 17:46 2016-03-06 17:46 Cavab Damian Yerrick tərəfindən 06 Mart '16' da 17:46 2016-03-06 17:46 'də verilir

Mən C ++-dan qaçırdım ki, burada insanlar yalnış olur! operator deyil, operator bool deyil.

Beləliklə, mənfi (və ya müsbət) cavab almaq üçün, bu halda ilk istifadə etməyiniz lazımdır! operatora boolean dəyəri qazanmaq üçün, amma müsbət hala nəzarət etmək istəyirsinizsə, istifadə edin!.

8
24 апр. Darren Clark tərəfindən 24 apreldə cavab verildi 2009-04-24 11:33 '09 at 11:33 2009-04-24 11:33

!! bu əməliyyat iki dəfə bir yerdə istifadə edir ! dəyəri boolean çevirmək və onu çevirmək, burada necə görmək üçün sadə bir nümunə !! işləri:

Birincisi, bir yeriniz var:

 var zero = 0; 

!0 , bu, bir boolean dəyərinə çevrilir və true olaraq qiymətləndiriləcək, çünki 0 falsy , beləliklə siz geri dönüş dəyərini alırsınız və onu boolean dəyərə falsy , true .

 !zero; //true 

ancaq dəyərin tərs məntiqi bir versiyasına ehtiyacımız yoxdur, buna görə nəticəni almaq üçün yenidən ləğv edə bilərik! Buna görə başqa bir şey istifadə edirik ! ,

Əsasən !! bir boolean dəyərinə sahib olduğumuzdan əmin olun, yalan, doğru və ya simli və s.

Beləliklə, bu, javascriptdə Boolean funksiyasından istifadə etməklə, lakin dəyəri boolean dəyərə çevirmək üçün sadə və qısa yol:

 var zero = 0; !!zero; //false 
7
24 июня '17 в 7:16 2017-06-24 07:16 Cavab Əlireza tərəfindən 24 İyun '17 'də 7:16 2017-06-06 07:16' də verilir

Burada böyük ton cavablar var, amma əgər bu qədər oxuyursan, mənə kömək etmədi. Konsolda Chrome-da (və s.) Açın və yazmağa başlayın:

 !(!(1)) !(!(0)) !(!('truthy')) !(!(null)) !(!('')) !(!(undefined)) !(!(new Object()) !(!({})) woo = 'hoo' !(!(woo)) ...etc, etc, until the light goes on ;) 

Təbii ki, bu, yalnız yazaraq! bəzilərinə baxdıqda, əlavə parantezlər daha anlaşılır olmağa kömək edə bilər.

7
24 апр. Cavab Warren Davis 24 apr tərəfindən verilir . 2014-04-24 16:05 '14 saat 16:05 'da 2014-04-24 16:05

!!x Boolean(x)

İlk zərbə js mühərriki Boolean(x) işə salmağa səbəb olur, həm də dəyərin ters çevrilməsində yan təsir göstərir. Beləliklə, ikinci tətil yan təsirini ləğv edir.

7
04 дек. Greg Gum tərəfindən verilmiş cavab 04 dekabr. 2015-12-04 15:50 '15 at 15:50 2015-12-04 15:50

Double boolean negation. Tez-tez müəyyən edilməmiş dəyəri yoxlamaq üçün istifadə olunur.

7
02 дек. Sergey Ilinsky tərəfindən verilmiş cavab 02 Dek 2010-12-02 23:21 '10 at 23:21 2010-12-02 23:21

Bu, hər şeyi boo-boo edir.

Məsələn:

 console.log(undefined); // -> undefined console.log(!undefined); // -> true console.log(!!undefined); // -> false console.log('abc'); // -> abc console.log(!'abc'); // -> false console.log(!!'abc'); // -> true console.log(0 === false); // -> undefined console.log(!0 === false); // -> false console.log(!!0 === false); // -> true 
5
25 июля '18 в 6:52 2018-07-25 06:52 Cavab Xuong tərəfindən 25 iyul '18, 6:52 2018-07-25 06:52 'də verilir

buradakı js kodu parçasıdır

 var requestAnimationFrame = $window.requestAnimationFrame || $window.webkitRequestAnimationFrame || $window.mozRequestAnimationFrame; var rafSupported = !!requestAnimationFrame; 

onların niyyəti istəkdə funksiyanın mövcudluğuna əsaslanaraq rafSupported-ə doğru və ya yalançı qurmaqdır AnimationFrame

Bunu aşağıdakı kimi yoxlamaqla əldə edə bilərsiniz:

 if(typeof requestAnimationFrame === 'function') rafSupported =true; else rafSupported =false; 

qısa yoldan istifadə edə bilərsiniz!

 rafSupported = !!requestAnimationFrame ; 

поэтому, если requestAnimationFrame была назначена функция тогда ! requestAnimationFrame будет ложным и еще одним! из этого было бы верно

если requestAnimationFrame был оценен undefined, тогда ! requestAnimationFrame будет правдой и еще одним! из этого будет ложь

4
ответ дан JeevanReddy Avanaganti 04 марта '15 в 11:25 2015-03-04 11:25

Некоторые операторы в JavaScript выполняют неявные преобразования типов и иногда используется для преобразования типов.

Унарный оператор ! преобразует свой операнд в булев и отрицает его.

Этот факт приводит к следующей идиоме, которую вы можете увидеть в своем исходном коде:

 !!x // Same as Boolean(x). Note double exclamation mark 
3
ответ дан GibboK 01 июля '15 в 10:29 2015-07-01 10:29

Возвращает логическое значение переменной.

Вместо этого может использоваться класс Boolean .

(пожалуйста, прочитайте описания кода)

 var X = "test"; // X value is "test" as a String value var booleanX = !!X // booleanX is `true` as a Boolean value beacuse non-empty strings evaluates as `true` in boolean var whatIsXValueInBoolean = Boolean(X) // whatIsXValueInBoolean is `true` again console.log(Boolean(X) === !!X) // writes `true` 

А именно, Boolean(X) = !!X в использовании.

Пожалуйста, проверьте фрагмент кода ниже

3
ответ дан efkan 11 июля '17 в 10:03 2017-07-11 10:03

Я просто хотел добавить, что

 if(variableThing){ // do something } 

совпадает с

 if(!!variableThing){ // do something } 

Но это может быть проблемой, когда что-то есть undefined.

 // a is undefined, b is empty object. var a, b = {}; // Both of these give error a.foo is not defined etc. // you'd see the same behavior for !!a.foo and !!b.foo.bar a.foo b.foo.bar // This works -- these return undefined a  a.foo b.foo  b.foo.bar b  b.foo  b.foo.bar 

Трюк здесь: цепочка > вернет первое значение false , которое он находит, - и это может быть передано в оператор if и т.д. Так что если b.foo undefined, он вернет undefined и пропустит оператор b.foo.bar , и мы не получим ошибки.

Приведенный выше возврат undefined, но если у вас есть пустая строка, false, null, 0, undefined, эти значения вернутся и вскоре, когда мы встретим их в цепочке - [] и {} , оба truthy.

3
ответ дан Ryan Taylor 20 окт. '16 в 0:00 2016-10-20 00:00

!! аналогичен использованию логического конструктора или, скорее, больше похож на Логическая функция.

ответ дан Eternal Darkness 17 апр. '17 в 17:47 2017-04-17 17:47
 a = 1; alert(!a) // -> false : a is not not defined alert(!!a) // -> true : a is not not defined 

Для !a он проверяет, существует ли a НЕ , а !!a проверяет, определена ли переменная.

!!a совпадает с !(!a) . Если a определено, a - true , !a - false , а !!a - true .

2
ответ дан user3698272 28 июня '14 в 6:35 2014-06-28 06:35

Использовать логический неоператор два раза
это означает! true = false
и!! true = true

2
ответ дан Abhay Dixit 15 июля '16 в 13:25 2016-07-15 13:25
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос