මොකක්ද !! (නොවේ) ජාවාස්ක්‍රිප්ට් හි ක්‍රියාකරු?


3124

විශ්මයජනක කරුණු දෙකක ස්වරූපයෙන් මා හඳුනා නොගත් ක්‍රියාකරුවෙකු භාවිතා කරන බව පෙනෙන සමහර කේත මම දුටුවෙමි. !! . කරුණාකර මෙම ක්‍රියාකරු කරන්නේ කුමක්දැයි මට කියන්න පුළුවන්ද?

මා මෙය දුටු සන්දර්භය වූයේ,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

947
එය මතක තබා ගන්න "bang, bang you boolean"
Gus

75
වාර්තාවක් සඳහා, එහි සඳහන් කර ඇති දේ නොකරන්න. කරන්න if(vertical !== undefined) this.vertical = Boolean(vertical);- එය සිදුවෙමින් පවතින දෙය වඩා පිරිසිදු හා පැහැදිලි ය, අනවශ්‍ය පැවරුමක් අවශ්‍ය නොවේ, සම්පුර්ණයෙන්ම ප්‍රමිතියකින් යුක්ත වන අතර (වර්තමාන එෆ්එෆ් සහ ක්‍රෝම් මත) වේගවත් වේ jsperf.com/boolean-conversion-speed .
ෆිල් එච්

73
!! ක්‍රියාකරුවෙකු නොවේ. එය හුදෙක්! ක්රියාකරු දෙවරක්.
විවේක්

65
@schabluk, වාර්තාව සඳහා, මෙහෙයුම් සඳහා හේතුව වන්නේ මෙම !!5/0නිෂ්පාදනය Infinityකරනවාට වඩා trueවිසින් නිෂ්පාදනය ලෙස, Boolean(5/0). - aka - !!5/0ට සමාන වන්නේ ක්‍රියාකරුට වඩා ඉහළ ප්‍රමුඛතාවයක් ඇති නිසාය. ඔබට ද්විත්ව වළල්ලක් භාවිතයෙන් බූලීයකරණය කිරීමට අවශ්‍ය නම්, ඔබ භාවිතා කිරීමට අවශ්‍ය වනු ඇත. (!!5)/0true/0!/5/0!!(5/0)
matty

3
Us ගුස් ඔබ දන්නා පරිදි, මම ඔබේ අදහස 2012 දී නැවත කියවා ඇත්තෙමි. එතැන් සිට ගත වූ අවුරුදු 7 ක කාලය තුළ මම නිතරම හාස්‍යජනක ලෙස මගේ මනසෙහි කියා සිටියේ "බං බං! ඔබ බූලියන්!" බූලියන් පෙරළන විට, එහි ප්‍රති .ලයක් ලෙස මට සැමවිටම මතකය. මම අද ඔබේ අදහස සොයා බලා ඔබට දන්වන්න තීරණය කළා :-)
සැකරි ෂූස්ලර්

Answers:


2766

බවට පරිවර්තනය Objectකරයි boolean. එය falsey (උදා: නම් 0, null, undefined, ආදිය), එය වනු ඇත false, එසේ නැත්නම්, true.

!oObject  // inverted boolean
!!oObject // non inverted boolean so true boolean representation

එබැවින් !!ක්‍රියාකරුවෙකු නොවේ, එය !දෙවරක් ක්‍රියාකරු පමණි .

තාත්වික ලෝක උදාහරණය "ටෙස්ට් අයිඊ අනුවාදය":

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

ඔබ නම්

console.log(navigator.userAgent.match(/MSIE 8.0/));  
// returns either an Array or null  

නමුත් ඔබ නම්

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

123
එය නොබැඳි බූලියනයක් ප්‍රතිලෝම බූලියන් බවට පරිවර්තනය කරයි (නිදසුනක් ලෙස! 5 අසත්‍යය, 5 යනු JS හි ව්‍යාජ නොවන අගයක් බැවින්), පසුව බූලියන්-ඉන්වර්ටර් මඟින් ඔබට මුල් අගය බූලියන් ලෙස ලැබෙනු ඇත (එසේ නම් 5 5 සත්‍ය වන්න).
චක්

111
එය විස්තර කිරීමට පහසු ක්‍රමයක් නම්: බූලියන් (5) === !! 5; එකම වාත්තු කිරීම, අඩු චරිත.
මීකා ස්නයිඩර්

39
සත්‍ය අගයන් බූලියන් සත්‍ය බවට පරිවර්තනය කිරීම සඳහා මෙය භාවිතා කරන අතර ව්‍යාජ සාරධර්ම ද බූලියන් අසත්‍යය වේ.
thetoolman

13
Ic මිකා ස්නයිඩර් පරෙස්සම් වන්න ජාවාස්ක්‍රිප්ට් හි නව බූලියන් () සමඟ බූලියන් කොටු කරන වස්තූන් නිර්මාණය කරනවා වෙනුවට බූලියන් ප්‍රාථමික භාවිතා කිරීම වඩා හොඳය. වෙනස බැලීමට උදාහරණයක් මෙන්න: jsfiddle.net/eekbu
winorvartan

4
මා දන්නා පරිදි, මෙම බැන්ග්-බං රටාව ප්‍රයෝජනවත් නොවේ නම් (… _ ප්‍රකාශය; බූලියන් ආපසු ලබා දිය යුතු ශ්‍රිතයක ආපසු ප්‍රකාශයක පමණි.
rds

857

එය වර්ග පරිවර්තනයක් කිරීමට බිහිසුණු අපැහැදිලි ක්‍රමයකි.

!නොවේ . ඒ නිසා !truefalse, සහ !falsetrue. !0වේ true, සහ !1වේ false.

එබැවින් ඔබ අගයක් බූලියන් බවට පරිවර්තනය කර, පසුව එය පෙරළා, නැවත එය පෙරළා දමයි.

// Maximum Obscurity:
val.enabled = !!userId;

// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;

// And finally, much easier to understand:
val.enabled = (userId != 0);

74
!! බොරු = අසත්‍යය. !! true = true
cllpse

89
"තේරුම් ගැනීමට වඩා පහසු" ප්‍රභේදය මෙහි තේරුම් ගැනීමට වඩා පහසු ද? 0 ට එරෙහි චෙක්පත 0 ට එරෙහි සත්‍ය චෙක්පතක් නොවේ, නමුත් ජාවාස්ක්‍රිප්ට් 0 ට සමාන යැයි සලකන තරමක් අමුතු සාරධර්ම ලැයිස්තුවට එරෙහි චෙක්පතක්, userId ? true : false පරිවර්තනයක් සිදුවන බව වඩාත් පැහැදිලි වන අතර පරිශීලක අයිඩී හි අගය පැහැදිලිවම සකසා ඇති අවස්ථාව හසුරුවයි.undefined
බෙන් රෙජෙන්ස්පන්

54
මගේ මොළයේ ප්රහේලිකාව ලිහා ඕනෑම ප්රශ්නයක් නැහැ !!varබවට Boolean(var).. සහ !!වේගයෙන් (ක්රියාවලියට අඩු උපදෙස්) සහ විකල්ප වඩා කෙටි වෙයි.
adamJLev

7
Ick රිකී ක්ලාක්සන් ප්‍රධාන වශයෙන් එය කියවීමේ හැකියාව සඳහා වන බැවින් එය කෘතිමව අවශ්‍ය නොවේ. සමහරු සෑම විටම වරහන් තුළ කොන්දේසිගතව ඔතා තැබීමේ සම්මුතිය භාවිතා කරති.
ඩේව් රේගර්

8
මම මේකට එකඟ නැහැ. userId != 0සඳහා සත්‍ය null, NaNසහ undefined, නමුත් අසත්‍යය false. ඔබට හරියටම එම හැසිරීම අවශ්‍ය නම්, ඔබ ඒ ගැන පැහැදිළි විය යුතුය. නමුත් එය හරියටම සමාන ආකාරයකින් ක්‍රියාත්මක වුවද, එම අගයන් මෙහි ව්‍යාජ ලෙස පැමිණීමට !!userIdඔබට අවශ්‍යද , නැතහොත් ජාවාස්ක්‍රිප්ට් වර්ගයේ පරිවර්තන නීති සලකා බැලීමට ඔබ අසමත් වූවාද යන්න පැහැදිලි නැත .
philh

449

!!exprප්‍රකාශනයේ සත්‍යතාවය මත පදනම්ව බූලියන් අගයක් ( trueහෝ false) ලබා දෙයි . බූලියන් නොවන වර්ගවල භාවිතා කරන විට එය වඩාත් අර්ථවත් කරයි. මෙම උදාහරණ සලකා බලන්න, විශේෂයෙන් 3 වන උදාහරණය සහ ඉදිරියට:

          !!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!

63
සඳහන් කිරීම වටී:!!new Boolean(false) // true
කැමිලෝ මාටින්

43
... නමුත් එසේම!!Boolean(false) // false
කැමිලෝ මාටින්

97
new Boolean(false)වස්තුවක් වන අතර වස්තුවක ව්‍යාජ වටිනාකමක් තිබුණද එය සත්‍ය වේ!
සල්මාන් ඒ

3
ඔව්, මම දන්නවා, නමුත් බොහෝ දේශීය ඉදිකිරීම් කර්මාන්තකරුවාගේ (බව සලකා String, Number, Date, ආදිය) ද ශ්රිත callable කිරීමට අදහසක් ඇත, එහෙත් මේ අවස්ථාවේ දී ප්රතිඵලය වෙනස් වේ!
කැමිලෝ මාටින්

4
@CamiloMartin: පමණක් බව අවබෝධ new Boolean(false)ප්රතිලාභ යනු objectඇති අතර Boolean(false)එම නැවත ප්රාථමික false . මෙය අර්ථවත් කරයි යැයි සිතමි.
සල්මාන් ඒ

155

තේ ටිකක් බොන්න:

!!ක්‍රියාකරුවෙකු නොවේ. එය ද්වි-භාවිතයයි !- එය තාර්කික "නොවේ" ක්‍රියාකරු වේ.


න්යාය තුල:

! වටිනාකමක් නැති දෙයක “සත්‍යය” තීරණය කරයි:

  • සත්යය එය falseනොවේ true(ඒ නිසා ප්රති !falseresults ල ලැබෙනු ඇත true)

  • සත්යය trueඑය නොවේfalse(ඒ නිසා ප්රති !trueresults ල ලැබෙනු ඇත false)


!!වටිනාකමක් නැති දේවල “සත්‍යය” තීරණය කරයි :

  • සත්යය trueඑය නොවේ නොවේ true (එම නිසා ප්‍රති !!trueresults ල ලැබෙනු ඇත true)

  • සත්‍යය එය falseඑසේ නොවේ false (එම නිසා ප්‍රති !!falseresults ල ලැබෙනු ඇත false)


සංසන්දනය කිරීමේදී අප තීරණය කිරීමට බලාපොරොත්තු වන්නේ යොමුකිරීමේ වටිනාකම පිළිබඳ “සත්‍යය” මිස නොවේ වටිනාකම . වටිනාකමක් පිළිබඳ සත්‍යය දැන ගැනීමට අපට අවශ්‍ය විය හැකි භාවිත අවස්ථාවක් තිබේ, අප අගය false(හෝ අසත්‍යය) යැයි අපේක්ෂා කළත්, හෝ වටිනාකම ටයිප් නොවිය යුතු යැයි අපි අපේක්ෂා කළත් boolean.


ප්රායෝගිකව:

ගතික ටයිප් කිරීම මගින් (හෝ "තාරා ටයිප් කිරීම") විශේෂාංග ක්‍රියාකාරිත්වය (සහ මේ අවස්ථාවේ දී, වේදිකා අනුකූලතාව) හඳුනා ගන්නා සංක්ෂිප්ත ශ්‍රිතයක් සලකා බලන්න . trueපරිශීලකගේ බ්‍රව්සරය HTML5 <audio>මූලද්‍රව්‍යයට සහය දක්වන්නේ නම් නැවත පැමිණෙන ශ්‍රිතයක් ලිවීමට අපට අවශ්‍යය , නමුත් ශ්‍රිතය <audio>නිර්වචනය නොකළහොත් දෝෂයක් ඇතිවීමට අපට අවශ්‍ය නැත ; try ... catchහැකි දෝෂයන් හැසිරවීමට අපට භාවිතා කිරීමට අවශ්‍ය නැත (ඒවා දළ නිසා); තවද , විශේෂාංගය පිළිබඳ සත්‍යය නිරන්තරයෙන් හෙළි නොකරන ශ්‍රිතය තුළ චෙක්පතක් භාවිතා කිරීමට අපට අවශ්‍ය නැත (නිදසුනක් ලෙස, HTML5 සහය නොදක්වුවද, document.createElement('audio')මූලද්‍රව්‍යයක් තවමත් නිර්මාණය කරයි ).<audio><audio>


ප්රවේශයන් තුන මෙන්න:

// 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

සෑම ශ්‍රිතයක්ම a සඳහා තර්කයක් පිළිගනී <tag> සහattribute සෙවීම සඳහා , නමුත් ඒවා එකිනෙකට වෙනස් අගයන් ලබා දෙන්නේ සැසඳීම් මගින් තීරණය වන දේ මත පදනම්වය.

නමුත් රැඳී සිටින්න, තවත් බොහෝ දේ ඇත!

මෙම විශේෂිත උදාහරණයේ, අයෙක් සරලවම තරමක් භාවිතා කර දේපල සඳහා පරීක්ෂා කළ හැකි බව ඔබ ඇතැම් විට දැක වැඩි performant ප්රශ්නයට වස්තුව නම් පරීක්ෂා කිරීම මාර්ගයෙන් ඇත දේපළ. මෙය කිරීමට ක්‍රම දෙකක් තිබේ:

// 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

අපි කනගාටුයි ...

මෙම තත්වයන් කෙතරම් දුර්ලභ වුවත්, වඩාත්ම සංක්ෂිප්ත, වඩාත්ම ක්‍රියාකාරී, ඒ නිසා trueබූලියන් නොවන, සමහර විට නිර්වචනය නොකළ වටිනාකමක් ලබා ගැනීම සඳහා වඩාත් කැමති මාධ්‍යයන් භාවිතා කිරීම මගින් අවස්ථා කිහිපයක් තිබිය හැකිය !!. මෙය හාස්‍යජනක ලෙස එය ඉවත් කරයි කියා බලාපොරොත්තු වෙමු.


1
මුළුමනින්ම නියම පිළිතුර, නමුත් එහි උපයෝගීතාව දැකීමට මා අසමත් වේ !! ඉදි කරන්න. ක සිට if()දුර ලෙස ලෙස "truthiness" සිට === සැබෑ - ප්රකාශයක් මේ වන විටත් වීජ කිරීමට ප්රකාශනය අතුගා දැමීම යි සුවිශේෂව වීජ කිරීමට පරීක්ෂණ කාර්යය නැවත අගය වාත්තු අතිරික්ත වන if()ප්රකාශයක් කෙසේ හෝ යයි. එසේත් නැතිනම් ඔබට සත්‍ය ප්‍රකාශනයක් අවශ්‍ය වූ අවස්ථාවක් මට නැති වී trueතිබේද?
ටොම් ඔගර්

1
OmTomAuger if()ප්‍රකාශයන් ව්‍යාජ අගයන්ට එරෙහිව බූලියන් දමයි, නමුත් ඔබට ඇත්ත වශයෙන්ම වස්තුවක් මත බූලියන් ධජයක් තැබීමට අවශ්‍ය යැයි කියන්න - එය if()ප්‍රකාශයක් මෙන් එය දමන්නේ නැත. උදාහරණයක් ලෙස object.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()එක්කෝ සකස් කරනු ඇත trueහෝ falseසැබෑ ආපසු ලැබෙන අගය කිරීම වෙනුවට. තවත් උදාහරණයක් නම්, සමහර පරිපාලකයින්ගේ විය හැකි idඅතර 0පරිපාලකයින් නොවන අය හැඳුනුම් 1හෝ ඊට වැඩි විය හැකිය. ලබා ගැනීමට trueකෙනෙකු ඔබට කළ හැකි පරිපාලකවරයෙකු නොවේ නම් person.isNotAdmin = !!admin.id. භාවිත අවස්ථා ස්වල්පයක් ඇත, නමුත් එය ඇති විට එය සංක්ෂිප්ත ය.
බෙනී

103

!!එහි දකුණට ඇති අගය එහි සමාන බූලියන් අගයක් බවට පරිවර්තනය කරයි. (දුප්පත් මිනිසාගේ "ටයිප්-වාත්තු කිරීමේ ක්‍රමය ගැන සිතන්න). එහි අභිප්‍රාය සාමාන්‍යයෙන් පා the කයාට කේතය විචල්‍යයේ ඇති අගය කුමක්දැයි නොසලකන නමුත් එහි “සත්‍ය” අගය කුමක්ද යන්න දැනුම් දීමයි .


4
නැතහොත් දකුණු පස ඇති බූලියන් අගයකදී එය කිසිවක් නොකරයි.
ඩැනියෙල් ඒ. වයිට්

3
An ඩැනියෙල්: !තවමත් අගය දකුණට හරවයි . බූලියන් සම්බන්ධයෙන් දකුණේ බොහෝ දෙනා !අගය ප්‍රතික්ෂේප කරන අතර වම-බොහෝ දෙනා !එය නැවත වරක් ප්‍රතික්ෂේප කරයි. ශුද්ධ ආචරණය නම් කිසිදු වෙනසක් සිදු නොවීමයි, නමුත් බොහෝ එන්ජින් ද්විත්ව නිෂේධනය සඳහා ඔප් කේත ජනනය කරනු ඇත.
ක්‍රෙසන්ට් නැවුම්

නමුත් කාරණය කුමක්ද? මම if(0){...ජාවාස්ක්‍රිප්ට් කළහොත් මෙය අසත්‍ය බව දැනටමත් දනී. කීමට වඩා හොඳ ඇයි if(!!0){...?
කෝඩි බග්ස්ටයින්

කාරණය වන්නේ එහි අන්තර්ගතය ඔබ නොදන්නා විචල්‍යයන් සඳහා ය; එය පූර්ණ සංඛ්‍යාවක් හෝ නූලක්, වස්තුවක් හෝ ශුන්‍ය, නිර්වචනය නොකළ යනාදිය විය හැකි නම් මෙය පැවැත්ම පරීක්ෂා කිරීමට පහසු ක්‍රමයකි.
mix3d

72

!!fooඒකීය නොවන ක්‍රියාකරු දෙවරක් අදාළ වන අතර +fooඅංකයට වාත්තු කිරීම සඳහා යුනරි ප්ලස් භාවිතා කිරීමට සමාන බූලියන් වර්ගයට ''+fooවාත්තු කිරීමට භාවිතා කරයි.

මෙම හක්ක වෙනුවට, ප්‍රාථමික වර්ග වලට අනුරූපී ( භාවිතා නොකරnew ) ඉදිකිරීම් ශ්‍රිත භාවිතා කළ හැකිය.

Boolean(foo) === !!foo
Number(foo)  === +foo
String(foo)  === ''+foo

නමුත් ඔබට නිදසුනක් සමඟ ගැටළු වලට මුහුණ දිය හැකිය. නව බූලියන් (1) නිදර්ශන වස්තුව -> සත්‍ය !! 1 නිදර්ශන වස්තුව -> අසත්‍ය
සීමස්

13
නැත, ඔබට බැහැ: newමගේ පිළිතුරෙහි පැහැදිලිව සඳහන් කර ඇති පරිදි - ඉදිකිරීම්කරුගේ කාර්යයන් නොමැතිව කැඳවන බව සැලකිල්ලට ගන්න
ක්‍රිස්ටෝෆ්

2
අපූරුයි! සත්‍යය වෙනුවට "0" සහිත නූල් අසත්‍ය ලෙස තක්සේරු කිරීමට අවශ්‍ය විට මෙය කුඩා හැක් කිරීමකට ප්‍රයෝජනවත් වේ. (එනම් තේරීම් වලින් අගයන් කියවන විට ඒවා නූල් ලෙස කියවන බැවින්). එබැවින්, ඔබට "0" negative ණ (බූලියන් අසත්‍ය) ලෙස සැලකීමට අවශ්‍ය නම්, එසේ x="0"කරන්න: x=!!+x; //falseඑය Boolean(Number(x))අංකයට සමාන වේ (හෝ + x) "0" නූල 0 ට පරිවර්තනය කරයි, එය අසත්‍ය ලෙස තක්සේරු කරන අතර පසුව බූලියන් (!! x) එය කෙලින්ම බූලියන් වෙතට දමයි. පහසු පීසි!
DiegoDD

2
IeDiegoDD ඔබ !!+xඑදිරිව තෝරා ගන්නේ ඇයි x !== "0"?
placeybordeaux

@placeybordeaux උදාහරණයක් ලෙස ඔබ එය වෙනත් දෙයක් සමඟ සංසන්දනය කිරීමට යන්නේද නැද්ද යන්න නොසලකා අගය පරිවර්තනය කර වෙනත් විචල්‍යයකට පැවරීමට ඔබට අවශ්‍ය විය හැකිය.
DiegoDD

67

වැඩ වලින් අඩක් කරන බොහෝ පිළිතුරු. ඔව්, !!X"X හි සත්‍යතාවය [බූලියන් ලෙස නිරූපණය කෙරේ]" ලෙස කියවිය හැකිය. එහෙත් !!, ප්‍රායෝගිකව කිවහොත්, එක් විචල්‍යයක් සත්‍ය හෝ ව්‍යාජද යන්න සොයා ගැනීම සඳහා එතරම් වැදගත් නොවේ. !!myVar === trueසාධාරණයි myVar. !!X“සැබෑ” බූලියන් සමඟ සංසන්දනය කිරීම ඇත්තෙන්ම ප්‍රයෝජනවත් නොවේ.

ඔබ ලබා ගන්නා !!දෙය නම් එකිනෙකට එරෙහිව විවිධ විචල්‍යයන්ගේ සත්‍යතාව පරීක්ෂා කිරීමේ හැකියාවයි ගන්නේ පුනරාවර්තන, ප්‍රමිතිගත (සහ ජේඑස්ලින්ට් හිතකාමී) ආකාරයකින් .

සරලව වාත්තු කිරීම :(

එනම් ...

  • 0 === falseවේ false.
  • !!0 === falseවේ true.

ඉහත කරුණු එතරම් ප්‍රයෝජනවත් නොවේ. if (!0)ඔබට සමාන ප්‍රති results ල ලබා දෙයි if (!!0 === false). විචල්යයක් බූලියන් වාත්තු කර "සැබෑ" බූලියන් සමඟ සංසන්දනය කිරීම සඳහා හොඳ අවස්ථාවක් ගැන මට සිතිය නොහැකිය.

ජේඑස්ලින්ට්ගේ උපදෙස් වලින් "== සහ! =" බලන්න (සටහන: ක්‍රොක්ෆර්ඩ් ඔහුගේ වෙබ් අඩවිය ටිකක් එහා මෙහා ගෙන යමින් සිටී; එම සබැඳිය යම් අවස්ථාවක දී මියයෑමට බැඳී සිටී) ඇයිද යන්න ගැන ටිකක් දැනගන්න:

== සහ! = ක්‍රියාකරුවන් සංසන්දනය කිරීමට පෙර බලහත්කාරය ටයිප් කරයි. මෙය නරක ය, මන්ද එය '\ t \ r \ n' == 0 සත්‍ය වීමට හේතු වේ. මෙය ආකාරයේ දෝෂ වසං කළ හැකිය. == නිවැරදිව භාවිතා කරන්නේ දැයි JSLint හට විශ්වාසදායක ලෙස නිශ්චය කළ නොහැක, එබැවින් == සහ! = කිසිසේත් භාවිතා නොකිරීම වඩාත් සුදුසුය. ඒ වෙනුවට සෑම විටම වඩා විශ්වාසදායක === සහ! == ක්‍රියාකරුවන් භාවිතා කිරීම වඩාත් සුදුසුය.

වටිනාකමක් සත්‍ය හෝ ව්‍යාජ එකක් යැයි ඔබ සිතන්නේ නම්, කෙටි ආකෘතිය භාවිතා කරන්න. වෙනුවට
(foo != 0)

කියන්න
(foo)

ඒ වෙනුවට
(foo == 0)

කියන්න
(!foo)

සමහර පවතින බව සටහන unintuitive නඩු සඳහා වීජ ගණනාවක් ප්රකාශ නියමිතය ( trueකිරීමට හෙළීමයි 1හා falseකිරීමට 0එය වීජ ගණනාවක් වසරට සාපේක්ෂව). මෙම අවස්ථාවේදී, !!මානසිකව ප්‍රයෝජනවත් විය හැකිය. නැවතත්, මේවා ඔබ බූලියන් නොවන දෘඩ ටයිප් කළ බූලියන් සමඟ සංසන්දනය කරන අවස්ථා වන අතර එය බරපතල වැරැද්දකි. if (-1)තවමත් මෙහි යා යුතු මාර්ගයයි.

╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
               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
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝

ඔබේ එන්ජිම මත පදනම්ව දේවල් පවා පිස්සු වැටේ. උදාහරණයක් ලෙස WScript ත්‍යාගය දිනා ගනී.

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

නිසා ඇතැම් ඓතිහාසික වින්ඩෝස් jive බව කරන්නම් ප්රතිදානය -1 පණිවිඩයක් කොටුව තුළ! Cmd.exe විමසුමේදී එය උත්සාහ කර බලන්න! නමුත් WScript.echo(-1 == test())තවමත් ඔබට 0, හෝ WScript ලබා දෙයි false. අහක බලන්න. එය පිළිකුල් සහගත ය.

සත්‍යතාව සංසන්දනය කිරීම :)

නමුත් මට සමාන සත්‍යයන් / ව්‍යාජ-නෙස් සඳහා පරීක්ෂා කිරීමට අවශ්‍ය අගයන් දෙකක් තිබේ නම් කුමක් කළ යුතුද?

අපට මවා පාන myVar1 = 0;හා myVar2 = undefined;.

  • myVar1 === myVar20 === undefinedහා පැහැදිලිවම බොරු ය.
  • !!myVar1 === !!myVar2ඇත්ත !!0 === !!undefinedසහ ඇත්ත! එකම සත්‍යතාව! (මේ අවස්ථාවේ දී, දෙදෙනාම "ව්‍යාජ සත්‍යතාවයක් ඇත".)

එබැවින් ඔබට "බූලියන්-වාත්තු විචල්‍යයන්" භාවිතා කිරීමට අවශ්‍ය එකම ස්ථානය වනුයේ ඔබ විචල්‍යයන් දෙකම එකම සත්‍යතාවයක් තිබේදැයි පරීක්ෂා කරන තත්වයක් තිබේ නම් නේද? එනම්, භාවිතය !!ඔබ vars දෙකක් නම්, දකින්න අවශ්ය නම් දෙකම truthy හෝ දෙකම falsy (හෝ නැති), එනම් ඊට සමාන (හෝ නැති) truthiness .

මට ඒ සඳහා විශාල, උපක්‍රමශීලී නොවන භාවිත නඩුවක් ගැන සිතිය නොහැකිය. සමහර විට ඔබ පෝරමයක "සම්බන්ධිත" ක්ෂේත්‍ර තිබේද?

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

ඒ නිසා දැන් ඔබ යන දෙකම සඳහා truthy තිබේ නම් හෝ සහකරු හෝ සහකාරිය නම හා වයස අවුරුදු දෙකම සඳහා falsy, ඔබ දිගටම කරගෙන යා හැක. එසේ නොමැතිනම් ඔබට ලැබී ඇත්තේ එක් ක්ෂේත්‍රයක් පමණක් වටිනාකමක් ඇති (හෝ ඉතා ඉක්මණින් විවාහ කර ගත් විවාහයක්) වන අතර ඔබේ errorObjectsඑකතුවෙහි අමතර දෝෂයක් ඇති කළ යුතුය .


සංස්කරණය 24 ඔක්තෝබර් 2017, 6 පෙබරවාරි 19:

පැහැදිලි බූලියන් අගයන් අපේක්ෂා කරන තෙවන පාර්ශවීය පුස්තකාල

මෙන්න සිත්ගන්නා කරුණක් ... !!තෙවන පාර්ශවීය ලිබ්ස් පැහැදිලි බූලියන් අගයන් අපේක්ෂා කරන විට ප්‍රයෝජනවත් විය හැකිය.

නිදසුනක් ලෙස, ජේඑස්එක්ස් හි අසත්‍යය (ප්‍රතික්‍රියා කරන්න) විශේෂ අරුතක් ඇති අතර එය සරල ව්‍යාජයන් මත අවුලුවනු නොලැබේ. ඔබේ ජේඑස්එක්ස් හි පහත සඳහන් දේ වැනි දෙයක් ආපසු ලබා දීමට ඔබ උත්සාහ කළේ නම්, ඉන්ට් එකක් බලාපොරොත්තු වේ messageCount...

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

... ඔබට 0ශුන්‍ය පණිවිඩ ඇති විට ප්‍රතික්‍රියා විදැහුම්කරණය දැක ඔබ පුදුමයට පත් විය හැකිය . JSX ඉදිරිපත් නොකිරීමට ඔබ පැහැදිලිවම අසත්‍යය ආපසු එවිය යුතුය. 0ජේඑස්එක්ස් සතුටින් ඉදිරිපත් කරන ඉහත ප්‍රකාශය නැවත පැමිණේ . එය ඔබට නොමැති බව පැවසිය නොහැක Count: {messageCount && <div>Get your count to zero!</div>}(හෝ අඩු උපක්‍රමයක්).

  • එක් විසඳුමක් වන coerces මෙම bangbang, ඇතුළත් 0බවට !!0වන, false:
    {!!messageCount && <div>You have messages!</div>}

  • JSX හි ලියකියවිලි ඔබට වඩාත් පැහැදිලිව, ස්වයං-අදහස් දැක්වීමේ කේතයක් ලිවීමට සහ බූලියන් වෙත බල කිරීම සඳහා සංසන්දනයක් භාවිතා කිරීමට යෝජනා කරයි.
    {messageCount > 0 && <div>You have messages!</div>}

  • තෘතීයයක් සමඟ ව්‍යාජ ලෙස හැසිරවීමට මට වඩාත් පහසුය -
    {messageCount ? <div>You have messages!</div> : false}

යතුරු ලියනයෙහි එකම ගනුදෙනුව: ඔබට බූලියන් ආපසු ලබා දෙන ශ්‍රිතයක් තිබේ නම් (හෝ ඔබ බූලියන් විචල්‍යයකට අගයක් පවරයි), ඔබට [සාමාන්‍යයෙන්] බූලියන්-වයි අගයක් ආපසු ලබා දීමට / පැවරීමට නොහැකිය; එය තදින් ටයිප් කළ බූලියන් විය යුතුය. මෙම මාර්ගයෙන්, යන සැකය myObjectමුලදීම ඇත , return !myObject;එය වීජ නැවත උත්සවයකට සඳහා ක්රියාත්මක වන නමුත් return myObject;එහෙම කරන්නේ නැහැ. ඔබ return !!myObjectටයිප්ස්ක්‍රිප්ට් හි අපේක්ෂාවන්ට ගැලපේ.

යතුරු ලියනය සඳහා ව්‍යතිරේකය? නම් myObjectවූයේ anyJavaScript ගේ කතිකාවතක් දී, ඔයා තමයි ආපසු තොරව එය නැවත පැමිණීමට !!ඔබේ නැවත ටයිප් වීජ පවා,.

මේවා JSX සහ යතුරු ලියන සම්මුතීන් මිස ජාවාස්ක්‍රිප්ට් වලට ආවේණික නොවන බව මතක තබා ගන්න .

0ඔබේ විදැහුම්කරණය කරන ලද ජේඑස්එක්ස් හි ඔබ අමුතු දේවල් දුටුවහොත් , ලිහිල් ව්‍යාජ කළමනාකරණය ගැන සිතන්න.


හොඳ පැහැදිලි කිරීමක්. ඉතින් ඔබ කියන්නේ !! මෙම සේවක විශේෂාංග හඳුනාගැනීමේ උදාහරණයේ දැඩි ලෙස අවශ්‍ය නොවේද? if (!!window.Worker)
jk7

2
නෑ, ඔබට එය අවශ්‍ය නොවනු ඇත. සත්‍යතාව සහ true“බාහිරව” හරියටම ක්‍රියාත්මක වන්නේ a if. මම දිගින් දිගටම උත්සාහ කරමි, නමුත් qපුස්තකාල උදාහරණයේ දී මෙන්, ඔබ පසුව වටිනාකම නැවත භාවිතා කරන්නේ නම් කියවීමේ හැකියාව හැරුණු කොට, ඉහත සඳහන් කළ “සත්‍යතාවන් සසඳා බලන්න” යන කාරණයට පිටින් සත්‍යතාව බූලියන් වටිනාකමට වඩා කැමති වීමට හේතුවක් ගැන මට සිතිය නොහැකිය. . නමුත් එසේ වුවද, එය තොරතුරු නැති කරන කෙටිමඟක් වන අතර, මම තර්ක කරන්නේ ඔබ සෑම අවස්ථාවකදීම සත්‍යතාව තක්සේරු කිරීමට වඩා හොඳ බවය.
රෆින්

අපි භාවිතා කිරීමට පටන් ගත් ප්‍රධාන හේතුව ප්‍රතික්‍රියා !! රටාව, නමුත් එය සිදුවන්නේ ඉතා පහසු සහ නැවත නැවත කළ හැකි දෙයකි. මට කරදර විය යුත්තේ යම් දෙයක සත්‍යතාවය හෝ අසත්‍යය ගැන මිස යටින් පවතින වර්ගය කුමක්ද යන්න ගැන නොවේ.

අදහස් දැක්වීමකින් තොරව පහත් කොට සැලකීම ඔබගේ ගැටලුව විසඳීම දුෂ්කර කරයි! නරක යැයි පෙනෙන දේ මට දන්වන්න, මම එය ඇමතීමට සතුටු වෙමි.
රෆින්

55

එය තාර්කික NOT ක්‍රියාකරු, දෙවරක් - එය යමක් බූලියන් බවට පරිවර්තනය කිරීමට භාවිතා කරයි, උදා:

true === !!10

false === !!0

3
මිහිපිට ඔබ එසේ කරන්නේ ඇයි? පාවිච්චි කරන්න ! බූලියන් බවට පරිවර්තනය කිරීමට ක්‍රියාකරු පසුව වර්ගය සංසන්දනය කිරීමට === භාවිතා කරන්න? ඔබට කිසිදු ආකාරයක ආරක්ෂාවක් නොමැති බව පිළිගෙන val> 0 හෝ යමක් කරන්න.
ඩැරන් ක්ලාක්

43
Ar ඩැරන්: ඔහු වර්ග සංසන්දනය කරන්නේ නැහැ; ඔහුගේ පිළිතුරේ ප්‍රකාශයන් ලිවීමෙන් ඔහු ප්‍රති results ල මොනවාදැයි ඔබට කියයි.
කක්ෂයේ සැහැල්ලු ධාවන තරඟ


26

එය ද්විත්ව notමෙහෙයුමකි. පළමුවැන්න !අගය බූලියන් බවට පරිවර්තනය කර එහි තාර්කික අගය හරවයි. දෙවැන්න !තාර්කික අගය ආපසු හරවයි.


26

!!ක්රියාකරු ද්විත්ව ප්රතික්ෂේප කිරීමකට හේතු වන බව පෙනේ .

var foo = "Hello World!";

!foo // Result: false
!!foo // Result: true

23

එය Boolean()වාත්තු ශ්‍රිතයේ හැසිරීම අනුකරණය කරයි. පළමුවැන්න NOTකුමන ක්‍රියාකාරීත්වයක් ලබා දුන්නද බූලියන් අගයක් ලබා දෙයි. දෙවැන්න NOTඑම Booleanඅගය ප්‍රතික්ෂේප කරන trueඅතර විචල්‍යයක බූලියන් අගය ලබා දෙයි . අවසාන ප්‍රති result ලය Boolean()අගය මත ශ්‍රිතය භාවිතා කිරීම හා සමාන වේ.


20

! යනු "බූලියන් නොවේ", එහි සාරය "සක්‍රිය" අගය එහි බූලියන් ප්‍රතිවිරුද්ධ දෙසට යතුරු ලියනය කරයි. දෙවන ! මෙම අගය පෙරළයි. එබැවින්, !!enable"සක්‍රීය නොකරන්න" යන්නෙන් අදහස් කරන්නේ ඔබට enableබූලියන් ලෙස වටිනාකම ලබා දීමයි .


18

මම සඳහන් කිරීම වටී, තාර්කික AND / හෝ සංයෝජනය වූ කොන්දේසියක් බූලියන් වටිනාකමක් ලබා නොදෙන නමුත් අවසාන සාර්ථකත්වය හෝ පළමුවෙන්ම අසමත් වුවහොත් && සහ පළමු සාර්ථකත්වය හෝ අවසාන වරට අසමත් වේ නම් || කොන්දේසි දාමයේ.

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

තත්වය සැබෑ බූලියන් වචනාර්ථයකට දැමීම සඳහා අපට ද්විත්ව නිෂේධනය භාවිතා කළ හැකිය:

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

17

!!එය NOTදෙවරක් එකට ක්‍රියා කරයි, !අගය a බවට පරිවර්තනය කර එය booleanආපසු හරවන්න, !!ක්‍රියා කරන ආකාරය බැලීමට සරල උදාහරණයක් මෙන්න :

මුලදී, ඔබට ඇති ස්ථානය:

var zero = 0;

එවිට ඔබ !0එය බූලියන් බවට පරිවර්තනය කර ඇගයීමට ලක් කරනු ඇත true, මන්ද 0 යනු falsy, එබැවින් ඔබ ආපසු හරවන ලද අගය ලබාගෙන බූලියන් බවට පරිවර්තනය වේ, එබැවින් එය ඇගයීමට ලක් වේ true.

!zero; //true

නමුත් අගයෙහි ආපසු හරවන ලද බූලියන් අනුවාදය අපට අවශ්‍ය නැත , එබැවින් අපගේ ප්‍රති result ලය ලබා ගැනීම සඳහා එය නැවත ආපසු හැරවිය හැකිය! ඒ නිසයි අපි තවත් එකක් භාවිතා කරන්නේ !.

මූලික වශයෙන්, !!අපට සහතික වන්න, අපට ලැබෙන වටිනාකම බූලියන් මිස ව්‍යාජ, සත්‍ය හෝ නූල් යනාදිය නොවේ ...

එබැවින් එය Booleanජාවාස්ක්‍රිප්ට් හි ශ්‍රිතය භාවිතා කිරීම වැනි ය , නමුත් අගයක් බූලියන් බවට පරිවර්තනය කිරීම සඳහා පහසු සහ කෙටි ක්‍රමයක්:

var zero = 0;
!!zero; //false

15

මෙම !!ඉදිකිරීමක් එහි බූලීය සමාන දෙයක් බවට කිසිදු JavaScript ප්රකාශනය හැරෙමින් සරල ක්රමයකි.

උදාහරණයක් ලෙස: !!"he shot me down" === trueසහ !!0 === false.


2
වැදගත් වෙනසට ඉතා ආසන්නයි. ප්‍රධාන දෙය නම් 0 === falseඑය අසත්‍යය සහ !!0 === falseසත්‍යයයි.
රෆින්

14

එය තනි ක්‍රියාකරුවෙකු නොවේ, එය දෙකකි. එය පහත දැක්වෙන දේට සමාන වන අතර එය බූලියන් සඳහා වටිනාකමක් ලබා දීමට ඉක්මන්ම ක්‍රමයකි.

val.enabled = !(!enable);

10

මෙය සී ++ වෙතින් ඉතිරිව ඇති ස්ථානයක් යැයි මම සැක කරමි. ක්රියාකරු නමුත් බූල් ක්රියාකරු නොවේ.

එම අවස්ථාවේ දී negative ණාත්මක (හෝ ධනාත්මක) පිළිතුරක් ලබා ගැනීම සඳහා ඔබ මුලින්ම භාවිතා කළ යුතුය! බූලියන් ලබා ගැනීමට ක්‍රියාකරු, නමුත් ඔබට ධනාත්මක නඩුව පරීක්ෂා කිරීමට අවශ්‍ය නම් භාවිතා කරනු ඇත !!.


10

මෙම ifසහ whileප්රකාශ හා ?ලකුණු කිරීමට කේත වන ශාඛාව තීරණය කිරීම සඳහා ක්රියාකරු භාවිතය සත්යය වටිනාකම්. උදාහරණයක් ලෙස, ශුන්‍ය හා NaN අංක සහ හිස් නූල අසත්‍යය, නමුත් වෙනත් සංඛ්‍යා සහ නූල් සත්‍ය වේ. වස්තූන් සත්‍ය ය, නමුත් නිර්වචනය නොකළ වටිනාකම සහ nullදෙකම අසත්‍ය ය.

ද්විත්ව නිෂේධන ක්‍රියාකරු !!අගයක සත්‍ය අගය ගණනය කරයි. එය සැබවින්ම ක්‍රියාකරුවන් දෙදෙනෙකු වන අතර, !!xඑයින් අදහස් වන්නේ !(!x)සහ පහත පරිදි හැසිරේ:

  • නම් x, බොරු අගය වේ !xවේ true, සහ !!xfalse.
  • නම් x, සැබෑ වටිනාකම වන්නේ !xfalse, සහ !!xtrue.

එය බූලීය සන්දර්භය ඉහළ මට්ටමේ (දී භාවිත කරන විට if, whileහෝ ?), එම !!ක්රියාකරු, හැසිරීමෙන් එය කිසිදු-op වේ. උදාහරණයක් ලෙස, if (x)සහ if (!!x)එකම දේ අදහස්.

ප්‍රායෝගික භාවිතයන්

කෙසේ වෙතත් එයට ප්‍රායෝගික භාවිතයන් කිහිපයක් තිබේ.

එක් භාවිතයක් නම්, වස්තුවක් එහි සත්‍ය වටිනාකමට අලාභහානි කිරීම, එවිට ඔබේ කේතය විශාල වස්තුවක් ගැන සඳහනක් තබා එය පණපිටින් තබා නොගනී. කුණු එකතු කරන්නාට යන්නට ඉඩ !!some_big_objectනොදී විචල්‍යයකට පැවරීම some_big_object. වස්තුවක් හෝ ව්‍යාජ අගයක් nullහෝ බ්‍රවුසරයේ අංග හඳුනාගැනීම වැනි නිර්වචනය නොකළ අගය නිපදවන අවස්ථා සඳහා මෙය ප්‍රයෝජනවත් වේ .

සී හි අනුරූප !!ක්‍රියාකරු පිළිබඳ පිළිතුරක මා සඳහන් කළ තවත් භාවිතයක් වන්නේ පොදු යතුරු ලියනය සහ මුද්‍රණ රෝග නිර්ණය සොයා බලන “ලින්ට්” මෙවලම් ය. නිදසුනක් ලෙස, සී සහ ජාවාස්ක්‍රිප්ට් යන දෙකෙහිම, බූලියන් මෙහෙයුම් සඳහා පොදු යතුරු ලියනය කිරීම් කිහිපයක් වෙනත් හැසිරීම් ඇති කරයි, ඒවායේ ප්‍රතිදානය බූලියන් තරම් නොවේ:

  • if (a = b)යනු සත්‍යයේ වටිනාකම භාවිතා කිරීමෙන් පසුව පැවරීමයි b; if (a == b)සමානාත්මතා සංසන්දනයකි.
  • if (a & b)ටිකක් සහ AND; if (a && b)තාර්කික AND ය. 2 & 50(අ බොරු අගය); 2 && 5ඇත්ත.

!!ඔබ ලියා ඇති දෙය ඔබ අදහස් කළ බව ක්‍රියාකරු සහතික කරයි: මෙම මෙහෙයුම කරන්න, ඉන්පසු ප්‍රති .ලයේ සත්‍ය වටිනාකම ගන්න.

තෙවන භාවිතය වන්නේ තාර්කික XOR සහ තාර්කික XNOR නිෂ්පාදනය කිරීමයි. සී සහ ජාවාස්ක්‍රිප්ට් දෙකෙහිම, a && bතාර්කික AND සහ (දෙපැත්තම සත්‍ය නම් සත්‍ය වේ), සහ a & bතරමක් දුරට AND සිදු කරයි. a || bතාර්කික OR සිදු කරයි (අවම වශයෙන් එකක් සත්‍ය නම් සත්‍ය වේ), සහ a | bතරමක් දුරට හෝ සිදු කරයි. තරමක් දුරට XOR (සුවිශේෂී OR) ඇත a ^ b, නමුත් තාර්කික XOR සඳහා සාදන ලද ක්‍රියාකරුවෙකු නොමැත (හරියටම එක් පැත්තක් සත්‍ය නම් සත්‍ය වේ). නිදසුනක් ලෙස, ඔබට ක්ෂේත්‍ර දෙකෙන් එකකට පෙළ ඇතුළත් කිරීමට පරිශීලකයාට ඉඩ දිය හැකිය. ඔබට කළ හැක්කේ එක් එක් සත්‍ය වටිනාකමක් බවට පරිවර්තනය කර ඒවා සංසන්දනය කිරීමයි : !!x !== !!y.


8

ද්විත්ව බූලියන් නිෂේධනය. අගය නිර්වචනය කර නොමැතිදැයි පරීක්ෂා කිරීමට බොහෝ විට භාවිතා වේ.


8

මෙහි විශාල පිළිතුරු ටොන් ගණනක් ඇත, නමුත් ඔබ මෙය බොහෝ දුරට කියවා ඇත්නම්, මෙය 'එය ලබා ගැනීමට' මට උපකාරී විය. Chrome (etc) හි කොන්සෝලය විවෘත කර ටයිප් කිරීම ආරම්භ කරන්න:

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

ස්වාභාවිකවම, මේ සියල්ල හුදෙක් ටයිප් කිරීම හා සමාන වේ !! යම් දෙයක්, නමුත් එකතු කරන ලද වරහන් එය වඩාත් තේරුම් ගැනීමට උපකාරී වේ.


8

!!x සඳහා කෙටිමං වේ Boolean(x)

පළමු පිපිරුම js එන්ජිම ධාවනය කිරීමට බල කරන Boolean(x)අතරම අගය ප්‍රතිලෝම කිරීමේ අතුරු ආබාධයක් ද ඇත. එබැවින් දෙවන වළල්ල අතුරු ආබාධය ඉවත් කරයි.


8

එය සෑම දෙයක්ම බූලියන් කිරීමට බල කරයි.

උදාහරණයක් වශයෙන්:

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

7

මෙම ප්‍රශ්නයට තරයේම පිළිතුරු සපයා ඇත, නමුත් අර්ථයක් ලබා දෙමින් හැකි තරම් සරල යැයි මා සිතන පිළිතුරක් එක් කිරීමට මම කැමතියි !! තේරුම් ගත හැකි තරම් සරල ය.

ජාවාස්ක්රිප්ට් "truthy" සහ "falsey 'වටිනාකම් ලෙස හැඳින්වේ දේ, මේ නිසා, එහි වෙනත් ප්රකාශන ඇගයීමට ලක් වන විට සත්ය හෝ අසත්ය තත්ත්වය වාර්තා කරනු ඇති බව ප්රකාශ වටිනාකම හෝ ප්රකාශනය පරීක්ෂා කරමින් වුවත්, ය ඇත්තටම නොවේ trueහෝ false.

උදාහරණයක් වශයෙන්:

if (document.getElementById('myElement')) {
    // code block
}

එම මූලද්‍රව්‍යය ඇත්ත වශයෙන්ම පවතින්නේ නම්, ප්‍රකාශනය සත්‍ය ලෙස තක්සේරු කරනු ඇති අතර කේත වාරණය ක්‍රියාත්මක වේ.

කෙසේවෙතත්:

if (document.getElementById('myElement') == true) {
    // code block
}

... සත්‍ය තත්වයක් ඇති නොකරනු ඇති අතර මූලද්‍රව්‍යය පැවතියද කේත වාරණය ක්‍රියාත්මක නොවේ.

මන්ද? මක්නිසාද යත් , document.getElementById()මෙම if()ප්‍රකාශයේ සත්‍ය බව තක්සේරු කරන “සත්‍ය” ප්‍රකාශනයකි , නමුත් එය සත්‍ය බූලියන් වටිනාකමක් නොවේ true.

මෙම නඩුවේ ද්විත්ව "නොවේ" තරමක් සරල ය. එය හුදෙක් notතත්පර දෙකකට පසුපසට ය.

පළමුවැන්න සත්‍ය හෝ අසත්‍ය අගය “ප්‍රතිලෝම” කර එහි ප්‍රති bo ලයක් ලෙස සත්‍ය බූලියන් වර්ගයක් ඇති අතර දෙවනුව එය යළිත් වරක් එහි මුල් තත්වයට “ප්‍රතිලෝම” කරයි, නමුත් දැන් සැබෑ බූලියන් අගයකින්. ඒ ආකාරයෙන් ඔබට අනුකූලතාවක් ඇත:

if (!!document.getElementById('myElement')) {}

හා

if (!!document.getElementById('myElement') == true) {}

බලාපොරොත්තු වූ පරිදි දෙකම නැවත සත්‍ය වනු ඇත.


7

මට එය එකතු කිරීමට අවශ්‍ය විය

if(variableThing){
  // do something
}

සමාන වේ

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

යමක් නිර්වචනය නොකළ විට මෙය ගැටළුවක් විය හැකිය.

// a === undefined, b is an empty object (eg. b.asdf === undefined)
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

මෙහි ඇති උපක්‍රමය නම් &&s දාමය එය සොයාගත් පළමු ව්‍යාජ අගය නැවත ලබා දෙනු ඇත - මෙය if ප්‍රකාශයකට පෝෂණය කළ හැකිය. එබැවින් b.foo නිර්වචනය නොකළහොත් එය නිර්වචනය නොකොට b.foo.barප්‍රකාශය මඟ හැරෙනු ඇත. දෝෂයකි.

ඉහත ආපසු නිර්වචනය නොකළ නමුත් අපි දාම ඔවුන් මුහුණ දෙන එම පදනම නැවත ළඟදීම නිර්වචනය නොකළ ඔබ හිස් නූල්, බොරු, ශුන්ය, 0, තිබේ නම් - []සහ {}දෙකම "truthy" වන අතර අපි ඊනියා "පහළ දිගටම && දාමය "ඊළඟ අගයට දකුණට.

PS එකම දේ කිරීමේ තවත් ක්‍රමයක් (b || {}).fooනම්, b නිර්වචනය කර නොමැති නම් එය එසේ b || {}වනු ඇති අතර {}, ඔබ “නිර්වචනය නොකළ” තුළ වටිනාකමක් ලබා ගැනීමට උත්සාහ කරනවා වෙනුවට හිස් වස්තුවක (දෝෂයක් නැත) අගයකට ප්‍රවේශ වනු ඇත (දෝෂයක් ඇති කරයි ). ඉතින්, (b || {}).fooසමාන b && b.fooහා ((b || {}).foo || {}).barසමාන වේ b && b.foo && b.foo.bar.


හොඳ කාරණය - මගේ පිළිතුර වෙනස් කළා. එය සිදුවන්නේ වස්තුවක් මට්ටම් තුනක් ගැඹුරට කැදවා ඇති විට පමණි, මන්ද ඔබ ({}).anythingundefined
රයන් ටේලර්

5

මේ සියලු විශිෂ්ට පිළිතුරු දැකීමෙන් පසුව, භාවිතා කිරීමට තවත් හේතුවක් එක් කිරීමට මම කැමතියි !!. වත්මන් මම කෝණික 2-4 (ටයිප්ස්ක්‍රිප්ට්) හි වැඩ කරන අතර falseමගේ පරිශීලකයා සත්‍යාපනය නොකළ විට බූලියන් ආපසු ලබා දීමට මට අවශ්‍යය . ඔහු සත්‍යාපනය නොකළේ නම්, ටෝකන නූල nullහෝ "". ඊළඟ කේත කොටස භාවිතා කිරීමෙන් මට මෙය කළ හැකිය:

public isAuthenticated(): boolean {
   return !!this.getToken();
}

4

කෝණික js වෙතින් කේත කැබැල්ලක් මෙන්න

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

 var rafSupported = !!requestAnimationFrame;

ඔවුන්ගේ අභිප්‍රාය වන්නේ ඉල්ලීම් ඇනිමේෂන් ෆ්‍රේම් හි ක්‍රියාකාරීත්වය මත පදනම්ව රාෆ් සහය සත්‍ය හෝ අසත්‍ය ලෙස සැකසීමයි.

පොදුවේ පහත දැක්වෙන ආකාරයෙන් පරීක්ෂා කිරීමෙන් එය සාක්ෂාත් කරගත හැකිය:

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

කෙටි ක්‍රමය භාවිතා කළ හැකිය !!

rafSupported = !!requestAnimationFrame ;

එබැවින් requestAnimationFrame වෙත ශ්‍රිතයක් පවරා ඇත්නම්! requestAnimationFrame අසත්‍ය වන අතර තවත් එකක්! එය සත්‍ය වනු ඇත

requestAnimationFrame එක නිර්වචනය කර නොමැති නම්! requestAnimationFrame සත්‍ය වන අතර තවත් එකක්! එය බොරු ය


3

ජාවාස්ක්‍රිප්ට් හි සමහර ක්‍රියාකරුවන් ව්‍යංග ආකාරයේ පරිවර්තන සිදු කරන අතර සමහර විට ඒවා වර්ග පරිවර්තනය සඳහා භාවිතා කරයි.

ඒකීය !ක්‍රියාකරු එහි ක්‍රියාකාරිත්වය බූලියන් බවට පරිවර්තනය කර එය ප්‍රතික්ෂේප කරයි.

මෙම කරුණ ඔබේ ප්‍රභව කේතයෙන් දැකිය හැකි පහත දැක්වෙන මෝඩකමට මග පාදයි:

!!x // Same as Boolean(x). Note double exclamation mark

3

තාර්කික නොවන ක්‍රියාකරු යන්නෙහි තේරුම දෙවරක් භාවිතා කරන්න
! සත්‍ය = අසත්‍ය
සහ !! සත්‍ය = සත්‍යය


3

විචල්යයක බූලියන් අගය ලබා දෙයි.

ඒ වෙනුවට 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භාවිතයේ පවතී.

පහත දැක්වෙන කෝඩ් සිදු ඇබිත්ත කරුණාකර පරීක්ෂා කරන්න

let a = 0
console.log("a: ", a) // writes a value in its kind
console.log("!a: ", !a) // writes '0 is NOT true in boolean' value as boolean - So that's true.In boolean 0 means false and 1 means true.
console.log("!!a: ", !!a) // writes 0 value in boolean. 0 means false.
console.log("Boolean(a): ", Boolean(a)) // equals to `!!a`
console.log("\n") // newline

a = 1
console.log("a: ", a)
console.log("!a: ", !a)
console.log("!!a: ", !!a) // writes 1 value in boolean
console.log("\n") // newline

a = ""
console.log("a: ", a)
console.log("!a: ", !a) // writes '"" is NOT true in boolean' value as boolean - So that's true.In boolean empty strings, null and undefined values mean false and if there is a string it means true.
console.log("!!a: ", !!a) // writes "" value in boolean
console.log("\n") // newline

a = "test"
console.log("a: ", a) // writes a value in its kind
console.log("!a: ", !a)
console.log("!!a: ", !!a) // writes "test" value in boolean

console.log("Boolean(a) === !!a: ", Boolean(a) === !!a) // writes true

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.