javascript - জাভাস্ক্রিপ্ট শেখার বই




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

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

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

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

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


Coerces বুলিয়ান oObject । যদি এটি মিথ্যা ছিল (উদাহরণস্বরূপ 0, null , undefined , ইত্যাদি), এটি false , অন্যথায়, true

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

তাই !! অপারেটর না, এটা ঠিক ! দুইবার অপারেটর।

রিয়েল ওয়ার্ল্ড উদাহরণ "টেস্ট IE সংস্করণ":

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

যদি আপনি ⇒

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

কিন্তু আপনি যদি ⇒

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

আমি উল্লেখযোগ্য মনে করি যে, লজিক্যাল এবং / 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

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

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


এখানে কোণার জেস থেকে কোড একটি টুকরা

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

 var rafSupported = !!requestAnimationFrame;

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

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

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

সংক্ষিপ্ত উপায় ব্যবহার করা যেতে পারে !!

rafSupported = !!requestAnimationFrame ;

তাই অনুরোধ যদি AnimationFrame একটি ফাংশন বরাদ্দ করা হয় তাহলে! অনুরোধআমিমেশন ফ্রেম মিথ্যা এবং আরও এক! এটা সত্য হবে

অনুরোধ যদি অ্যানিমেশন ফ্রেম অনির্ধারিত assing করা হয়! অনুরোধ Animationframe সত্য এবং আরও একটি হবে! এটা মিথ্যা হবে


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

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

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


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


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

val.enabled = !(!enable);

এটি একটি ধরনের রূপান্তর করতে একটি ভয়ঙ্করভাবে অস্পষ্ট উপায়।

! না । তাই !true false , এবং !false true!0 true , এবং !1 false

সুতরাং আপনি একটি বুলিয়ান একটি মান রূপান্তর করছেন, তারপর এটি inverting, তারপর আবার inverting।

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

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

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

এটি একটি বুলিয়ান মান প্রতিফলিত রূপান্তর।


জাভাস্ক্রিপ্টে কিছু অপারেটর অন্তর্নির্মিত ধরনের রূপান্তর সঞ্চালন করে, এবং কখনও কখনও টাইপ রূপান্তর জন্য ব্যবহৃত হয়।

অবিরাম ! অপারেটর তার অপারেড একটি বুলিয়ান রূপান্তর করে এবং এটি অস্বীকার করে।

এই সত্যটি নিম্নলিখিত সূত্রের দিকে পরিচালিত করে যা আপনি আপনার উত্স কোডে দেখতে পারেন:

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

ডবল বুলিয়ান নেতিবাচক। মান অনির্ধারিত না হলে চেক করতে প্রায়ই ব্যবহৃত হয়।


!! এটি একসঙ্গে দুইবার অপারেশন ব্যবহার করে NOT ! মানটিকে একটি boolean রূপান্তর করুন এবং এটি বিপরীত করুন, এখানে দেখতে একটি সহজ উদাহরণ কীভাবে !! কাজ করে:

প্রথমে, আপনার কাছে রয়েছে:

var zero = 0;

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

!zero; //true

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

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

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

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

!! মানটিকে তার সমতুল্য বুলিয়ান মানতে ডান দিকে রূপান্তর করে। (দরিদ্র মানুষের উপায় "টাইপ কাস্টিং" মনে)। তার অভিপ্রায় সাধারণত পাঠকের কাছে পৌঁছাতে হয় যে কোডটি কোনও ভেরিয়েবলের মূল্যকে যত্ন করে না, তবে এটি "সত্য" মান কী।


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

!!foo unary না অপারেটরটিকে দুবার প্রযোজ্য করে এবং ইউনিলি প্লাস +foo ব্যবহার করে বুলিয়ান টাইপের মতো একই সংখ্যায় নিক্ষেপ করতে ব্যবহৃত হয় এবং ফাঁকা স্ট্রিংকে স্ট্যাটাস করা ''+foo স্ট্রিংয়ের জন্য নিক্ষেপ করা।

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

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

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

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

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

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

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

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

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

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

  • if (a = b) বরাদ্দ সত্য মান ব্যবহার করে অনুসরণ করা হয়; if (a == b) একটি সমতা তুলনা।
  • if (a & b) একটি বিটwise এবং; if (a && b) একটি যৌক্তিক এবং। 2 & 5 0 (একটি মিথ্যা মান); 2 && 5 সত্য।

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

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


কিছু চা ব্রু:

!! একটি অপারেটর না। এটা দ্বিগুণ ব্যবহার ! - যা যৌক্তিক "না" অপারেটর।

ধারণায়:

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

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

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

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

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

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

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

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

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

আমরা digress ...

যাইহোক, এই পরিস্থিতিতে খুব বিরল হতে পারে, এমন কিছু পরিস্থিতিতে বিদ্যমান থাকতে পারে যেখানে সংক্ষিপ্ত, সর্বাধিক পারফরম্যান্স, এবং এভাবে অ-বুলিয়ান থেকে true প্রাপ্তির সর্বাধিক পছন্দের উপায়ে, সম্ভবত অনির্ধারিত মান ব্যবহার করা হয় !! । আশা করি এই ridiculously এটি পরিষ্কার করে।


এই সব দুর্দান্ত উত্তরগুলি দেখার পরে, আমি ব্যবহার করার আরেকটি কারণ যুক্ত করতে চাই !! ।কারেন্টি আমি অ্যাঙ্গুলার 2-4 (টাইপস্ক্রিপ্ট) এ কাজ করছি এবং আমার বুলিয়ানটি আবার চালু করতে চাইলে falseআমার ব্যবহারকারীর প্রমাণীকরণ করা হয় না। তিনি প্রামাণ না থাকে, টোকেন-স্ট্রিং হতে হবে nullবা ""। আমি কোডের পরবর্তী ব্লক ব্যবহার করে এটি করতে পারি:

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

লজিক্যাল না অপারেটর ব্যবহার করুন দুই বার
মানে! সত্য = মিথ্যা
এবং !! সত্য = সত্য







operators