টিলড একটি ভাব প্রকাশের আগে কী করবে?


195
var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
           ? 'value'
           : 'innerHTML'

আমি এটি একটি উত্তরে দেখেছি এবং আমি এটি আগে কখনও দেখিনি।

এর মানে কী?


উত্তর:


266

~এটি একটি বিটওয়াস অপারেটর যা এর অপরেন্ডে সমস্ত বিটগুলি ফ্লিপ করে।

উদাহরণস্বরূপ, যদি আপনার নম্বরটি হয় 1তবে আইইইই 754 এর ফ্লোটের বাইনারি উপস্থাপনা (জাভাস্ক্রিপ্ট সংখ্যাগুলি কীভাবে আচরণ করে) হবে ...

0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

সুতরাং ~এর অপারেন্ডটিকে 32 বিট পূর্ণ সংখ্যায় রূপান্তরিত করে (জাভাস্ক্রিপ্টে বিটওয়াইস অপারেটররা তা করে) ...

0000 0000 0000 0000 0000 0000 0000 0001

যদি এটি একটি নেতিবাচক সংখ্যা হয় তবে এটি 2 এর পরিপূরকতে সংরক্ষণ করা হবে: সমস্ত বিট উল্টে 1 টি যুক্ত করুন।

... এবং তারপরে বিটগুলি ফ্লিপ করে ...

1111 1111 1111 1111 1111 1111 1111 1110

তা হলে এর ব্যবহার কী? কেউ কখন এটি ব্যবহার করতে পারে?

এটির বেশ কয়েকটি ব্যবহার রয়েছে। আপনি যদি নিম্ন স্তরের জিনিস লিখছেন তবে এটি কার্যকর hand আপনি যদি নিজের অ্যাপ্লিকেশনটির প্রোফাইল দেন এবং কোনও বাধা পেয়ে থাকেন তবে বিটওয়াইজ ট্রিকস ( আরও বড় ব্যাগের মধ্যে একটি সম্ভাব্য সরঞ্জাম হিসাবে) ব্যবহার করে এটি আরও পারফরম্যান্ট করা যেতে পারে ।

এটি একটি (সাধারণত) স্পষ্ট নয় কৌতুক চালু করতে indexOf()'s পাওয়া মধ্যে ফেরত মান truthy (যখন তৈরীর পাওয়া যেমন falsy ) এবং মানুষ প্রায়ই এটা দ্বিগুন দ্বারা 32 বিট সংখ্যা ছিন্ন (এবং তার দশমিক স্থান ড্রপ তার পার্শ্ব প্রতিক্রিয়া জন্য এটি ব্যবহার, কার্যকরভাবে Math.floor()ধনাত্মক সংখ্যার জন্য একই )।

আমি অস্পষ্ট বলেছি কারণ এটি কী ব্যবহার করা হচ্ছে তা অবিলম্বে পরিষ্কার নয়। সাধারণত, আপনি চান যে আপনার কোড এটি পড়তে থাকা অন্য ব্যক্তির সাথে স্পষ্টভাবে যোগাযোগ করবে। ব্যবহার করার সময় ~দেখতে দেখতে দুর্দান্ত লাগছে, এটি সাধারণত নিজের ভালোর জন্য খুব চালাক। :)

এছাড়া কম প্রাসঙ্গিক এখন যে জাভাস্ক্রিপ্ট গেছে Array.prototype.includes()এবং String.prototype.includes()। এগুলি একটি বুলিয়ান মান প্রদান করে। যদি আপনার লক্ষ্য প্ল্যাটফর্ম (গুলি) এটি সমর্থন করে তবে আপনার স্ট্রিং বা অ্যারেতে একটি মানের অস্তিত্বের জন্য এটি পরীক্ষা করার জন্য পছন্দ করা উচিত।


2
কদর্য সঠিক শব্দ? যদি এটি কাজ করে তবে আমি এটিকে ভাষার একটি প্রতিমা বলি। অনেক বুদ্ধি আছে। একবার তাদের শিখলে এগুলি অস্পষ্ট নয়। পাইথনগুলিতে তালিকা বোধগম্যতা স্পষ্ট নয় যদি আপনি সেগুলি না জানেন এবং আরও ভার্বোজ লুপগুলি সম্পন্ন করতে পারেন তবে আপনি কখনও পাইথন প্রোগ্রামারকে সেগুলি ব্যবহার না করার জন্য বলবেন না। একইভাবে value = value || defaultজাভাস্ক্রিপ্টে একটি সাধারণ এবং বৈধ প্রজ্ঞাপন যতক্ষণ আপনি জানেন যে আপনি কখন এটি ব্যবহার করতে পারবেন এবং করতে পারবেন না।
gman

3
@gman আমি অনুমান করি যে কেউ এটি ব্যবহার করে বা ব্যবহার করে না কেন এটি আসল ব্যাপার নয়। আমি মনে করি এটির সাথে তালিকার বোঝার (ভাষার বৈশিষ্ট্য) তুলনা করা আসলে একই জিনিস নয় ( কিছু অতিরিক্ত অক্ষর টাইপ করা এড়ানোর চতুর উপায়)। আপনি যদি মনে করেন যে কদর্য শব্দটি খুব কঠোর হয় তবে দয়া করে আমার উত্তরটি সম্পাদনা করতে দ্বিধা বোধ করবেন।
অ্যালেক্স

2
আরও সাধারণ উদাহরণ হতে পারে v = t ? a : b;। আমি প্রায় var v; if (t} { v = a; } else { v = b; }5+ লাইন জুড়ে বিচ্ছিন্ন হয়ে ওঠার চেয়ে আরও স্পষ্ট দেখতে পাই var v = b; if (t) { v = a; }যা সাধারণত 4+ লাইন হতে পারে। তবে আমি প্রচুর লোককে ? :অপারেটরদের সাথে পরিচিত না যারা দ্বিতীয় বা তৃতীয় উপায়ে পছন্দ করবে। আমি প্রথমটি আরও পাঠযোগ্য find আমি সাধারণ নীতির সাথে একমত, কোড পরিষ্কার করে, হ্যাক ব্যবহার করবেন না। আমি অনুমান করি আমি এটি ~v.indexOf('...')একবার শিখে ফেললে খুব পরিষ্কার হতে দেখছি ।
gman

9
যখন আপনি অনেক বিকাশকারীদের সাথে একটি বৃহত কর্পোরেশনে কাজ করছেন আপনি কোডটি স্পষ্টভাবে লিখিত হতে চান (ENGLISH) এবং ভাল ডকুমেন্টেড। আবর্জনা সংগ্রহের সাথে কোনও ভাষায় উচ্চ স্তরের কোডিংয়ের বিষয়টি হ'ল বাইনারি ক্রিয়াকলাপগুলি সম্পর্কে চিন্তাভাবনা এড়ানো এবং অনেক ফ্রন্ট-এন্ড বিকাশকারী এমনকি তাদের বেল্টের অধীনে সমাবেশ ভাষার অভিজ্ঞতাও রাখেন না।
ব্যবহারকারী 2867288

3
আমি ~অভিব্যক্তি বলব না । এটা টেকনিক্যালি ভাষা অংশ বৈশিষ্ট , কিন্তু এটা ভাষার এত অংশ না সাধারণ ব্যবহারে
worc

108

indexOf()অভিব্যক্তির কার্যকরভাবে কার্যকর হওয়ার আগে এটি ব্যবহার করা আপনাকে সরাসরি ফিরে আসা সংখ্যার সূচকের পরিবর্তে সত্যবাদী / মিথ্যা ফলাফল দেয়।

যদি ফেরত মান হয় -1, তাহলে ~-1হয় 0কারণ -1সব 1 বিট একটি স্ট্রিং। শূন্যের চেয়ে বড় বা সমান যে কোনও মান একটি শূন্য-ফলাফল দেয়। সুতরাং,

if (~someString.indexOf(something)) {
}

if"কিছু" যখন "কিছু স্ট্রিং" এ থাকে তখন কোডটি চালানোর কারণ ঘটায়। আপনি যদি .indexOf()সরাসরি বুলিয়ান হিসাবে ব্যবহার করার চেষ্টা করেন তবে তা কার্যকর হবে না কারণ কখনও কখনও এটি শূন্য হয় (যখন "কিছু" স্ট্রিংয়ের শুরুতে থাকে)।

অবশ্যই এটি কাজ করে:

if (someString.indexOf(something) >= 0) {
}

এবং এটি যথেষ্ট কম রহস্যজনক।

কখনও কখনও আপনি এটি দেখতে পাবেন:

var i = ~~something;

এর ~মতো দু'বার অপারেটর ব্যবহার করা স্ট্রিংটিকে 32-বিট পূর্ণসংখ্যায় রূপান্তর করার দ্রুত উপায়। প্রথমটি ~রূপান্তরটি করে এবং দ্বিতীয়টি ~বিটগুলি পিছনে পিছনে ফেলে। অবশ্যই অপারেটর এমন কোনও কিছুর সাথে প্রয়োগ করা হয় যা কোনও সংখ্যায় রূপান্তর করা যায় না, আপনি NaNফলস্বরূপ পান। ( সম্পাদনা করুন - এটি ~প্রথমে প্রয়োগ করা দ্বিতীয়টি, তবে আপনি ধারণাটি পান।)


2
যারা ধীরে ধীরে উপেক্ষা করতে চান না, ~যখন পূর্ণসংখ্যার উপর সঞ্চালিত হয় সমান -(x + 1)
ফ্যাব্রিসিও ম্যাট

মনে হচ্ছে, ভাল, আপনি জানেন যে, নেজিটিভ সংখ্যাসূচক মানগুলি প্রথমে negativeণাত্মক বুলিয়ানগুলি প্রদান করে। তবে জেএসের আর একটি ব্যর্থ হয়েছে, আমার ধারণা?
wwaawaw

7
@adlwalrus ভাল ঐতিহ্য 0হচ্ছে falseএবং অ শূন্য হচ্ছে trueখেজুর পথ ফিরে '70s এবং সম্ভবত অন্যান্য তত্কালীন সমসাময়িক ভাষায় প্রোগ্রামিং সিস্টেম প্রচুর অন্তত সি চাপ দিতে থাকেন। এটি সম্ভবত হার্ডওয়্যার যেভাবে কাজ করে তা থেকে উদ্ভূত হয়েছে; প্রচুর সিপিইউ অপারেশনের পরে শূন্য বিট সেট করে এবং এটি পরীক্ষা করার জন্য সংশ্লিষ্ট শাখার নির্দেশনা দেয়।
পয়েন্টটি

4
এটিকে 32 বিট ইন্টিতে রূপান্তরিত করার দ্রুত উপায় হ'ল এক্ষেত্রে এটি | 0কেবলমাত্র একটি অপারেশন।
অ্যালেক্স

@ অ্যালেক্স প্রকৃতপক্ষে, যদিও আমরা রানটাইমের উপর নির্ভর করতে পারি না ~~ঠিক একইভাবে একটি সাধারণ অ্যাপ্লিকেশনটির ব্যাখ্যা না দেওয়া ।
পয়েন্টটি

28

~হয় bitwise না অপারেটর , ~xমোটামুটি মিলে যায় -(x+1)। এটা বোঝা সহজ, সাজানোর। তাই:

~2;    // -(2+1) ==> -3

বিবেচনা করুন -(x+1)-1একটি উত্পাদন করতে যে অপারেশন করতে পারেন 0

অন্য কথায়, ~সংখ্যার মানগুলির ব্যাপ্তি সহ ব্যবহৃত কেবল ইনপুট মানের জন্য একটি মিথ্যা (বাধ্যতামূলক ) falseথেকে মান উত্পন্ন করবে , অন্যথায়, অন্য কোনও সত্যবাদী মান।0-1

যেমনটি আমরা জানি, -1সাধারণত একটি সেন্ডিনেল মান বলা হয় । এটা অনেক ফাংশন যে ফিরে আসতে জন্য ব্যবহার করা হয় >= 0মান সাফল্য এবং -1জন্য ব্যর্থতা সি ভাষায়। যা indexOf()জাভাস্ক্রিপ্টে রিটার্ন মান একই নিয়ম ।

এইভাবে অন্য স্ট্রিংয়ের স্ট্রাস্টিংয়ের উপস্থিতি / অনুপস্থিতি পরীক্ষা করা সাধারণ common

var a = "Hello Baby";

if (a.indexOf("Ba") >= 0) {
    // found it
}
if (a.indexOf("Ba") != -1) { 
    // found it
}

if (a.indexOf("aB") < 0) { 
    // not found
}
if (a.indexOf( "aB" ) == -1) { 
    // not found
}

তবে ~নীচের মত এটি করা আরও সহজ হবে

var a = "Hello Baby";

~a.indexOf("Ba");         // -7   -> truthy
if (~a.indexOf("Ba")) {   // true
    // found it
}

~a.indexOf("aB");         // 0    -> falsy
!~a.indexOf("aB");        // true
if (!~a.indexOf( "aB" )) {  // true
    // not found
}

আপনি জেএস জানেন না: কাইল সিম্পসন দ্বারা টাইপস এবং ব্যাকরণ


1
এটা স্পষ্টভাবে অভিহিত মূল্য এ বুঝতে, এমনকি যদি একজন ব্যক্তির পটভূমি এটি কাজ করে তোলে বোঝে না সহজ। আমি -(x+1)যদি এটি যদি বিবৃতিতে দেখে থাকি তবে আমি এটি দ্বিতীয়বার দেখতে চাই । টিলড আমাকে জানায় যে জাভাস্ক্রিপ্টের 0-ভিত্তিক প্রকৃতির ক্ষতিপূরণ দেওয়ার জন্য এটি ঠিক কী করছে। এছাড়াও, কম বন্ধনী পড়ার জন্য আরও ভাল
নিয়মিত জো

আপনার প্রাথমিক চেক কোড ব্লকে আপনি এটি ব্যবহার করে কম টাইপ করতে পারেন if (a.indexOf("Ba") > -1) {// found} //true, যদিও টিলড উদাহরণগুলির চেয়ে কিছুটা দৈর্ঘ্য, আপনি যে দুটি উদাহরণ দিয়েছেন এবং নতুন প্রোগ্রামারদের জন্য var opinion = !~-1 ? 'more' : 'less'বোধগম্য তার চেয়ে যথেষ্ট কম ।
Hmerman6006

24

~indexOf(item) বেশিরভাগ সময় উপস্থিত হয়, এবং এখানে উত্তরগুলি দুর্দান্ত, তবে সম্ভবত কিছু লোককে এটি কীভাবে ব্যবহার করতে হবে এবং তত্ত্বটি "এড়িয়ে যান":

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }

1
আমি সম্মতি জ্ঞাপন করি. এয়ারবিএনবি জাভাস্ক্রিপ্ট স্টাইল গাইড মঞ্জুরি দেয় না ++এবং --কারণ তারা "অত্যধিক কৌতূহলকে উত্সাহিত করে" এবং তবুও কোনওরকমে~ বেঁচে গিয়েছিল (ছায়ায় লুকিয়ে থাকা) github.com/airbnb
javascript/

@Shanimal বিকল্প নেই list.indexOf(item) >= 0বা ... > -1জাভাস্ক্রিপ্ট যেহেতু শূন্য-ভিত্তিক ও গোড়া থেকে এই ঠিকানায় চয়ন করা হয়নি। আরও, কেবল মতামত (এয়ারবোনব এর অনুরূপ), জাভাস্ক্রিপ্টে অর্থবহ কিছু করছে এমন যে কেউ জানে ++এবং যখন --কম সাধারণ হয়, তখন অর্থটি অনুমান করা যায়।
নিয়মিত জো

@ নিয়মিত জো আমি এর বেশিরভাগের সাথেই একমত। আমি ব্যক্তিগতভাবে প্রয়োজন নি ++এবং --কারণ মত আদিম পদ্ধতির একটি সময় map, forEachইত্যাদি আমার পয়েন্ট কেন তারা বিবেচনা না বেশি ~বেজায় চতুর যখন যাই হোক না কেন মান ব্যবহৃত বৃদ্ধি এবং হ্রাস অপারেটরদের অন্তর্ভুক্ত করা হয়েছে। কিছু নিষেধ করার জন্য যাতে সিআইএস 101 এর কোনও অর্থ হয় না।
শানিমাল

11

ফলাফল থেকে সত্যবাদী মান তৈরি করতে টিলড ট্রিকটি ব্যবহার করার জন্য যারা বিবেচনা করছেন তাদের পক্ষে indexOfএটি আরও স্পষ্ট এবং এর পরিবর্তে includesপদ্ধতিটিString ব্যবহার করার জন্য কম যাদু রয়েছে

'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false

নোট করুন যে এটি ES 2015 হিসাবে একটি নতুন মান পদ্ধতি তাই এটি পুরানো ব্রাউজারগুলিতে কাজ করবে না। যে ক্ষেত্রে এটি গুরুত্বপূর্ণ, স্ট্রিং.প্রোটোটাইপ.পলিটফিল সহ বিবেচনা করুন ।

এই বৈশিষ্ট্যটি একই সিনট্যাক্স ব্যবহার করে অ্যারেগুলির জন্যও উপলব্ধ :

['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false

আপনার যদি পুরানো ব্রাউজার সমর্থন প্রয়োজন হয় তবে এখানে অ্যারে.প্রোটোটাইপ.পলিটফিল অন্তর্ভুক্ত রয়েছে


2
() অন্তর্ভুক্ত ব্যবহার করা এড়িয়ে চলুন। এটি লেখার সময় আইই এর কোনও সংস্করণে (কেবল পুরানো ব্রাউজারগুলি নয়) সমর্থিত নয়: বিকাশকারী.মোজিলা.আর.ইন
ডকস / ওয়েব

8
বা কেবল একটি সংকলক ব্যবহার করুন, সুতরাং আপনি সেখানে সবচেয়ে খারাপ সাধারণ ডিনমিনেটর জেএস ইন্টারপ্রেটার অনুযায়ী ভাষাটি লেখার পরিবর্তে পরিষ্কার কোড লিখতে পারেন ...
কাইল বেকার

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