ค้นหาเว็บไซต์

decrement - "!--" ใน JavaScript ทำอะไร?


ฉันมีชิ้นส่วนของโค้ดนี้ (นำมาจากคำถามนี้):

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 ในบริบทนี้ คำสั่งนั้นทำอะไรได้บ้าง?

แก้ไข: ผม/ฉันขอขอบคุณความคิดเห็นเพิ่มเติมทั้งหมด แต่คำถามนี้ถูกตอบหลายครั้งแล้ว ขอบคุณนะ!

คำตอบ #1

! พลิกค่าหนึ่ง และให้ค่าบูลีนตรงข้ามกับมัน:

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

--[value] ลบหนึ่ง (1) จากตัวเลข แล้วจึงส่งค่าตัวเลขนั้นกลับมาเพื่อนำไปใช้งาน:

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

ดังนั้น !--pending จะลบหนึ่งออกจาก pending จากนั้นคืนค่าตรงข้ามของค่าความจริง/ความเท็จของมัน (ไม่ว่ามันจะเป็น 0 หรือไม่)

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

และใช่ ตามคำแนะนำพิเศษนะ นี่อาจเป็นสำนวนที่พบได้บ่อยในภาษาโปรแกรมอื่น แต่สำหรับการเขียนโปรแกรม JavaScript แบบประกาศส่วนใหญ่แล้ว ดูเหมือนจะแปลกมาก

คำตอบ #2

นั่นไม่ใช่ตัวดำเนินการพิเศษ มันคือสองตัวดำเนินการมาตรฐานเรียงต่อกัน:

  1. การลดค่ากำหนดนำหน้า (--)
  2. การปฏิเสธเชิงตรรกะ (!)

สิ่งนี้ทำให้ pending ถูกลดลงแล้วจึงทดสอบเพื่อดูว่ามันเป็นศูนย์หรือไม่

คำตอบ #3

หลายคำตอบอธิบายว่า คำสั่งนี้ทำอะไร แต่ไม่ใช่ ทำไม มันถึงทำแบบนี้ที่นี่

ฉันมาจากโลกของ C และฉันอ่าน !--pending เป็น “ลดค่าของ pending ลงและตรวจสอบว่ามันเป็นศูนย์หรือไม่” โดยไม่คิดอะไรมาก มันเป็นสำนวนที่ฉันคิดว่านักโปรแกรมในภาษาใกล้เคียงควรรู้

ฟังก์ชันนี้ใช้ readdir เพื่อดึงรายชื่อไฟล์และไดเรกทอรีย่อย ซึ่งฉันจะเรียกรวมกันว่า "รายการ"

ตัวแปร pending ใช้ติดตามจำนวนของรายการเหล่านี้ที่ยังเหลือที่จะต้องประมวลผล มันเริ่มต้นด้วยความยาวของรายการ และลดลงทีละหน่วยจนถึงศูนย์เมื่อแต่ละรายการถูกประมวลผล

รายการเหล่านี้อาจถูกประมวลผลไม่ตามลำดับ ซึ่งเป็นเหตุผลว่าทำไมจึงจำเป็นต้องนับถอยหลังแทนการใช้ลูปธรรมดา เมื่อรายการ ทั้งหมด ถูกประมวลผลแล้ว ฟังก์ชัน callback done จะถูกเรียกเพื่อแจ้งผู้เรียกต้นฉบับเกี่ยวกับข้อเท็จจริงนี้

ในการเรียกครั้งแรกไปยัง done มีการเติม return ข้างหน้า ไม่ใช่เพราะเราต้องการส่งค่ากลับ แต่เพียงเพื่อให้ฟังก์ชันหยุดทำงานตรงจุดนั้น โค้ดจะสะอาดกว่านี้ถ้าลบ return และใส่ทางเลือกไว้ใน else

คำตอบ #4

นี่คือคำย่อ

! คือ "ไม่".

-- ลดค่าของตัวเลขหนึ่งลง

ดังนั้น !-- จะตรวจสอบว่าค่าที่ได้จากการกลับค่าผลลัพธ์ของการลดค่าหนึ่งลงเป็นเท็จหรือไม่

ลองอันนี้:

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

ข้อแรกเป็นเท็จ เนื่องจากค่าของ x คือ 1 ข้อที่สองเป็นจริง เนื่องจากค่าของ x คือ 0

หมายเหตุเพิ่มเติม: !x-- จะตรวจสอบว่า x เป็นค่าเท็จหรือไม่ก่อน จากนั้นจึงลดค่าลง

คำตอบ #5

! คือโอเปอเรเตอร์ NOT ของ JavaScript

-- เป็นตัวดำเนินการลดค่าก่อน ดังนั้น,

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

คำตอบ #6

if(!--pending)

หมายถึง

if(0 == --pending)

หมายถึง

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

คำตอบ #7

มันคือตัวปฏิเสธ (not operator) ตามด้วยตัวลดค่าก่อนตำแหน่ง (in-place pre-decrementer)

ดังนั้นถ้า pending เป็นจำนวนเต็มที่มีค่าเท่ากับ 1:

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

คำตอบ #8

คำอธิบาย

นี่คือ 2 ตัวดำเนินการ คือ ! และ --

!--x 

ดังนั้น -- จะลดค่าของ x ลง 1 จากนั้น ! จะคืนค่า true หาก 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>

Fiddle (ลองโค้ด)

คำตอบ #9

มันเพียงแค่ลดค่า pending ลงหนึ่งและได้ผลลอจิกคอมพลีเมนต์ของมัน (การปฏิเสธ) คอมพลีเมนต์ทางลอจิกของตัวเลขใด ๆ ที่ไม่ใช่ 0 คือ false สำหรับ 0 คือ true

บทความที่เกี่ยวข้อง