ค่าเท็จทั้งหมดใน JavaScript


215

อะไรคือค่าใน JavaScript ที่มี 'falsey'หมายความว่าพวกเขาประเมินเป็นเท็จในการแสดงออกเช่นif(value), value ?และ!value?


มีการอภิปรายบางอย่างเกี่ยวกับจุดประสงค์ของค่าความผิดพลาดใน Stack Overflow แล้วแต่ไม่มีคำตอบที่ครบถ้วนสมบูรณ์ที่แสดงรายการว่าค่าความผิดทั้งหมดเป็นอย่างไร

ฉันไม่พบรายการที่สมบูรณ์ในการอ้างอิง JavaScript ของ MDNและฉันรู้สึกประหลาดใจที่พบว่าผลลัพธ์อันดับต้น ๆ เมื่อมองหารายการค่า falsey ที่เชื่อถือได้อย่างสมบูรณ์ใน JavaScript คือบทความในบล็อกซึ่งบางส่วนมีการละเว้นที่ชัดเจน (ตัวอย่างเช่นNaN) และไม่มีรูปแบบใดเช่น Stack Overflow ที่สามารถเพิ่มความคิดเห็นหรือคำตอบอื่นเพื่อชี้ให้เห็นถึงนิสัยใจคอความประหลาดใจการละเว้นความผิดพลาดหรือข้อ จำกัด ดังนั้นมันจึงสมเหตุสมผลที่จะสร้างขึ้นมา




5
dorey.github.io/JavaScript-Equality-Tableเป็นทรัพยากรที่ยอดเยี่ยมและมีif()แท็บสำหรับความจริง
cloudfeet

4
ว้าวมีประโยชน์จริงๆขอบคุณ! [[]] == ""แต่[] != []หัวของฉันเจ็บ ...
user56reinstatemonica8

รายละเอียดข้อมูลจำเพาะของ ECMA 262 กฎการเปรียบเทียบเหล่านี้โดยเฉพาะวินาทีที่ 11.9.1 ถึง 11.9.6: ecma-international.org/ecma-262/5.1/#sec-11.9.3 มันจะบวมถ้าคุณอัปเดตคำตอบของคุณเพื่อรวมการอ้างอิงนี้ เนื่องจากมีกฎสำหรับการกำหนดค่าที่แท้จริง / เท็จ
Shaun Wilson

คำตอบ:


367

ค่าเท็จใน JavaScript

  • false
  • ศูนย์ของNumberประเภท0และยัง-0, 0.0และรูปแบบฐานสิบหก0x0( ขอบคุณ RBT )
  • BigIntประเภทศูนย์: 0nและ-0n(ใหม่ในปี 2020 ขอขอบคุณ GetMeARemoteJob )
  • "", ''และ``- สตริงของความยาว 0
  • null
  • undefined
  • NaN
  • document.all (ในเบราว์เซอร์ HTML เท่านั้น)

"Falsey" ก็หมายความว่า JavaScript ภายในกลับมาทำงานToBoolean false ToBooleanunderlies !value, และvalue ? ... : ...; if (value)นี่คือข้อมูลจำเพาะอย่างเป็นทางการ (ร่างการทำงานในปี 2020) (การเปลี่ยนแปลงเพียงอย่างเดียวตั้งแต่ข้อกำหนด ECMAscript แรกในปี 1997คือการเพิ่มสัญลักษณ์ของ ES6ซึ่งเป็นความจริงเสมอและBigIntกล่าวถึงข้างต้น:

ไม่ได้กำหนด: คืนค่าเท็จ  Null: คืนค่าเท็จ  บูลีน: ส่งคืนอาร์กิวเมนต์  Number: ถ้าอาร์กิวเมนต์คือ +0, -0 หรือ NaN ให้ส่งคืน false  มิฉะนั้นคืนความจริง  สตริง: ถ้าอาร์กิวเมนต์เป็นสตริงว่าง (ความยาวของมันคือศูนย์) ให้คืนค่าเท็จ  มิฉะนั้นคืนความจริง  BigInt: หากอาร์กิวเมนต์เป็น 0n ให้ส่งคืน false  มิฉะนั้นคืนความจริง  สัญลักษณ์: คืนจริง  วัตถุ: คืนค่าจริง


เปรียบเทียบกับ==(ความเท่าเทียมกันแบบหลวม)

เป็นมูลค่าการพูดคุยเกี่ยวกับการเปรียบเทียบค่าหลวม ๆ==ของปลอมซึ่งใช้ToNumber()และอาจทำให้เกิดความสับสนเนื่องจากความแตกต่างพื้นฐาน พวกเขาได้อย่างมีประสิทธิภาพในสามกลุ่ม:

  • false, 0, -0, "", '' ทั้งหมดตรงกันกันด้วย ==
    • เช่นfalse == "", '' == 0และดังนั้นจึง4/2 - 2 == 'some string'.slice(11);
  • null, undefined เข้าคู่กับ ==
    • เช่น null == undefinedแต่undefined != false
    • นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่าในขณะที่typeof nullผลตอบแทน'object', nullเป็นไม่วัตถุนี้เป็นปัญหาที่ยาวนาน / มุมแหลมที่ไม่ได้รับการแก้ไขเพื่อรักษาความเข้ากันได้ มันไม่ใช่วัตถุจริงและวัตถุนั้นเป็นความจริง (ยกเว้น "การละเมิดโดยเจตนา" document.allเมื่อใช้งาน Javascript ใน HTML)
  • NaN ไม่ตรงกับสิ่งใดด้วย==หรือ===ไม่แม้แต่กับตัวเอง
    • เช่นNaN != NaN, NaN !== NaN, NaN != false,NaN != null

ด้วย "ความเท่าเทียมกันอย่างเข้มงวด" ( ===) ไม่มีการจัดกลุ่มดังกล่าว เท่านั้นfalse === falseเท่านั้น

นี้เป็นหนึ่งในเหตุผลที่ว่าทำไมนักพัฒนาจำนวนมากและคำแนะนำหลายรูปแบบ (เช่นstandardjs ) ชอบและแทบไม่เคยใช้=====


ค่าความจริงที่จริง == false

"Truthy" ก็หมายความว่า JavaScript ภายในกลับมาทำงานToBoolean จาวาสคริปต์ที่ต้องระวัง (และอีกเหตุผลที่ดีที่ชอบมากกว่า): เป็นไปได้ที่ค่าจะเป็นจริง ( ส่งคืน) แต่ก็เป็นไปได้เช่นกันtrue=====ToBooleantrue== false

คุณอาจคิดว่าif (value && value == false) alert('Huh?')เป็นไปไม่ได้ในเชิงตรรกะที่ไม่สามารถเกิดขึ้นได้ แต่จะทำเพื่อ:

  • "0"และ'0'- เป็นสตริงที่ไม่ว่างเปล่าซึ่งเป็นความจริง แต่จาวาสคริปต์==จับคู่หมายเลขกับสตริงที่เทียบเท่า (เช่น42 == "42") ตั้งแต่0 == falseถ้า "0" == 0, "0" == false.
  • new Number(0)และnew Boolean(false)- พวกเขากำลังวัตถุซึ่งเป็น truthy แต่เห็นค่าของพวกเขาซึ่ง==== false
  • 0 .toExponential(); - วัตถุที่มีค่าตัวเลขเทียบเท่า 0
  • สิ่งปลูกสร้างที่คล้ายกันใด ๆ ที่ให้คุณค่าที่เท่าเทียมกับคุณในประเภทที่เป็นความจริง
  • [], [[]]และ[0](ขอบคุณcloudfeetสำหรับการเชื่อมโยง JavaScript เท่าเทียมกันตาราง )

บางค่าความจริงเพิ่มเติม

นี่เป็นเพียงค่าเล็กน้อยที่บางคนอาจคาดหวังว่าจะเป็นเท็จ แต่จริง ๆ แล้วเป็นเรื่องจริง

  • -1 และตัวเลขลบทั้งหมดที่ไม่เป็นศูนย์
  • ' ', " ", "false", 'null'... ทุกสายไม่ว่างเปล่ารวมทั้งสตริงที่เป็นเพียงช่องว่าง
  • สิ่งใดจากtypeofซึ่งจะส่งคืนสตริงที่ไม่ว่างเสมอเช่น:

  • วัตถุใด ๆ (ยกเว้นว่า "การละเมิดโดยเจตนา" document.allในเบราว์เซอร์โปรดจำไว้ว่าnullไม่ใช่วัตถุจริงๆแม้จะtypeofแนะนำเป็นอย่างอื่น) รวมไปถึง:

    • {}
    • []
    • function(){}หรือ() => {}(ฟังก์ชั่นใด ๆ รวมถึงฟังก์ชั่นที่ว่างเปล่า)
    • Error และตัวอย่างของ Error
    • นิพจน์ทั่วไปใด ๆ
    • สิ่งที่สร้างด้วยnew(รวมถึงnew Number(0)และnew Boolean(false))
  • สัญลักษณ์ใด ๆ

true, 1, "1"และ[1]ผลตอบแทนtrueเมื่อเทียบกับคนอื่น ๆ ==ด้วย


3
FYI สิ่ง!, ifและ?..:มีเหมือนกันคือการที่พวกเขาเรียกว่าภายในToBooleanฟังก์ชั่นกับค่า วิธีที่ค่าเหล่านั้นทำงานในบริบทของ!, ifฯลฯ ถูกบอกเป็นนัยแล้วโดยชื่อของพวกเขา: พวกเขาเป็นค่า "เท็จ" ฉันบิตกลัวว่าคนอื่นจะอ่านคำตอบและคิดว่า"โอ้ดังนั้นในบริบทนี้ ( !, if, ?...:) มีค่าเป็นfalseแต่!!มันเป็นtrue"แต่ไม่เข้าใจแนวคิดพื้นฐาน อีกสองประเด็น: 1) v ? true : falseเป็นเพียงวิธีการ!!vอย่างละเอียด 2) typeof มักจะส่งกลับสตริงไม่ว่างเปล่าซึ่งเป็น truthy
เฟลิกซ์ลิ่ง

1
นั่นคือไม่มีจุดในการดูtypeof nullหรือtypeof undefinedโดยเฉพาะ คุณสามารถพูดได้ว่าสตริงที่ไม่ว่างเปล่าเป็นความจริง
เฟลิกซ์ลิ่ง

1
ฉันเห็น แต่สิ่งนี้ไม่เกี่ยวข้องกับคำถามเดิม;) การเพิ่มข้อมูลที่เกี่ยวข้องบ้าง แต่ไม่เกี่ยวข้องอาจทำให้ผู้อ่านสับสนได้
เฟลิกซ์ลิ่ง

5
ฉันเพิ่งได้เรียนรู้ว่าdocument.allเป็นเท็จเช่นกัน
Claudiu

3
เกี่ยวกับการเปรียบเทียบหลวมเพราะ Booleans จะถูกแปลงเป็นตัวเลขx == falseจะเรียกซึ่งเป็นเพียงมากแตกต่างจากToNumber(x) ToBoolean(x)อาจจะคุ้มค่าที่จะอธิบาย นอกจากนี้ฉันเพิ่งสังเกตเห็นว่าฉันได้แสดงความคิดเห็นกับคำตอบนี้ทุกเพศทุกวัยที่ผ่านมา: D
Felix Kling

3

อย่าลืมสตริง"false"ที่ไม่ว่างซึ่งประเมินค่าtrue


8
…และดังนั้นจึงไม่ใช่ค่าที่ผิดพลาดซึ่งถูกถามถึง?
Bergi

5
Touch? เป็นค่าที่คุณอาจคาดหวังว่าจะเป็นเท็จและไม่ใช่ซึ่งยังคุ้มค่าที่ควรระวังและฉันคิดว่าการทำบุญพูดถึงในรายการที่ครอบคลุม
MrMcPlad

4
เพิ่มในรายการ ... แต่อย่าพยายามเปลี่ยนเป็นรายการที่ครอบคลุมของค่าความจริงที่เป็นไปได้ทั้งหมด! นั่นอาจใช้เวลาสักครู่:-)
user56reinstatemonica8

3

เพียงแค่เพิ่มในรายการค่าเท็จของ @ user568458:

  • นอกเหนือจากเลขจำนวนเต็ม 0 แล้วเลขทศนิยม 0.0, 0.00 หรือตัวเลขใด ๆ ที่เป็นศูนย์จะเป็นค่าที่ไม่แน่นอน

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    ตัวอย่างโค้ดด้านบนจะพิมพ์ I am a falsy value

  • การแทนค่าเลขฐานสิบหกในทำนองเดียวกันของจำนวน 0 ก็เป็นค่าที่ไม่ถูกต้องตามที่แสดงในตัวอย่างโค้ดด้านล่าง:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    รหัสข้างต้นอีกครั้ง snippet I am a falsy valueพิมพ์


7
JavaScript ไม่มีตัวเลขจำนวนเต็ม 0, 0x0, 0.0และ0.00มีตัวอักษรที่แตกต่างกันเพียงแค่สำหรับเดียวกัน IEEE-754 64 บิตจุดลอยตัวค่าเป็นศูนย์
fredoverflow

1

นอกเหนือจากหัวข้อในฐานะของ ES2020 เรามีค่าใหม่ซึ่งเป็นเท็จมันเป็น BigInt ศูนย์ (0n):

0n == false // true
-0n == false // true

ดังนั้นด้วยเหตุนี้เราจึงมีค่ารวม 7 "เท็จ" (ไม่รวม document.all ตามที่ผู้ใช้ข้างต้นกล่าวถึงเนื่องจากเป็นส่วนหนึ่งของ DOM ไม่ใช่ JS)


1
ดี! ขอบคุณฉันยังไม่เคยได้ยินเกี่ยวกับเรื่องนั้นฉันได้เพิ่มลงในรายการใหญ่ด้วยลิงก์ที่ให้เครดิตคำตอบของคุณในการเพิ่ม
user56reinstatemonica8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.