"! -" জাভাস্ক্রিপ্টে কি করে?


376

আমার কাছে এই কোডের টুকরো রয়েছে ( এই প্রশ্নটি থেকে নেওয়া ):

var walk = function(dir, done) {
    var results = [];

    fs.readdir(dir, function(err, list) {
        if (err)
            return done(err);

        var pending = list.length;

        if (!pending) 
            return done(null, results);

        list.forEach(function(file) {
            file = path.resolve(dir, file);
            fs.stat(file, function(err, stat) {
                if (stat && stat.isDirectory()) {
                    walk(file, function(err, res) {
                        results = results.concat(res);

                        if (!--pending)
                            done(null, results);
                    });
                } else {
                    results.push(file);

                    if (!--pending) 
                        done(null, results);
                }
            });
        });
    });
};

আমি এটি অনুসরণ করার চেষ্টা করছি এবং আমি মনে করি যে যেখানে এটি বলেছে সেখানে ব্যতীত আমি সবকিছুই বুঝতে পারি !--pending। এই প্রসঙ্গে, সেই আদেশটি কী করে?

সম্পাদনা: আমি পরবর্তী সমস্ত মন্তব্যের প্রশংসা করি, তবে প্রশ্নের উত্তর বহুবার দেওয়া হয়েছে। যাই হোক ধন্যবাদ!


222
কোডটি বজায় রাখতে পরবর্তী ব্যক্তিকে বিভ্রান্ত করার এটি একটি দুর্দান্ত উপায়।
এরিক জে

240
!~--[value] ^ trueআমি এই "জব সিকিউরিটি" এর মতো কোডটি কল করি
TbWill4321

63
এটি আমাকে মনে করিয়ে দেয় অপারেটরের নাম কী -->?
সোনার Gön Decl

36
@ টিবিউইল 4321 যদি আমি কোড পর্যালোচনাটি করছিলাম তবে এটি চাকরির সুরক্ষার ঠিক বিপরীত হবে।
কর্সিকা

8
চলক নামের তৈরির সাথে অপারেটরগুলি মিলিয়ে খুব খারাপ হয় না। কোনও পাকা জাভাস্ক্রিপ্ট প্রোগ্রামার এটি কী করে তা জানতে কয়েক সেকেন্ডের বেশি প্রয়োজন হবে না।
ক্রিশ্চিয়ান ওয়েস্টারবিক

উত্তর:


537

! একটি মান উল্টায় এবং বিপরীত বুলিয়ান দেয়:

!true == false
!false == true
!1 == false
!0 == true

--[value] একটি সংখ্যা থেকে একটি (1) কে বিয়োগ করে এবং তারপরে সেই নম্বরটি দিয়ে কাজ করতে হবে:

var a = 1, b = 2;
--a == 0
--b == 1

সুতরাং, !--pendingমুলতুবি থেকে একজনকে বিয়োগ করে এবং তারপরে তার সত্যবাদী / মিথ্যা মানটির বিপরীত ফিরিয়ে দেয় (তা হোক না কেন 0)।

pending = 2; !--pending == false 
pending = 1; !--pending == true
pending = 0; !--pending == false

এবং হ্যাঁ, প্রোটিপ অনুসরণ করুন। এটি অন্যান্য প্রোগ্রামিং ভাষাগুলিতে সাধারণ আইডিয়াম হতে পারে তবে বেশিরভাগ ঘোষিত জাভাস্ক্রিপ্ট প্রোগ্রামিংয়ের জন্য এটি বেশ বিদেশী দেখায়।


623
প্রোটিপ ™: আপনার কোডে কখনও এটি করবেন না এটি হাস্যকর।
নাফটুলি কে

17
এটি উল্লেখ করে না যে --কেবল ভেরিয়েবলগুলিতে কাজ করে; আপনি এটি সাধারণভাবে এটি প্রয়োগ করতে পারবেন না।
deltab

10
@ দেলতাব: validSimpleAssignmentTargetগুলি, নির্ভুল হতে। এর মধ্যে সনাক্তকারী উল্লেখ এবং সম্পত্তি রেফারেন্স অন্তর্ভুক্ত।
বার্গি

19
--0এবং --1কাজ করবে না।
সংখ্যাগত অক্ষরগুলি

7
@ ফারাপ: ওহ, আমি এই i > -1জিনিসটি পার্স করার চেয়ে বেশি সমস্যায় পড়েছি i--(এবং বিটিডব্লিউ আপনি ভুলে গেছেন i = init() - 1)। প্রতিমাগুলির জন্য এটিই ... এবং প্রতিটি প্রোগ্রামারকে সেগুলি শিখানো উচিত।
বার্জি

149

এটি কোনও বিশেষ অপারেটর নয়, এটি একের পর এক 2 স্ট্যান্ডার্ড অপারেটর:

  1. একটি উপসর্গ হ্রাস ( --)
  2. একটি যৌক্তিক নয় ( !)

এটি pendingহ্রাস হওয়ার কারণ এবং এটি শূন্য কিনা তা পরীক্ষা করে দেখার জন্য।


8
আমি অবশ্যই এটিতে নতুন, তবে কেন এটি ব্যবহারের চেয়ে উন্নত if(pending === 1)?
কায়রান ই

46
@ কিরান, এটি নয়, এটি শর্টহ্যান্ড যা "পঠনযোগ্যতা রাজা" র বিধিটিকে পুরোপুরি ভেঙে দেয়।
রায়ান

23
@ কিরান এটি উচ্চতর হওয়ার বিষয়ে নয়, এটি আলাদা। এটি ভেরিয়েবলটিকে পরিবর্তিত করে (এটি 1 দ্বারা হ্রাস করে) এবং তারপরে পরীক্ষার জন্য নতুন মানটি ব্যবহার করে
অমিত

7
@ কিরান, এটির সমতুল্য if( pending === 1 ) { done... } else { pending = pending - 1; }
কমপক্ষে

7
@CompuChip এটিকে দেখে মনে হচ্ছে - যে কোনও ক্ষেত্রে অর্থ প্রদান করা হবে, সুতরাং কোডটি আরও বেশি: যদি (! বিচারাধীন) p - অর্থ প্রদান; ইত্যাদি} অন্য {- অর্থ প্রদান; ইত্যাদি} এটি বিকাশকারী.মোজিলা.আর.এ.এন
পল রাসেল

109

বেশ কয়েকটি উত্তর এই আদেশটি কী করে তা বর্ণনা করে তবে এখানে কেন এটি করা হয় তা নয় ।

আমি সি ওয়ার্ল্ড থেকে এসেছি, এবং আমি সত্যিকার অর্থে এটি চিন্তা না করে !--pending"গণনা pendingএবং এটি শূন্য কিনা তা পরীক্ষা করে দেখি " read এটি একটি মূর্খতা যা আমি মনে করি একই ভাষায় প্রোগ্রামারদের জানা উচিত।

ফাংশনটি readdirফাইল এবং উপ-ডিরেক্টরিগুলির একটি তালিকা পেতে ব্যবহার করে, যা আমি সম্মিলিতভাবে "এন্ট্রি" বলব।

ভেরিয়েবল pendingএইগুলির মধ্যে কতটি প্রক্রিয়া করতে হবে তা ট্র্যাক করে। এটি তালিকাটির দৈর্ঘ্য হিসাবে শুরু হয় এবং প্রতিটি প্রবেশ প্রক্রিয়াজাত হওয়ার সাথে সাথে শূন্যের দিকে নিচের দিকে গন্য হয়।

এই এন্ট্রিগুলি ক্রমবর্ধমান প্রক্রিয়াজাত করা যেতে পারে, এজন্য কেবল একটি সাধারণ লুপ ব্যবহার না করে গণনা করা প্রয়োজন necessary যখন সব এন্ট্রি প্রক্রিয়া করা হয়েছে কলব্যাক doneএই সত্য মূল আহ্বায়ক অবহিত করার বলা হয়।

প্রথম কলটিতে doneপ্রম্পেন্ড করা হয় return, কারণ আমরা কোনও মান ফিরিয়ে দিতে চাই না, কেবল ফাংশনটি সম্পাদন বন্ধ করে দেওয়ার জন্য। এটি ড্রপ returnএবং বিকল্পটি একটিতে রাখার জন্য ক্লিনার কোড হত else


13
@Bergi এটা সি বিশ্বের একটি সুপরিচিত বাগ্ধারা, কিন্তু এটা হয় না কথ্য জাভাস্ক্রিপ্ট। প্রদত্ত যে কোনও এক্সপ্রেসনের জন্য, বিভিন্ন বাস্তুতন্ত্রের বিভিন্ন, বেমানান আইডিয়াম থাকবে, সেখানে কীভাবে 'এটি করা হয়'। 'বিদেশী' ভাষা থেকে আইডিয়ম ব্যবহার করা বরং একটি খারাপ কোড গন্ধ।
পিটারিস

3
@ পেটারিস: এটি হ'ল হ্রাসকারী অপারেটর থাকা সমস্ত সি-জাতীয় ভাষায় একটি প্রতিমা। অবশ্যই, কখনও কখনও কোনও ভাষাতে বিভিন্ন, আরও ভাল উপায় পাওয়া যায়, তবে আমি মনে করি না যে জেএসের কোনও বিশেষ গণনা রচনা আছে।
বার্গি

6
ডগলাস ক্রকফোর্ডের মতো প্রভাবশালী নেতৃবৃন্দ সহ জাভাস্ক্রিপ্ট সম্প্রদায়ের একটি উল্লেখযোগ্য অংশ রয়েছে, যা সম্পূর্ণভাবে ইউনারি ইনক্রিমেন্ট এবং হ্রাস অপারেটরদের এড়িয়ে চলেন । সেগুলি সঠিক কিনা তা নিয়ে আমি এখানে তর্ক করতে যাচ্ছি না; আমার অভিপ্রায় কেবল এটিই উল্লেখ করতে হবে যেহেতু বিতর্ক বিদ্যমান, কোডের মতো !--pendingঅনেকগুলি লিটার এবং শৈলী নির্দেশিকা ব্যর্থ হবে। আমার পক্ষে এটি বলার পক্ষে যথেষ্ট যে এটি সম্ভবত মূর্খবাদী নয় (বিকল্পটি "ভাল" কিনা তা বিবেচনা না করে)।
গ্র্যান্ডপোপার

3
@ গ্র্যান্ডঅপেনার "আইডিয়োমেটিক" এর অর্থ "একটি ভাষা যা স্থানীয় বক্তারা সাধারণত বোঝে"। ভবিষ্যদ্বাণীটি অবশ্যই সি-এর মতো ভাষার ব্যবহারকারীদের কাছে ভালভাবে বোঝা যায় এবং এক্সটেনশনের মাধ্যমে তাই হয় "! (- x)"। কোনও জিনিস ব্যবহার করা ভাল আইডিয়া হ'ল না এটি সম্পূর্ণরূপে এটি কতটা মূ .়। (উদাহরণস্বরূপ, আমি অত্যন্ত সন্দেহ করি যে আপনি এমন কোনও ভাষার অনেক প্রোগ্রামারদের মধ্যে যাবেন যা "গোটো" কী বোঝে না তা বোঝে না, যদিও আপনার কোডে এটি অন্তর্ভুক্ত করা তালিকার "লম্পট" এবং "খুন" এর মধ্যেই পড়ে) আটটি মারাত্মক পাপের মধ্যে))
জম্ব্বিয়ানো

3
@ ফারাপ এর কারণ সি # এবং জাভা সুস্পষ্ট রূপান্তরিত intকরে না bool, এবং এর ব্যবহারের সাথে একেবারেই কিছুই করার নেই !--
Agop

36

এটা শর্টহ্যান্ড

! এটি না".

-- একটি মান হ্রাস।

সুতরাং !--কোনও মান হ্রাসের ফলাফলকে উপেক্ষা করে প্রাপ্ত মানটি মিথ্যা কিনা তা পরীক্ষা করে দেখুন।

এটা চেষ্টা কর:

var x = 2;
console.log(!--x);
console.log(!--x);

প্রথমটি মিথ্যা, যেহেতু x এর মান 1, দ্বিতীয়টি সত্য, যেহেতু x এর মান 0 হয়।

পার্শ্ব নোট: !x--এক্স প্রথমে মিথ্যা কিনা তা পরীক্ষা করে দেখুন এবং তারপরে এটি হ্রাস পেয়েছে।


পাশের নোট - আপনি কি নিশ্চিত? দেখে মনে হচ্ছে পোস্ট-ফিক্সের তুলনায় উচ্চতর অগ্রাধিকার রয়েছে !, অন্যদিকে প্রাক-ফিক্সটির অগ্রাধিকার কম lower জাভাস্ক্রিপ্ট অপারেটর অগ্রাধিকার
ড্যান্ন্নো

2
হ্যাঁ. (চেষ্টা করুন var x = 2; console.log(!x--); console.log(!x--); console.log(!x--);) পোস্ট- ফিক্সটি-- প্রথমে কার্যকর করতে পারে, তবে এর রিটার্ন মান হ্রাস হওয়ার আগে (পরিবর্তন হ্রাসকারী ) এর আগে চলকের মান ।
লুকাস

আমি মনে করি আপনি বলতে চেয়েছিলেন " !--একটি মান হ্রাস করার ফলাফলকে প্রত্যাখ্যান করে"। কেবলমাত্র বাইরের কোড যেমন console.log()এর বিষয়বস্তু সত্যবাদী কিনা তা পরীক্ষা করে।
মারিওরাফ্ট

31

!এটি জাভাস্ক্রিপ্ট নোট অপারেটর

--একটি প্রাক হ্রাস অপারেটর। সুতরাং,

x = 1;
if (!x) // false
if (!--x) // becomes 0 and then uses the NOT operator,
          // which makes the condition to be true

8
ডাব্লুএইচটি একটি "মিথ্যা বিবৃতি"?
বার্গি

5
@ বের্গী আমি ধরে নিলাম আপনি আসলে এর অর্থটি জানেন তবে আপনি জাভাস্ক্রিপ্টের জন্য এখানে ব্যাখ্যা (যা পাইথন হিসাবে) অন্যান্য ভাষায় কিছুটা ভাল অনুবাদ করে।
ড্যান্ন্নো

1
@ ফারাপ এটি আমার উত্তর নয়, সুতরাং আমি এটি স্পর্শ করব না।
ড্যান্ন্নো

2
@ ডান্ন্নো: আচ্ছা আমি জানি জঘন্য মূল্যবোধগুলি কী এবং বিবৃতিগুলি কী, এবং তাই আমি জানি যে জেএস-তে "মিথ্যা বিবৃতি" এর মতো কোনও জিনিস নেই। আমি ধরে নিই এটি যুক্তির শব্দটিকে বোঝায় না ।
বার্গি

1
আমি বুঝতে পারি না কীভাবে --অপারেটর একটি ধ্রুবক দিয়ে কাজ করতে পারে ... সম্ভবত আপনি তার --xপরিবর্তে বোঝাতে চেয়েছিলেন --0?
এসজুয়ান 76

24
if(!--pending)

মানে

if(0 == --pending)

মানে

pending = pending - 1;
if(0 == pending)

4
আর যে স্পষ্ট পথ কোড লিখতে হয়। অবশ্যই, আমি পছন্দ করি if(0 == pending)টাইপসের সম্ভাবনার কারণে। if(0 = pending)একটি সিনট্যাক্স ত্রুটি। if(pending = 0)এমন একটি অ্যাসাইনমেন্ট যা সমাপ্ত কোডটিতে বিভ্রান্তিকর আচরণের কারণ ঘটবে।
থিও ব্রিংকম্যান

3
@ থিব্রিংকম্যান: আসলে if(0 = pending)কোনও সিনট্যাক্স ত্রুটি নয় - এটি জরিমানার পার্স করে - তবে একটি রেফারেন্স ত্রুটি কারণ 0নির্ধারিত নয় (রেফারেটর ইসিএমএ-262 (6th ষ্ঠ সংস্করণ) সেকশন 12.14.1)।
এইচএমখোলম মনিকা

13

এটি স্থান-পূর্ব প্রাক-সংক্ষেপক দ্বারা অনুসরণকারী নয়।

সুতরাং যদি pending1 এর মান সহ পূর্ণসংখ্যা হয়:

val = 1;
--val; // val is 0 here
!val // evaluates to true

11

এটি কেবল pendingএকের দ্বারা হ্রাস পায় এবং এর যৌক্তিক পরিপূরক (প্রত্যাখ্যান) প্রাপ্ত করে। 0 এর চেয়ে আলাদা যে কোনও সংখ্যার লজিক্যাল পরিপূরক falseএটি 0 এর জন্য true


দয়া করে লক্ষ্য করুন যে "নেগেট" এর বুলিয়ানগুলির চেয়ে সংখ্যার আলাদা অর্থ রয়েছে
বার্গি

1
ঠিক আছে, আমি একটি আলাদা শব্দ ব্যবহার করব। যদিও এটি আরও ভাল কিনা তা নিশ্চিত নন।
মাইনাসফোর

11

ব্যাখ্যা

এটি 2 অপারেটর, এ !এবং এ--

!--x 

সুতরাং, --x দ্বারা 1 টি হ্রাস হবে, তারপরে !x যদি 0 হয় (বা NAN ...) হয় তবে তা সত্য হয় false এই আইডিয়োমটি আপনি "আমরা হ্রাস x এর মতো কিছু পড়তে পারি এবং যদি এটি শূন্য করে তোলে ..."

আপনি যদি এটিকে আরও পঠনযোগ্য করে তুলতে চান তবে আপনি এটি করতে পারেন:

var x = 1
x = x - 1   
if(!x){ //=> true
    console.log("I understand `!--` now!") 
}
x //=> 0

চেষ্টা কর:

/* This is an example of the above, you can read this, but it is not needed for !-- */function interactive(a){$("span.code").keydown(function(e){if(13==(e.keyCode||e.which)){var t=$(this);t.clone().html("code").insertAfter(t.next().next()).show().focus().after(template.clone().removeClass("result-template").show()).next().after("<br>"),interactive(),e.preventDefault()}}).keyup(function(e){13!=(e.keyCode||e.which)&&run()})}var template=$(".result-template").hide(),code=$("span.code");code.attr("contenteditable","true").each(function(e,t){template.clone().removeClass("result-template").insertAfter(t)}),interactive(),$.fn.reduce=[].reduce;function run(){var b=!1,context={};$("span.code").each(function(){var a=$(this),res=a.next().show().removeClass("error");try{with(context)res.html(b?"":"  //=> "+eval(a.text()))}catch(e){b=e,res.html("  Error: "+b.message).addClass("error")}})};run();
/* This is an example of the above, you can read this, but it is not needed for !-- */span.result.error{display:block;color:red}.code{min-width:10px}body{font-family:Helvetica,sans-serif}
<!-- This is an example of the above, you can read this, but it is not needed for `!--` --><span class="result result-template"> //=> unknown </span> <h2>Edit This Code:</h2><code><span class="code">x = 1</span><br><span class="code">!--x</span><br><span class="code"> x </span><br></code> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

ফিডল (কোড চেষ্টা করে দেখুন)


8

এখানে আসল সমস্যা হ'ল দুটি অপারেটর !এবং এর মধ্যে জায়গার অভাব --

আমি জানি না কেন লোকেরা কেন তাদের মাথায় আসে যে আপনি কখনই !অপারেটরের পরে কোনও স্থান ব্যবহার করতে পারবেন না । আমি মনে করি এটি সাধারণ জ্ঞানের পরিবর্তে যান্ত্রিক সাদা স্থানের নিয়মের কঠোর প্রয়োগ থেকে আসে application আমি দেখেছি প্রতিটি কোডিং স্ট্যান্ডার্ড সম্পর্কে সমস্ত ইউনিারি অপারেটরগুলির পরে স্থানগুলি নিষিদ্ধ করে, তবে কেন?

আপনার যদি স্পষ্টভাবে সেই জায়গার প্রয়োজন হয় এমন কোনও ক্ষেত্রে যদি ঘটে থাকে তবে এটি একটি।

কোড এই বিট বিবেচনা করুন:

if (!--pending)
    done(null, results);

শুধু হয় !এবং --একসঙ্গে ভর্তা, আপনি যে পেয়েছেন (তাদের বিরুদ্ধে খুব slammed। কোনটির সাথে কী জড়িত তা বলা মুশকিল।

আরও কিছুটা সাদা জায়গা কোড আরও স্পষ্ট করে তোলে:

if( ! --pending )
    done( null, results );

অবশ্যই, যদি আপনি "পেরেন্সের অভ্যন্তরে কোনও স্থান নেই" এবং "অযৌক্তিক অপারেটরের পরে কোনও স্থান" না করার মতো যান্ত্রিক নিয়মে অভ্যস্ত হন তবে এটি কিছুটা বিদেশী বলে মনে হতে পারে।

তবে দেখুন কীভাবে অতিরিক্ত শ্বেত স্পেস গ্রুপ এবং ifবিবৃতি এবং প্রকাশের বিভিন্ন অংশকে পৃথক করে : আপনি পেয়েছেন --pending, সুতরাং এটি --স্পষ্টভাবে তার নিজস্ব অপারেটর এবং এর সাথে ঘনিষ্ঠভাবে আবদ্ধ pending। (এটি হ্রাস pendingপেয়েছে এবং হ্রাসিত ফলাফলটি দেয়।) তারপরে আপনি এগুলি !থেকে পৃথক হয়ে গেলেন সুতরাং এটি অবশ্যই একটি স্বতন্ত্র অপারেটর, ফলাফলটিকে এড়িয়ে চলে। পরিশেষে, আপনি একটি বিবৃতি তৈরি করার জন্য পুরো অভিব্যক্তিটি পেয়েছেন if(এবং )চারপাশে পেয়েছেন if

এবং হ্যাঁ, আমি মধ্যে স্থান মুছে ifএবং (, কারণ ( জন্যে করতে if। এই( কোনও ধরণের (!--সিনট্যাক্সের অংশ নয় কারণ এটি আসল বলে মনে হয়, (যদি ifবিবৃতিটির বাক্য গঠনের অংশ হয়।

এখানকার হোয়াইটস্পেস কিছু যান্ত্রিক কোডিং মান অনুসরণ না করে অর্থটি যোগাযোগের কাজ করে ।


1
হোয়াইটস্পিড সংস্করণটি আমার কাছে আরও পঠনযোগ্য। আমি যখন প্রথম প্রশ্নটি দেখেছিলাম তখন ধারণা করা !--হয়েছিল এমন কিছু জাভাস্ক্রিপ্ট অপারেটর আমি জানতাম না। এটিকে আরও সুস্পষ্ট করার জন্য কেন বন্ধনী ব্যবহার করবেন না? if(!(--pending))
Emory

1
কোনও স্টাইল গাইড আমি ব্যবহার নিষিদ্ধ ++বা সচেতন সম্পর্কে সচেতন নই --, তবে অনেকে প্রিফিক্স অপারেটরের পরে এবং অ-অপরিহার্য বন্ধনীগুলি ব্যবহার করার জন্য অ-প্রয়োজনীয় স্থানগুলি ব্যবহার করতে নিষেধ করে !

1
অ্যানারি অপারেটরগুলির পরে হোয়াইটস্পেস নিরুৎসাহিত করা হয় কারণ এটি এটি পরিচালনা করে এমন অভিব্যক্তি থেকে পৃথক করে। আপনি চাইছেন এটি একসাথে পড়া হোক ... কমপক্ষে imho
aldrin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.