কীভাবে !! ~ (টিলডে / ব্যাং ব্যাং টিলডে নয়) অ্যারে পদ্ধতি কলটি একটি 'অন্তর্ভুক্ত / অন্তর্ভুক্ত' এর ফলাফলকে কীভাবে পরিবর্তন করবে?


95

আপনি যদি এখানে jQuery inArrayপৃষ্ঠাতে মন্তব্যগুলি পড়েন তবে একটি আকর্ষণীয় ঘোষণা আছে:

!!~jQuery.inArray(elm, arr) 

এখন, আমি বিশ্বাস করি যে একটি দ্বৈত-বিস্ময়বোধক পয়েন্ট ফলাফলটির booleanমান সহ, টাইপকে রূপান্তরিত করবে true। আমি যা বুঝতে পারি না তা হ'ল এই সমস্তটিতে টিলড ( ~) অপারেটরের ব্যবহার কী ?

var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }

ifবিবৃতি রিফ্যাকচারিং :

if (!!~jQuery.inArray("one", arr)) { alert("Found"); }

ভাঙ্গন:

jQuery.inArray("one", arr)     // 0
~jQuery.inArray("one", arr)    // -1 (why?)
!~jQuery.inArray("one", arr)   // false
!!~jQuery.inArray("one", arr)  // true

আমি আরও খেয়াল করেছি যে যদি টিলডটি সামনে রাখি তবে ফলাফল হয় -2

~!!~jQuery.inArray("one", arr) // -2

আমি এখানে টিলডের উদ্দেশ্য বুঝতে পারি না। কেউ দয়া করে এটি ব্যাখ্যা করতে পারেন বা আমাকে কোনও উত্সের দিকে নির্দেশ করতে পারেন?


50
এই জাতীয় কোডটি যে লিখতে হবে তাকে কীবোর্ড থেকে সরে যেতে হবে।
কर्क ওল

12
@ কির্কওয়োল: কেন? ~jQuery.inArray()আসলে খুব দরকারী - সম্ভবত অনুসন্ধানের ক্রিয়াকলাপগুলি -1ব্যর্থতার জন্য ফিরে আসার খুব ভাল কারণ (দুজনের পরিপূরক একমাত্র মূল্যই মিথ্যা)। একবার আপনি কৌতুকটি দেখে ও বুঝতে পেরেছেন, আমি মনে করি এটি এর চেয়ে আরও বেশি পঠনযোগ্য != -1
আমাদান

9
@ আমদান - না শুধুমাত্র না. সিরিয়াসলি, আমি বিশ্বাস করতে পারি না আপনি কোনও কিছুর পক্ষে রক্ষা !!~করছেন ।
কर्क ওল

24
সমস্যাটি হ'ল, এটি কেবল: একটি "কৌশল"। আমার if (x != -1)এবং if (~x)আমার মধ্যে প্রধান পার্থক্যটি হ'ল প্রাক্তনটি আসলে আপনি যা করতে চান তা প্রকাশ করে। পরেরটি আপনাকে পুরোপুরি অন্য কিছু করতে চায় বলে প্রকাশ করে ("দয়া করে আমার -৪-বিট নম্বরটি 32-বিট পূর্ণসংখ্যায় রূপান্তর করুন এবং পরীক্ষা করুন যে সেই সংখ্যার বিটওয়াইসটি সত্যবাদী কিনা"), যেখানে আপনি কেবল এতে পছন্দসই ফলাফলটি পেতে পারেন? একটি কেস
জিম্মিথ

10
>= 0সম্ভবত যথেষ্ট লিট ছিল না , তাই আরও ক্রিপ্টিক !!~ব্যবহৃত হয়েছিল।
যোশি

উত্তর:


57

টিলড অপারেটরটি আসলে jQuery এর অংশ নয় - এটি জাভাস্ক্রিপ্টে নিজেই কিছুটা অপারেটর নয়।

দেখুন টিল্ড (~) গ্রেট রহস্য

আপনি আপনার পরীক্ষাগুলিতে অদ্ভুত সংখ্যা পাচ্ছেন কারণ আপনি একটি পূর্ণসংখ্যার উপর কিছুদিক থেকে লজিক্যাল অপারেশন করছেন (যা আমি জানি সবাইকে দু'জনের পরিপূরক বা এরকম কিছু হিসাবে সংরক্ষণ করা যেতে পারে ...)

টু এর পরিপূরক বাইনারি কোনও সংখ্যাকে উপস্থাপন করার উপায় ব্যাখ্যা করে। আমি মনে করি আমি ঠিক ছিলাম।


4
স্থির! (এটিকে অন্য লিঙ্কে পরিবর্তন করেছেন যা উদ্ভটভাবে যথেষ্ট, আমার মূল উত্তরের পরে লেখা হয়েছিল ...)
pglhall

121

এর একটি বিশেষ কারণ রয়েছে যা আপনি মাঝে মাঝে ~সামনে প্রয়োগ করতে দেখেন $.inArray

মূলত,

~$.inArray("foo", bar)

করার একটি ছোট উপায়

$.inArray("foo", bar) !== -1

$.inArrayপ্রথম আর্গুমেন্টটি পাওয়া গেলে অ্যারেতে আইটেমের সূচকটি প্রদান করে এবং যদি এটি পাওয়া যায় না তবে এটি -1 প্রদান করে। এর অর্থ হ'ল আপনি যদি "ব্রেইনের মধ্যে এই মান?" এর বুলিয়ান সন্ধান করেন তবে আপনি বুলিয়ান তুলনা করতে পারবেন না, যেহেতু -1 সত্যবাদী মান, এবং যখন $ ) এর অর্থ এটি অ্যারের প্রথম উপাদানটিতে প্রকৃতপক্ষে পাওয়া যায়।

প্রয়োগ করা হচ্ছে ~bitwise অপারেটর ঘটায় -1পরিণত 0এবং পরিণত `0 ঘটায় -1। সুতরাং, অ্যারেতে মানটি খুঁজে না পাওয়া এবং বিটওয়াইজ নম্বরের ফলস্বরূপ ফলস্বরূপ মান (0) পাওয়া যায় না এবং অন্যান্য সমস্ত মান-অ -0 সংখ্যা ফিরে আসবে এবং সত্যবাদী ফলাফলের প্রতিনিধিত্ব করবে।

if (~$.inArray("foo", ["foo",2,3])) {
    // Will run
}

এবং এটি কাজ হিসাবে কাজ করবে।


4
এটি ব্রাউজারগুলিতে (এখন ২০১৪ সালে?) কতটা সমর্থিত বা এটি পুরোপুরি সমর্থিত ছিল?
বিস্ফোরণ বড়ি

এগুলির মতো বেসিক অপারেশনগুলি নিখুঁত না হলে আমি অবাক হব।
প্যাকারভালহো

105

!!~exprঅন্যথায় falseকখন exprহয় তা মূল্যায়ন করে । এটি একই রকম , কেবল ভাঙ্গা *-1true
expr != -1


এটি কাজ করে কারণ জাভাস্ক্রিপ্ট বিটওয়াইজ অপারেশনগুলি অপারেশনগুলিকে দু'জনের পরিপূরক বিন্যাসে 32-বিট স্বাক্ষরিত পূর্ণসংখ্যায় রূপান্তর করে। সুতরাং !!~-1নিম্নলিখিত হিসাবে মূল্যায়ন করা হয়:

   -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1
  ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits)
   !0 = true                                     // ! is logical not (true for falsy)
!true = false                                    // duh

অন্য কোনও মানের -1কমপক্ষে এক বিট শূন্যতে সেট করা থাকবে; এটি বিপরীত করা সত্যবাদী মান তৈরি করবে; !দু'বার অপারেটর প্রয়োগ করে সত্যের মান বুলিয়ান সত্য দেয়।

কখন ব্যবহার করা হয় .indexOf()এবং আমরা কেবল ফলাফলটি কিনা তা পরীক্ষা করতে চাই -1:

!!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false
!!~"abc".indexOf("a") // indexOf() returns  0, the expression evaluates to true
!!~"abc".indexOf("b") // indexOf() returns  1, the expression evaluates to true

* !!~8589934591এটি মিথ্যা তাই মূল্যায়নঘৃণাজন্য পরীক্ষার জন্য নির্ভরযোগ্যভাবে ব্যবহার করা যাবে না -1


4
একটি স্থিতিশীল লাইব্রেরিতে আমি ব্যবহারের সাথে কোনও সমস্যা দেখছি না ~foo.indexOf(bar), এটি চরিত্র বা অভিনয় সম্পাদনের ক্ষেত্রে উল্লেখযোগ্য সঞ্চয় নয়, তবে এটি একইভাবে তুলনামূলকভাবে সাধারণ শর্টহ্যান্ড foo = foo || {}
zzzzBov

6
এটি কোনও সমস্যা নয় ... যতক্ষণ না অন্য কাউকে আপনার কোড দিয়ে চালিয়ে যেতে বলা হচ্ছে।
সালমান এ


4
@ অ্যাসটিল, আমি সেই নিয়ম সম্পর্কে ভাল করেই অবগত, তবে বিটওয়াইজ অপারেটররা প্রতিটি প্রোগ্রামিং ভাষার একটি অংশ যা আমি ভাবতে পারি। আমি এমনভাবে প্রোগ্রাম করার চেষ্টা করি যা কোড পড়তে পারে এমন কারও কাছে পঠনযোগ্য । আমি কোনও ভাষার বৈশিষ্ট্যগুলি ব্যবহার বন্ধ করি না কেবল কারণ এটি অন্য কেউ বুঝতে পারে না, অন্যথায় আমি এমনকি ব্যবহার করতে সক্ষম হব না!!
zzzzBov

কড়া কথা বললে, >= 0এর মতো আচরণ হয় না !!~!== -1কাছাকাছি
পিটার ওলসন

33

~foo.indexOf(bar)প্রতিনিধিত্ব করার জন্য একটি সাধারণ শর্টহ্যান্ড foo.contains(bar)কারণ containsফাংশনটি বিদ্যমান নেই।

জাভাস্ক্রিপ্টের "মিথ্যা" মানগুলির ধারণার কারণে সাধারণত বুলিয়ান কাস্ট করা অপ্রয়োজনীয়। এই ক্ষেত্রে এটি ফাংশনের আউটপুটটিকে জোর করে trueবা করতে বাধ্য হয় false


6
+1 এই উত্তরটি গ্রহণযোগ্য উত্তরের চেয়ে "কেন" ভাল ব্যাখ্যা করে।
স্পষ্টত 21

18

jQuery.inArray()আয় -1জন্য "পাওয়া যায়নি", যার সম্পূরক ( ~) হল 0। সুতরাং, "পাওয়া যায়নি" এর জন্য ~jQuery.inArray()একটি মিথ্যা মান ( 0) এবং "পাওয়া" এর জন্য সত্যবাদী মান (aণাত্মক পূর্ণসংখ্যা) প্রদান করে। !!এরপরে মিথ্যা / সত্যবাদীটিকে বাস্তব বুলিয়ান false/ তে আনুষ্ঠানিক রূপ দেবে true। সুতরাং, !!~jQuery.inArray()দেব true"খুঁজে" জন্য এবং falseজন্য "পাওয়া যায়নি"।



10

~অপারেটর, bitwise সম্পূরক অপারেটর। inArray()যখন উপাদানটি পাওয়া যায় না বা কোনও অ-নেতিবাচক পূর্ণসংখ্যার পূর্ণসংখ্যার ফলাফল হয় -১ হয়। -1 এর বিটওয়াস পরিপূরক (সমস্ত 1 বিট হিসাবে বাইনারিতে উপস্থাপিত) শূন্য। যে কোনও অ-নেতিবাচক পূর্ণসংখ্যার বিটওয়াইস-পরিপূরক সর্বদা শূন্য নয় is

সুতরাং, !!~iহতে হবে trueযখন পূর্ণসংখ্যা "আমি" একটি অ-নেতিবাচক পূর্ণসংখ্যা, এবং falseযখন "আমি" ঠিক -1।

নোট করুন যে ~সর্বদা এটির সংখ্যাকে পূর্ণসংখ্যার সাথে জোর করে; এটি হ'ল এটি অ-পূর্ণসংখ্যার ভাসমান পয়েন্ট মানকে পূর্ণসংখ্যার পাশাপাশি অ-সংখ্যাগত মানকে বাধ্য করে forces


10

টিল্ড বিটওয়াইজ নয় - এটি প্রতিটি বিলের মানকে উল্টে দেয়। থাম্বের একটি সাধারণ নিয়ম হিসাবে, আপনি যদি ~কোনও সংখ্যায় ব্যবহার করেন তবে এর চিহ্নটি উল্টে যাবে, তবে 1 টি বিয়োগ করা হবে।

সুতরাং, আপনি যখন করবেন ~0, আপনি -1 পাবেন (0 উল্টা হয় -0, বিয়োগ 1 হয় -1)।

এটি মূলত সর্বদা বুলিয়ান একটি মান পাওয়ার জন্য একটি বিস্তৃত, সুপার-মাইক্রো-অনুকূলিত উপায়।


8

আপনি ঠিক বলেছেন: কলটি ফেরার falseপরে এই কোডটি ফিরে আসবে indexOf-1; অন্যথায় true

আপনি যেমনটি বলেছিলেন তেমন কিছু ব্যবহার করা আরও বুদ্ধিমানের কাজ হবে

return this.modifiedPaths.indexOf(path) !== -1;

4
কিন্তু ক্লায়েন্টের কাছে পাঠানোর জন্য এটি আরও 3 বাইট! সম্পাদনা: (কেবলমাত্র ঠাট্টা-বিদ্রূপ করে, আমার মন্তব্য পোস্ট করলেন এবং বুঝতে পারলেন যে এটি সুস্পষ্ট নয় (যা দু: খজনক এবং নির্বোধ উভয়ই))
ওয়েসলি মার্চ

@ ওয়েসলি: এটি সত্য, তবে ক্লায়েন্টটি ক্যাশে করবে তা ধরে নিয়েই কেবল এটি প্রতিটি ক্লায়েন্টের কাছে একবার প্রেরণ করতে হবে .js। এটি বলার পরেও তারা এর >=0পরিবর্তে ব্যবহার করতে পারে !==-1- প্রেরণের জন্য কোনও অতিরিক্ত বাইট নেই এবং বিট-টুইডলিং সংস্করণের চেয়ে আরও বেশি পঠনযোগ্য।
লুক

4
কে এখানে ট্রলিং করছে? ;) আমি অনুমান করি যে আমি এটিকে গ্রহণযোগ্যভাবে বিবেচনা করেছি যে পাঠযোগ্য কোডটি এই ধরণের প্রশ্ন উত্পন্ন করে এমন ক্রিপ্টিক প্রাক-অপ্টিমাইজড কোডের চেয়ে ভাল। কেবল পরে মিনিফাই করুন এবং এখন পঠনযোগ্য, বোধগম্য কোডটি লিখুন।
ওয়েসলি মার্চ

4
ব্যক্তিগতভাবে আমি বলব যে > -1এটি আরও বেশি পাঠযোগ্য, তবে এটি সম্ভবত খুব সাবজেক্টিভ।
ইয়োশি

6

~অপারেটর bitwise না অপারেটর। এর অর্থ হ'ল এটি একটি বাইনারি আকারে একটি সংখ্যা নেয় এবং সমস্ত শূন্যকে একটিতে এবং শূন্যে রূপান্তরিত করে।

উদাহরণস্বরূপ, বাইনারিতে 0 নম্বরটি হয় 0000000, যখন -1 হয় 11111111। একইভাবে, 1 00000001বাইনারি হয়, যখন -2 হয় 11111110


3

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

আমি অন্য উত্তরের সাথে একমত যে এটি একটি ওভারকিল তবে সম্ভবত একটি আঁটসাঁট লুপটিতে ধারণাটি বোধ করতে পারে (পারফরম্যান্স লাভের অনুমানের প্রয়োজন, যদিও অন্যথায় অকাল অপটিমাইজেশন হতে পারে may)


2

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


1

যেমন (~(-1)) === 0, তাই:

!!(~(-1)) === Boolean(~(-1)) === Boolean(0) === false

4
এটি সম্ভবত সঠিক, তবে এটি প্রশ্নকারীর পক্ষে কার্যকর ব্যাখ্যা? একদমই না. যদি আমি এটি শুরু করে বুঝতে না পারি, তবে এর মতো সংক্ষিপ্ত উত্তর সাহায্য করবে না।
স্পডলি

আমি মনে করি এই উত্তরটি অর্থবোধ করে। যদি আপনার গাণিতিক মস্তিষ্ক থাকে তবে আপনি প্রতিটি পদক্ষেপে কোন অংশগুলি পরিবর্তন করছে তা আপনি স্পষ্ট দেখতে পাচ্ছেন। এটি কি এই প্রশ্নের সেরা উত্তর? না, তবে এটি দরকারী, আমিও তাই মনে করি! +1
টেলর লোপেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.