কী !! (নয়) জাভাস্ক্রিপ্ট অপারেটর?


3103

আমি কিছু কোড যাতে মত, একটি অপারেটর আমাকে চিনতে পারছেন না ব্যবহার করার জন্য দুই বিস্ময়বোধক পয়েন্ট আকারে বলে মনে হয় দেখেছি: !!। এই অপারেটর কী করে আমাকে কেউ বলতে পারেন?

আমি যে প্রসঙ্গে এটি দেখেছি তা হ'ল

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

944
এটি "ব্যাং, ব্যাং আপনি বুলিয়ান" এর মাধ্যমে মনে রাখবেন
গাস

75
কেবল রেকর্ডের জন্য, সেখানে উদ্ধৃত হয়েছে যা করবেন না। কর if(vertical !== undefined) this.vertical = Boolean(vertical);- এটি যা চলছে তা অনেক পরিস্কার এবং পরিষ্কার, কোনও অপ্রয়োজনীয় অ্যাসাইনমেন্টের প্রয়োজন নেই, পুরোপুরি মানসম্পন্ন, এবং ঠিক তত দ্রুত (বর্তমান এফএফ এবং ক্রোমে) jsperf.com/boolean- রূপান্তর- স্পিড
ফিল এইচ

72
!! অপারেটর নয়। এটা ঠিক! অপারেটর দুইবার।
বিবেক

11
শুধু রেকর্ডের জন্য, Boolean(5/0)একই হিসাবে নয়!!5/0
schabluk

63
@schabluk, রেকর্ড জন্য, অপারেশনের অর্ডার কারণ নেই !!5/0উৎপন্ন Infinityবদলে true, যেমন দ্বারা উত্পাদিত Boolean(5/0)। অপারেটরের চেয়ে অপারেটর বেশি হওয়ার কারণে - ওরফে - !!5/0সমান । আপনি যদি ডাবল-ব্যাং ব্যবহার করে বুলেটিনাইজ করতে চান তবে আপনাকে ব্যবহার করা দরকার । (!!5)/0true/0!/5/0!!(5/0)
ম্যাটি

উত্তর:


2742

রূপান্তরিত 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 জেএস-এ একটি মিথ্যা নয়), তারপরে বুলিয়ান-ইনভার্টগুলি যাতে আপনি বুলিয়ান হিসাবে আসল মান পান (তাই !! 5 হবে) সত্যবাদী হও).
চক

110
এটি বর্ণনা করার একটি সহজ উপায়: বুলিয়ান (5) === !! 5; একই কাস্টিং, কম অক্ষর।
মিকাহ স্নাইডার

39
এটি সত্যবাদী মানগুলিকে সত্য বুলিয়ান রূপান্তর করতে ব্যবহৃত হয় এবং মিথ্যা মানগুলিও বুলিয়ান মিথ্যা।
থিওলম্যান

13
@ মিচাহ স্নাইডার সাবধান হন যে জাভাস্ক্রিপ্টে নতুন বুলিয়ান () দিয়ে বুলিয়ান বক্স তৈরি করে এমন বস্তু তৈরির পরিবর্তে বুলিয়ান আদিম ব্যবহার করা ভাল। : এখানে পার্থক্য দেখতে একটি উদাহরণ jsfiddle.net/eekbu
victorvartan

4
যতদূর আমি জানি, এই ঠুং ঠুংকার প্যাটার্নটি কোনও (… _ বিবৃতি; কেবলমাত্র কোনও ফাংশনের রিটার্ন স্টেটমেন্টে যে বুলিয়ানটি ফিরিয়ে
আনতে হবে) তে কার্যকর নয়

853

কোনও ধরণের রূপান্তর করার এটি একটি মারাত্মক অস্পষ্ট উপায়।

!হয় না । সুতরাং !trueহয় false, এবং !falseহয় true!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);

73
!! মিথ্যা = মিথ্যা। !! সত্য = সত্য
cllpse

89
"বুঝতে খুব সহজ" রূপটি এখানে বুঝতে খুব সহজ? 0 এর বিপরীতে চেক 0 এর বিপরীতে প্রকৃত চেক নয়, তবে জাভাস্ক্রিপ্ট 0 userId ? true : false টির সমান বিবেচিত মানের কিছুটা অদ্ভুত তালিকার বিরুদ্ধে একটি চেক আরও স্পষ্ট করে তোলে যে রূপান্তর চলছে এবং কেস পরিচালনা করে যেখানে ব্যবহারকারীর আইডির মান স্পষ্টভাবে সেট করা হয়েছে haveundefined
বেন রেজেনস্পান

54
আমার মস্তিষ্কে ডিকোড !!varকরতে কোনও সমস্যা নেই Boolean(var).. এবং !!দ্রুত (প্রক্রিয়াজাতকরণের জন্য কম নির্দেশ) এবং বিকল্পগুলির চেয়ে কম।
অ্যাডামজেভ লাইভ

7
@ রিকি ক্লার্কসন মূলত এটি পাঠযোগ্যতার জন্য যেহেতু সিনথেটিকভাবে এটির প্রয়োজন নেই। কেউ কেউ বাকী বাক্য থেকে পৃথক করে রাখতে সর্বদা বন্ধনীতে শর্তসাপেক্ষ মোড়ানোর কনভেনশনটি ব্যবহার করে।
ডেভ রাজার

8
আমি এর সাথে একমত নই। userId != 0সত্য null, NaNএবং undefined, কিন্তু মিথ্যা false। আপনি যদি ঠিক সেই আচরণটি চান তবে আপনার সম্ভবত এটি সম্পর্কে স্পষ্ট হওয়া উচিত। তবে এটি ঠিক একইভাবে কাজ করলেও !!userId, আপনি এখানে এই মানগুলি ভুয়া আসতে চান কিনা বা জাভাস্ক্রিপ্টের ধরণের রূপান্তর নিয়মগুলি বিবেচনা করতে আপনি ব্যর্থ হয়েছেন কিনা তা পরিষ্কার নয় ।
ফিলহ

449

!!exprএক্সপ্রেশনটির সত্যতার উপর নির্ভর করে একটি বুলিয়ান মান ( trueবা false) প্রদান করে। নন-বুলিয়ান ধরণের ক্ষেত্রে ব্যবহৃত হলে এটি আরও বেশি অর্থবোধ করে। এই উদাহরণগুলি বিবেচনা করুন, বিশেষত তৃতীয় উদাহরণ এবং পরবর্তী:

          !!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(যার !falseফলে ফলাফল হয় true)

  • সত্যটি এটি trueনয় false(যার !trueফলে ফলাফল হয় false)


!!কোন মানটি কী নয় তার "সত্য" নির্ধারণ করে :

  • সত্য যে trueনয় না true (যে কেন !!trueফলাফল true)

  • সত্য যে falseনয় না false (যে কেন !!falseফলাফল false)


আমরা তুলনা করে যা নির্ধারণ করতে চাই তা হ'ল রেফারেন্সের মান সম্পর্কে "সত্য" , নিজেই রেফারেন্সের মান নয়। এমন একটি ব্যবহারের কেস রয়েছে যেখানে আমরা মানটির সত্যতা জানতে চাইতে পারি, এমনকি আমরা যদি মানটি false(বা মিথ্যা) বলে আশা করি বা আমরা যদি মূল্যটি টাইপফুল না হওয়ার আশা করি boolean


প্রস্তুতিতে:

একটি সংক্ষিপ্ত ফাংশন বিবেচনা করুন যা গতিশীল টাইপিং (ওরফে "হাঁসের টাইপিং") এর মাধ্যমে বৈশিষ্ট্যটির কার্যকারিতা (এবং এই ক্ষেত্রে প্ল্যাটফর্মের সামঞ্জস্যতা) সনাক্ত করে । আমরা এমন একটি ফাংশন লিখতে চাই যা trueব্যবহারকারীর ব্রাউজারটি HTML5 <audio>উপাদান সমর্থন করে তবে ফিরে আসে , তবে আমরা চাই না যে ফাংশনটি অপরিবর্তিত থাকলে কোনও ত্রুটি ছুঁড়ে ফেলে <audio>; এবং আমরা try ... catchকোনও সম্ভাব্য ত্রুটিগুলি হ্যান্ডেল করার জন্য ব্যবহার করতে চাই না (কারণ তারা গুরুতর); এবং এছাড়াও আমরা ফাংশনটির ভিতরে এমন একটি চেক ব্যবহার করতে চাই না যা ধারাবাহিকভাবে বৈশিষ্ট্যটির সত্যতা প্রকাশ করে না (উদাহরণস্বরূপ, document.createElement('audio')এখনও <audio>এইচটিএমএল 5 <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

প্রতিটি ফাংশন একটি <tag>এবং দেখার জন্য একটি আর্গুমেন্ট গ্রহণ করে attribute, তবে তারা প্রতিটি তুলনা নির্ধারণ করে তার উপর ভিত্তি করে পৃথক মান প্রদান করে।

তবে অপেক্ষা করুন, আরও আছে!

আপনারা কেউ কেউ সম্ভবত লক্ষ্য করেছেন যে এই নির্দিষ্ট উদাহরণে, কেউ প্রশ্নে থাকা বস্তুর কোনও সম্পত্তি আছে কিনা তা যাচাই করার জন্য আরও কিছু পারফরম্যান্ট উপায় ব্যবহার করে কোনও সম্পত্তি অনুসন্ধান করতে পারে । এই কাজটি করার দুটি পদ্ধতি আছে:

// 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()বিবৃতি ইতিমধ্যে বুলিয়ানটিতে অভিব্যক্তিটি ছড়িয়ে দিয়েছে, স্পষ্টরূপে একটি টেস্টিং ফাংশনটির রিটার্ন মানটি বুলিয়ান হিসাবে কাস্ট করা অপ্রয়োজনীয় - যেহেতু "সত্যতা" === যতক্ষণ কোনও if()বিবৃতি যাই হোক না কেন সত্য। অথবা আমি এমন একটি দৃশ্য মিস করছি যেখানে আপনি সত্যিকারের বুলিয়ান হওয়ার জন্য সত্যবাদী অভিব্যক্তি দরকার true?
টম অাগার 13

1
@ টমআজারের if()বিবৃতিগুলি মিথ্যা মানগুলির বিরুদ্ধে বুুলিয়ান ফেলে, তবে বলে যে আপনি আসলে কোনও বস্তুর উপরে বুলিয়ান পতাকা স্থাপন করতে চান - এটি কোনও if()বিবৃতি যেমন দেয় না তেমন এটি । উদাহরণস্বরূপ আসল রিটার্ন মানের পরিবর্তে বা তার পরিবর্তে object.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()সেট করা হবে । হয়তো আরেকটি উদাহরণ সব প্রশাসক দ্বারা এর এবং অ প্রশাসক আইডি হয় বা উচ্চতর। কেউ যদি প্রশাসক না হন তবে তা পেতে আপনি করতে পারেন । কয়েকটি ব্যবহারের ক্ষেত্রে, তবে যখন এটি সংক্ষিপ্ত থাকে। truefalseid01trueperson.isNotAdmin = !!admin.id
বেনি

103

!!মানটিকে এর সমান বুলিয়ান মানকে রূপান্তরিত করে। (দরিদ্র ব্যক্তির "টাইপ-কাস্টিং" এর উপায় ভাবেন)। এর উদ্দেশ্যটি সাধারণত পাঠককে জানানো হয় যে কোডটি ভেরিয়েবলের মধ্যে কী মান হয় তা বিবেচনা করে না , তবে এর "সত্য" মানটি কী।


4
বা ডানদিকে একটি বুলিয়ান মান ক্ষেত্রে, এটি কিছুই করে না।
ড্যানিয়েল এ। হোয়াইট

3
@ ড্যানিয়েল: !তবুও ডানদিকে মানটি ফ্লিপ করে। বুলিয়ানের ক্ষেত্রে ডান-সর্বাধিক !মানটিকে অগ্রাহ্য করে, যখন বাম-সর্বাধিক !আবার তা প্রত্যাখ্যান করে। নেট ইফেক্টটি হচ্ছে কোনও পরিবর্তন নেই, তবে বেশিরভাগ ইঞ্জিনগুলি দ্বিগুণ প্রত্যাখ্যানের জন্য ওপ কোড তৈরি করবে।
ক্রিসেন্ট টাটকা

তবে কী কথা? আমি যদি if(0){...জাভাস্ক্রিপ্টটি ইতিমধ্যে জানি তবে এটি মিথ্যা। কেন বলা ভাল if(!!0){...?
কোডি বাগস্টিন

বিন্দুটি ভেরিয়েবলের জন্য যা আপনি এর সামগ্রীগুলি নাও জানেন know যদি এটি কোনও পূর্ণসংখ্যা বা স্ট্রিং, কোনও বস্তু বা নাল, অপরিজ্ঞাত ইত্যাদি হতে পারে তবে এটি অস্তিত্ব পরীক্ষা করার একটি সহজ উপায়।
মিশ্রিত 3

71

!!fooদু'বার অ্যানারি অপারেটর প্রয়োগ করে এবং বুলিয়ান টাইপ হিসাবে ইউনারি প্লাসের +fooসংখ্যায় কাস্ট করার জন্য এবং খালি স্ট্রিংকে স্ট্রিংয়ে ''+fooকাস্ট করার জন্য ব্যবহার করা হয়।

এই হ্যাকগুলির পরিবর্তে, আপনি স্পষ্টভাবে মান কাস্ট করতে আদিম ধরণের ( ব্যবহার না করে new) সম্পর্কিত কন্সট্রাক্টর ফাংশনগুলিও ব্যবহার করতে পারেন can

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

তবে আপনি উদাহরণস্বরূপ ইস্যুগুলিতে চালাতে পারেন। নতুন বুলিয়ান (১) উদাহরণস্বরূপ অবজেক্ট -> সত্য !! 1 উদাহরণস্বরূপ অবজেক্ট -> মিথ্যা
সিউমাস

13
না, আপনি পারবেন না: লক্ষ্য করুন যে কনস্ট্রাক্টর ফাংশনগুলি ছাড়াই কল করা হয়েছে new- যেমনটি আমার উত্তরে স্পষ্টভাবে উল্লেখ করা হয়েছে
ক্রিস্টোফ

2
চমত্কার! "0" দিয়ে স্ট্রিংগুলি সত্যের পরিবর্তে মিথ্যা হিসাবে মূল্যায়ন করতে গেলে এটি সামান্য হ্যাকের জন্য কার্যকর for (অর্থাত্ নির্বাচিতদের থেকে মানগুলি পড়ার সময়, কারণ তারা স্ট্রিং হিসাবে পড়ে read সুতরাং, যদি আপনি "0" কে নেতিবাচক (বুলিয়ান মিথ্যা) হিসাবে বিবেচনা করতে চান তবে x="0"কেবল x=!!+x; //falseযেমন করুন : যা Boolean(Number(x))সংখ্যার সমান (বা + x) স্ট্রিংটিকে "0" থেকে 0 তে রূপান্তর করে, যা বুলিয়ানকে মূল্যায়ন করে এবং তারপরে বুলিয়ান (!! x) এটিকে সরাসরি বুলিয়নে ফেলে দেয়। সহজ কিছু!
ডিয়েগোডিডি

2
@ ডিগো ডিডি আপনি !!+xবনাম কেন বেছে নেবেন x !== "0"?
placeybordeaux

@ প্লেসিবার্ডোঅক্স কারণ উদাহরণস্বরূপ আপনি মানটি রূপান্তর করতে এবং অন্যান্য ভেরিয়েবলের কাছে নির্ধারণ করতে চাইতে পারেন, আপনি এটি অন্য কোনও কিছুর সাথে তুলনা করতে যাচ্ছেন না কেন।
দিয়েগোডিডি

67

অর্ধেক কাজ করে অনেক উত্তর। হ্যাঁ, !!X"এক্সের সত্যতা [বুলিয়ান হিসাবে উপস্থাপিত]" হিসাবে পড়া যেতে পারে। তবে !!বাস্তবিকভাবে বলা যায় না, একক ভেরিয়েবল সত্যবাদী বা মিথ্যা কিনা তা নির্ধারণের জন্য এতটা গুরুত্বপূর্ণ নয়। !!myVar === trueঠিক হিসাবে একই myVar!!Xএকটি "বাস্তব" বুলিয়ান সাথে তুলনা করা সত্যই কার্যকর নয়।

আপনি যা অর্জন করেন !!তা হ'ল পুনরাবৃত্তযোগ্য, মানক (এবং জেএসলিন্ট বান্ধব) ফ্যাশনে একে অপরের বিরুদ্ধে একাধিক ভেরিয়েবলের সত্যতা যাচাই করার ক্ষমতা ।

কেবল কাস্টিং :(

এটাই...

  • 0 === falseহয় false
  • !!0 === falseহয় true

উপরেরটি এতটা কার্যকর নয়। if (!0)আপনি হিসাবে একই ফলাফল দেয় if (!!0 === false)। আমি বুলিয়ানতে একটি পরিবর্তনশীল .ালাই এবং তারপরে "সত্য" বুলিয়ানের সাথে তুলনা করার জন্য ভাল মামলার কথা ভাবতে পারি না।

জেএসলিন্টের দিকনির্দেশগুলি থেকে "== এবং! =" দেখুন (দ্রষ্টব্য: ক্রোকফোর্ড তার সাইটটি কিছুটা ঘুরে দেখছেন; সেই লিঙ্কটি কিছুটা সময় মারা যাওয়ার জন্য দায়ী) কেন তার জন্য:

তুলনা করার আগে অপারেটররা == এবং! = টাইপ করুন এটি খারাপ কারণ এটি '\ t \ r \ n' == 0 টি সত্য হতে দেয়। এটি টাইপ ত্রুটিগুলি মাস্ক করতে পারে। জেএসলিন্ট নির্ভরযোগ্যভাবে নির্ধারণ করতে পারে না যে == সঠিকভাবে ব্যবহার করা হচ্ছে, সুতরাং == এবং! = ব্যবহার না করা এবং সর্বদা আরও নির্ভরযোগ্য === এবং! == অপারেটর ব্যবহার করা ভাল।

যদি আপনি কেবল যত্ন নেন যে কোনও মান সত্যবাদী বা মিথ্যা, তবে সংক্ষিপ্ত রূপটি ব্যবহার করুন। পরিবর্তে
(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
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝

আপনার ইঞ্জিনের উপর নির্ভর করে জিনিসগুলি আরও ক্রেজিয়ার হয়ে ওঠে। উদাহরণস্বরূপ, ডাব্লুস্ক্রিপ্ট পুরস্কার জিতেছে।

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

কারণ কিছু ঐতিহাসিক উইন্ডোজ Jive , যে করব আউটপুট -1 কে একটি বার্তা বক্সে! এটি একটি cmd.exe প্রম্পটে চেষ্টা করে দেখুন! তবে WScript.echo(-1 == test())এখনও আপনাকে 0, বা ডাব্লুএসক্রিপ্ট দেয় falseদূরে তাকান। এটা ঘৃণ্য।

সত্যতা তুলনা :)

তবে আমার যদি দুটি মান থাকে তবে আমার সমান ট্রুথি / ফলসী নেস পরীক্ষা করতে হবে?

আমাদের আছে myVar1 = 0;এবং না myVar2 = undefined;

  • myVar1 === myVar2হয় 0 === undefinedএবং স্পষ্টতই মিথ্যা।
  • !!myVar1 === !!myVar2হয় !!0 === !!undefinedএবং সত্য! একই সত্যতা! (এক্ষেত্রে, উভয়েরই "মিথ্যাচারের সত্যতা আছে"))

সুতরাং "বুলিয়ান-castালাই ভেরিয়েবল" ব্যবহারের জন্য কেবলমাত্র সেই জায়গাটি যদি আপনার এমন কোনও পরিস্থিতি হত যেখানে আপনি যাচাই করছেন যে উভয় ভেরিয়েবালের একই সত্যতা আছে কিনা ? অর্থাৎ ব্যবহারের !!আপনি যদি দুটি 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.";
}

সুতরাং এখন যদি আপনার উভয়ের পক্ষে সত্যবাদিতা বা স্বামী / স্ত্রী এবং স্ত্রী উভয়ের জন্য মিথ্যা থাকে তবে আপনি চালিয়ে যেতে পারেন। অন্যথায় আপনি কেবল একটি মান (বা খুব তাড়াতাড়ি সাজানো বিবাহ) সহ একটি ক্ষেত্র পেয়েছেন এবং আপনার errorObjectsসংগ্রহে একটি অতিরিক্ত ত্রুটি তৈরি করতে হবে ।


সম্পাদনা 24 অক্টোবর 2017, 6 ফেব্রুয়ারী 19:

তৃতীয় পক্ষের গ্রন্থাগারগুলি যা সুস্পষ্ট বুলিয়ান মান আশা করে

এখানে একটি আকর্ষণীয় কেস ... !!তৃতীয় পক্ষের লিবস সুস্পষ্ট বুলিয়ান মানগুলি প্রত্যাশা করতে পারে তখন কার্যকর হতে পারে।

উদাহরণস্বরূপ, জেএসএক্স-এ মিথ্যা (প্রতিক্রিয়া) এর একটি বিশেষ অর্থ রয়েছে যা সাধারণ মিথ্যাচারে ট্রিগার হয় না। আপনি যদি জেএসএক্সে নিম্নলিখিতগুলির মতো কিছু ফেরত দেওয়ার চেষ্টা করে থাকেন, তবে কোনও আন্তঃ প্রত্যাশার কথা messageCount...

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

... আপনি 0যখন শূন্য বার্তা পেয়েছেন তখন প্রতিক্রিয়া রেন্ডার দেখে অবাক হতে পারেন । জেএসএক্স রেন্ডার না করার জন্য আপনাকে স্পষ্টতই মিথ্যা ফিরিয়ে দিতে হবে। উপরের বিবৃতিটি ফেরত দেয় 0, যা জেএসএক্স খুশিভাবে রেন্ডার করে, যেমনটি করা উচিত। এটি আপনার কাছে Count: {messageCount && <div>Get your count to zero!</div>}(বা কিছু কম অবদানযুক্ত) বলতে পারে না ।

  • একটি ফিক্সের সাথে ব্যাংবাং জড়িত, যা কোরেস 0করে !!0, যা false:
    {!!messageCount && <div>You have messages!</div>}

  • জেএসএক্স'র ডকস আপনাকে আরও সুস্পষ্ট হতে, স্ব-মন্তব্য করার কোডটি লিখতে এবং কোনও বুলিয়ানকে বল প্রয়োগের জন্য তুলনা ব্যবহার করার পরামর্শ দেয়।
    {messageCount > 0 && <div>You have messages!</div>}

  • আমি নিজেকে একটি বার্নিশ দিয়ে মিথ্যাচার সামলাতে আরও স্বাচ্ছন্দ্য বোধ করি -
    {messageCount ? <div>You have messages!</div> : false}

টাইপস্ক্রিপ্টে একই চুক্তি: আপনার যদি কোনও ফাংশন থাকে যা কোনও বুলিয়ান দেয় (বা আপনি বুলিয়ান ভেরিয়েবলের জন্য একটি মান নির্ধারণ করছেন), আপনি [সাধারণত] বুলিয়ান-ওয়াইয়ের মূল্য ফেরত / অর্পণ করতে পারবেন না; এটি একটি দৃ strongly়ভাবে টাইপ করা বুলিয়ান হতে হবে। এর মানে হল, iff myObjectশক্তিশালী ভাবে টাইপ করা হয় , return !myObject;একটি ফাংশন জন্য কাজ একটি বুলিয়ান ফেরার কিন্তু return myObject;না। আপনাকে return !!myObjectটাইপস্ক্রিপ্টের প্রত্যাশা মেলাতে হবে।

টাইপস্ক্রিপ্টের ব্যতিক্রম? যদি myObjectতা হয়ে থাকে তবে anyআপনি জাভাস্ক্রিপ্টের ওয়াইল্ড ওয়েস্টে ফিরে এসেছেন এবং এটির ছাড়াই ফিরে আসতে পারেন !!, এমনকি আপনার রিটার্নের ধরণটি বুলিয়ান।

মনে রাখবেন যে এই JSX & টাইপ করা বিষয় নিয়মাবলী হয় না জাভাস্ক্রিপ্ট সহজাত বেশী

তবে আপনি যদি 0আপনার রেন্ডার করা জেএসএক্সে অদ্ভুত কিছু দেখতে পান তবে শিথিল মিথ্যা ব্যবস্থাপনার জন্য ভাবেন।


ভাল ব্যাখ্যা। তাহলে কি বলবে !! এই কর্মী বৈশিষ্ট্য সনাক্তকরণ উদাহরণে কঠোরভাবে প্রয়োজনীয় নয় ? if (!!window.Worker)
jk7

2
না, আপনার দরকার হবে না। সত্যবাদিতা এবং true"বাহ্যিকভাবে" একটিতে ঠিক একইভাবে কাজ করে if। আমি চেষ্টা চালিয়ে যাচ্ছি, তবে qলাইব্রেরির উদাহরণ হিসাবে, আপনি যদি পরে মানটি পুনরায় ব্যবহার করেন তবে উপরোক্ত সংশ্লেষিত "তুলনা করা সত্যবাদী" মামলার ধরণের বাইরের বুলিয়ান মানকে সত্যতা দেওয়া পছন্দ করার কোনও কারণ আমি ভাবতে পারি না read । তবে তারপরেও এটি তথ্য-ক্ষতির শর্টকাট এবং আমি যুক্তি দিয়েছি যে প্রতিবার সত্যতার মূল্যায়ন করা আপনার পক্ষে আরও ভাল।
ruffin

প্রতিক্রিয়া হ'ল আমরা ব্যবহার শুরু করা প্রধান কারণ !! প্যাটার্ন, তবে এটি খুব সুবিধাজনক এবং পুনরাবৃত্তিযোগ্য জিনিস হতে পারে। আমাকে কেবল কোনও কিছুর সত্যতা বা মিথ্যা সম্পর্কে উদ্বিগ্ন হতে হবে, অন্তর্নিহিত প্রকারটি কী তা নয়।

মন্তব্য ছাড়াই ডাউনভোটগুলি আপনার উদ্বেগের সমাধান করতে সমস্যা করে! কী দেখতে খারাপ তা আমাকে জানান, এবং আমি এটির জন্য খুশি হব happy
রাফিন

55

এটি কেবল লজিকাল নট অপারেটর, দু'বার - এটি কিছু বুলিয়ান রূপান্তর করতে ব্যবহৃত হয়, যেমন:

true === !!10

false === !!0

3
তুমি পৃথিবীতে কেন এমন করবে? ব্যবহার ! অপারেটরটি বুলেয়ানে রূপান্তর করতে চাইলে টাইপের সাথে তুলনা করতে === ব্যবহার করুন? কেবল মেনে নিন আপনার কোনও প্রকার সুরক্ষা নেই এবং ভাল> 0 বা কিছু করুন।
ড্যারেন ক্লার্ক

43
@ ড্যারেন: তিনি ধরণের তুলনা করছেন না; তিনি তার উত্তরে জোর লিখেছেন, ফলাফল কী তা আপনাকে বলছেন।
অরবিট


26

এটি একটি ডাবল notঅপারেশন। প্রথমটি !বুলিয়ানকে মান রূপান্তর করে এবং এর যৌক্তিক মানকে উল্টে দেয়। দ্বিতীয়টি !যৌক্তিক মানটিকে পিছনে উল্টে দেয়।


26

দেখে মনে হচ্ছে !!অপারেটরের ফলস্বরূপ দ্বিগুণ প্রত্যাখ্যান।

var foo = "Hello World!";

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

23

এটি ingালাই Boolean()ফাংশন আচরণ অনুকরণ । প্রথমে NOTকোনও বুলিয়ান মান প্রদান করে তা যা দেওয়া হয় তা বিবেচনা করে না। দ্বিতীয়টি NOTসেই Booleanমানটিকে অবহেলা করে এবং এর ফলে trueএকটি ভেরিয়েবলের বুলিয়ান মান দেয় । শেষ ফলাফলটি Boolean()কোনও মানটিতে ফাংশনটি ব্যবহার করার মতো ।


20

! এটি "বুলিয়ান নয়", যা মূলত তার বুলিয়ান বিপরীতে "সক্ষম" এর মান টাইপ করে। দ্বিতীয় ! এই মানটি ফ্লিপ করে সুতরাং, এর !!enableঅর্থ "সক্ষম নয়" , এর অর্থ আপনাকে enableবুলিয়ান হিসাবে মান দেওয়া ।


18

আমি মনে করি, উল্লেখযোগ্য বিষয় হ'ল যে শর্তটি যৌক্তিক AND / OR এর সাথে মিলিত হয়েছে তা বুলিয়ান মান ফিরিয়ে দেবে না তবে শেষ সাফল্য বা && এর ক্ষেত্রে প্রথম ব্যর্থ হয় এবং ক্ষেত্রে প্রথম সাফল্য বা শেষ ব্যর্থ হয় || শর্ত শৃঙ্খলা।

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একসাথে দু'বার অপারেশন ব্যবহার করছে, !মানটিকে একটিতে রূপান্তর করে booleanএবং এটির বিপরীত হয়, কীভাবে !!কাজ করে তা দেখার জন্য এখানে একটি সাধারণ উদাহরণ :

প্রথমে আপনার কাছে যে জায়গাটি রয়েছে:

var zero = 0;

তারপরে আপনি এটি করেন !0, এটি বুলিয়ান রূপান্তরিত হবে এবং এটিতে মূল্যায়ন হবে true, কারণ 0 হয় falsy, সুতরাং আপনি বিপরীত মান পাবেন এবং বুলিয়ানতে রূপান্তরিত হবেন, সুতরাং এটিতে মূল্যায়ন হয় true

!zero; //true

তবে আমরা মানটির বিপরীত বুলিয়ান সংস্করণটি চাই না , তাই আমাদের ফলাফল পেতে আমরা এটি আবার বিপরীত করতে পারি! এজন্য আমরা আরেকটি ব্যবহার করি !

মূলত, !!আমাদের নিশ্চিত করুন, আমাদের যে মানটি পাওয়া যায় তা হ'ল মিথ্যা, সত্যবাদী বা স্ট্রিং নয় ...

সুতরাং এটি Booleanজাভাস্ক্রিপ্টে ফাংশনটি ব্যবহার করার মতো , তবে কোনও মানকে বুলেয়ানে রূপান্তর করার সহজ ও খাটো উপায়ে:

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

15

!!কনস্ট্রাক্ট তার বুলিয়ান সমতুল্য মধ্যে কোনো জাভাস্ক্রিপ্ট অভিব্যক্তি বাঁক একটি সহজ উপায়।

উদাহরণস্বরূপ: !!"he shot me down" === trueএবং !!0 === false


2
গুরুত্বপূর্ণ পার্থক্য খুব কাছাকাছি। কীটি 0 === falseমিথ্যা এবং !!0 === falseসত্য।
ruffin

14

এটি কোনও একক অপারেটর নয়, এটি দুটি। এটি নীচের সমতুল্য এবং বুলিয়ানতে একটি মূল্য কাস্ট করার দ্রুত উপায়।

val.enabled = !(!enable);

10

আমি সন্দেহ করি এটি সি ++ এর একটি অবশিষ্টাংশ যেখানে লোকেরা ওভাররাইড করে! অপারেটর কিন্তু বুল অপারেটর নয়।

সুতরাং সেই ক্ষেত্রে একটি নেতিবাচক (বা ধনাত্মক) উত্তর পেতে আপনার প্রথমে ব্যবহার করা উচিত! অপারেটর একটি বুলিয়ান পেতে, তবে আপনি যদি পরীক্ষা করতে চান তবে ইতিবাচক কেসটি ব্যবহার করা হবে !!


10

ifএবং whileবিবৃতি এবং ?অপারেটর ব্যবহার সত্য মান কোডের যা শাখা নির্ধারণ রান করতে। উদাহরণস্বরূপ, শূন্য এবং NaN সংখ্যা এবং খালি স্ট্রিংটি মিথ্যা, তবে অন্যান্য সংখ্যা এবং স্ট্রিংগুলি সত্য। অবজেক্টস সত্য, তবে নির্ধারিত মান এবং nullউভয়ই মিথ্যা।

ডাবল নেগেশন অপারেটর !!একটি মানের সত্য মান গণনা করে। এটি প্রকৃতপক্ষে দুটি অপারেটর, !!xযার অর্থ !(!x), এবং নিম্নরূপ আচরণ করে:

  • যদি xএকটি মিথ্যা মান হয়, !xহয় trueএবং !!xহয় false
  • যদি xএকটি সত্য মান হয়, !xহয় falseএবং !!xহয় true

যখন একটি বুলিয়ান প্রসঙ্গের শীর্ষ স্তরে ব্যবহৃত ( if, while, অথবা ?), !!অপারেটর আচরণগতভাবে কোন সমিতি হয়। উদাহরণস্বরূপ, if (x)এবং if (!!x)একই জিনিস বোঝাতে।

ব্যবহারিক ব্যবহার

তবে এর বেশ কয়েকটি ব্যবহারিক ব্যবহার রয়েছে।

একটি ব্যবহার হ'ল কোনও বস্তুকে তার সত্য মানের সাথে সংক্ষেপে সংকুচিত করা হয়, যাতে আপনার কোডটি কোনও বড় অবজেক্টের রেফারেন্স ধরে না রাখে এবং এটিকে জীবিত রাখে। !!some_big_objectপরিবর্তে কোনও পরিবর্তনশীলকে বরাদ্দ করা some_big_objectযাক এটি আবর্জনা সংগ্রহকারীকে দেওয়া উচিত। এটি nullব্রাউজার বৈশিষ্ট্য সনাক্তকরণের মতো কোনও বস্তু বা মিথ্যা মান যেমন বা অপরিজ্ঞাত মান, উত্পাদন করে এমন ক্ষেত্রে এটি কার্যকর ।

আর একটি ব্যবহার, যা আমি সি এর সংশ্লিষ্ট !!অপারেটর সম্পর্কে একটি উত্তরে উল্লেখ করেছি , এটি "লিঙ্ক" সরঞ্জামগুলির সাথে রয়েছে যা সাধারণ টাইপস এবং মুদ্রণ ডায়াগনস্টিকগুলি সন্ধান করে। উদাহরণস্বরূপ, সি এবং জাভাস্ক্রিপ্ট উভয় ক্ষেত্রেই, বুলিয়ান অপারেশনের জন্য কয়েকটি সাধারণ টাইপগুলি অন্যান্য আচরণ তৈরি করে যার আউটপুটটি বুলিয়ান হিসাবে যথেষ্ট নয়:

  • if (a = b)সত্যের মূল্য ব্যবহারের পরে অ্যাসাইনমেন্ট হয় b; if (a == b)একটি সমতা তুলনা।
  • if (a & b)কিছুটা দিকের এবং; if (a && b)একটি লজিকাল এবং। 2 & 5হয় 0(ক মিথ্যা মান); 2 && 5সত্য.

!!অপারেটর তিসি টুল পুনরায় আশ্বস্ত কি আপনি লিখেছেন আপনি কি বোঝানো হয় যে: না এই অপারেশন, তারপর ফলাফলের সত্য মান গ্রহণ করা।

তৃতীয় ব্যবহারটি লজিক্যাল এক্সওআর এবং লজিক্যাল এক্সএনওআর উত্পাদন করা। সি এবং জাভাস্ক্রিপ্ট উভয় ক্ষেত্রেই a && bএকটি লজিক্যাল এ্যান্ড সম্পাদন করে (উভয় পক্ষই সত্য হলে সত্য), এবং a & bকিছুটা ওদিকে ও সম্পাদন করে। a || bএকটি লজিক্যাল ওআর সম্পাদন করে (যদি কমপক্ষে একটি সত্য হয় তবে সত্য), এবং a | bকিছুটা দিকের ওআর সম্পাদন করে। এখানে কিছুটা এক্সওআর (এক্সক্লুসিভ ওআর) a ^ bরয়েছে তবে লজিকাল এক্সওআরের জন্য বিল্ট-ইন অপারেটর নেই (একপাশে সত্য হলে সত্য)। আপনি উদাহরণস্বরূপ, ব্যবহারকারীর দুটি ক্ষেত্রের মধ্যে একটিতে পাঠ্য প্রবেশের অনুমতি দিতে চান। কি আপনি কি করতে পারেন একটি সত্য মান প্রতিটি রূপান্তর এবং তাদের তুলনা হয়: !!x !== !!y



8

এখানে প্রচুর উত্তরের উত্তর রয়েছে, তবে আপনি যদি এ পর্যন্ত পড়েন তবে এটি আমাকে 'এটি পেতে' সহায়তা করেছিল। Chrome (ইত্যাদি) এ কনসোলটি খুলুন এবং টাইপ করা শুরু করুন:

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

স্বভাবতই, এগুলি সমস্ত কেবল নিখরচায় টাইপ করার মতোই! কিছু কিছু হলেও, যুক্ত হওয়া বন্ধনীগুলি এটি আরও বোধগম্য করে তুলতে সহায়তা করতে পারে।


8

!!x সংক্ষিপ্ত Boolean(x)

প্রথম ঠ্যাং জেএস ইঞ্জিনকে চালিত করতে বাধ্য করে Boolean(x)তবে মানটি উল্টানোর ক্ষেত্রে এর পার্শ্ব প্রতিক্রিয়াও রয়েছে। সুতরাং দ্বিতীয় ঠাঁই পার্শ্ব প্রতিক্রিয়া undo।


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

এই প্রশ্নের উত্তর পুরোপুরি জবাব দেওয়া হয়েছে, তবে আমি এমন একটি উত্তর যুক্ত করতে চাই যা আমি আশা করি যতটা সম্ভব সরল করে দেওয়া হয়েছে, যার অর্থ তৈরি করছে !! হিসাবে উপলব্ধি করা সহজ।

যেহেতু জাভাস্ক্রিপ্টকে "সত্যবাদী" এবং "ভুয়া" মান বলা হয়, এমন অভিব্যক্তি রয়েছে যে অন্যান্য এক্সপ্রেশনগুলিতে যখন মূল্যায়ন করা হয় তখন সত্য বা মিথ্যা অবস্থার ফলস্বরূপ, যদিও মূল্যায়ন বা অভিব্যক্তি যাচাই করা হয় তা আসলে trueবা হয় না false

এই ক্ষেত্রে:

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

যদি সেই উপাদানটি বাস্তবে বিদ্যমান থাকে তবে অভিব্যক্তিটি সত্য হিসাবে মূল্যায়ন করবে এবং কোড ব্লক কার্যকর করা হবে।

যাহোক:

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

... সত্যিকারের শর্তের ফলশ্রুতি হবে না এবং উপাদান উপস্থিত থাকলেও কোড ব্লক কার্যকর করা হবে না।

কেন? কারণ document.getElementById()একটি "সত্যবাদী" অভিব্যক্তি যা এই if()বিবৃতিতে সত্য হিসাবে মূল্যায়ন করবে , তবে এটির আসল বুলিয়ান মান নয় true

এই ক্ষেত্রে ডাবল "না" বেশ সহজ। এটি কেবল দুইটি notপিছনে পিছনে।

প্রথমটি কেবল সত্য বা মিথ্যা মানটিকে "উল্টে" দেয়, যার ফলে একটি আসল বুলিয়ান টাইপ হয় এবং তারপরে দ্বিতীয়টি এটি আবার "মূল" হিসাবে ফিরিয়ে দেয় তবে এখন আসল বুলিয়ান মানে। এইভাবে আপনার ধারাবাহিকতা রয়েছে:

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 এর শৃঙ্খলটি পাওয়া যায় এটির প্রথম মিথ্যা মানটি ফিরিয়ে দেবে - এবং এটি যদি বিবৃতি ইত্যাদিতে খাওয়ানো যায় তবে বি.ফু অপরিজ্ঞাত থাকলে এটি অপরিবর্তিত থাকবে এবং b.foo.barবিবৃতিটি এড়িয়ে যাবে এবং আমরা কোন কিছু পাই না ত্রুটি.

উপরের রিটার্নটি অপরিজ্ঞাত হয়েছে তবে যদি আপনার শূন্য স্ট্রিং থাকে তবে মিথ্যা, নাল, 0, অপরিবর্তিত মানগুলি ফিরে আসবে এবং শীঘ্রই আমরা তাদের সাথে মুখোমুখি হব - []এবং {}উভয়ই "সত্যবাদী" এবং আমরা তথাকথিত "অবিরত থাকবে" && শৃঙ্খলা "ডান থেকে পরবর্তী মান।

পিএস একই জিনিসটি করার আরেকটি উপায় হ'ল (b || {}).foo, কারণ বি যদি অপরিবর্তিত থাকে তবে 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

এখানে কৌনিক জেএস থেকে কোডের একটি অংশ

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

 var rafSupported = !!requestAnimationFrame;

তাদের উদ্দেশ্যটি হল অনুরোধে ফাংশনটির প্রাপ্যতার উপর ভিত্তি করে র‌্যাফকে সত্য বা মিথ্যাতে সমর্থনযোগ্য সেট করাঅ্যানিমেশনফ্রেম

সাধারণভাবে নিম্নলিখিত পদ্ধতিতে পরীক্ষা করে এটি অর্জন করা যেতে পারে:

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

স্বল্প উপায় ব্যবহার করা যেতে পারে !!

rafSupported = !!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ব্যবহারে।

দয়া করে s এর নীচে কোড স্নিপেট চেক করুন

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.