จะตรวจสอบว่าตัวแปรไม่เป็นโมฆะได้อย่างไร?


285

ฉันรู้ว่าด้านล่างเป็นสองวิธีใน JavaScript เพื่อตรวจสอบว่าตัวแปรไม่ใช่nullแต่ฉันสับสนซึ่งเป็นวิธีปฏิบัติที่ดีที่สุดในการใช้

ฉันควรทำหรือไม่:

if (myVar) {...}

หรือ

if (myVar !== null) {...}

คำตอบ:


399

พวกเขาจะไม่เทียบเท่า ก่อนจะดำเนินการบล็อกตามifคำสั่งถ้าmyVarเป็นจริง (เช่นประเมินtrueในเงื่อนไข) ในขณะที่สองจะดำเนินการบล็อกถ้าmyVarเป็นค่าอื่นnullใด

เฉพาะค่าที่ไม่เป็นความจริงใน JavaScript มีดังต่อไปนี้ ( ค่าเท็จหรือที่รู้จัก)

  • null
  • undefined
  • 0
  • "" (สตริงว่าง)
  • false
  • NaN

69

นี่คือวิธีที่คุณสามารถทดสอบว่าตัวแปรไม่ใช่ NULL:

if (myVar !== null) {...}

บล็อกจะถูกดำเนินการหาก myVar ไม่ใช่โมฆะ .. มันจะถูกดำเนินการหาก myVar ไม่ได้กำหนดหรือเป็นเท็จ0หรือNaNหรืออย่างอื่น ..


1
ในกรณีที่สงสัย ... เหล่านี้ไม่ได้ตรวจสอบสตริงว่าง("")และไม่ได้กำหนด ดูซอของฉันเป็นข้อมูลอ้างอิง: jsfiddle.net/b0tm7yaf
Barrosy

47

ได้อ่านที่โพสต์นี้: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-2/

มันมีเคล็ดลับที่ดีสำหรับ JavaScript โดยทั่วไป แต่สิ่งหนึ่งที่ไม่ได้กล่าวถึงคือคุณควรตรวจสอบค่าว่างเช่น:

if(myvar) { }

นอกจากนี้ยังกล่าวถึงสิ่งที่ถือว่าเป็น 'เท็จ' ที่คุณอาจไม่รู้


33
การตรวจสอบนี้ไม่ปลอดภัยจริง ๆ หาก myvar เป็น 0 ค่าเท็จหรือค่าเท็จอื่น ๆ การทดสอบจะล้มเหลว (หากคุณต้องการตรวจสอบว่าไม่ใช่ค่า Null) ดังนั้นใช้สิ่งนี้เพื่อตรวจสอบว่าไม่เป็นโมฆะหากตัวแปรไม่สามารถมีค่าที่ผิดพลาดได้อีก
Werzi2001

2
ลิงก์ใช้งานไม่ได้อีกต่อไป ฉันพบสำเนาของสิ่งที่ดูเหมือนจะเป็นโพสต์ที่นี่: appendto.com/2010/10/… มันแปลกเพราะโพสต์ของ Elijah (และรหัสตัวอย่าง) จะแนะนำว่าเขาเป็นผู้เขียน แต่เขาไม่ได้อยู่ในรายชื่อผู้เขียนที่นั่น ...
thepaulpage

2
ดูเหมือนว่าไซต์นั้นไม่มีอยู่อีกต่อไป มันจะมีประโยชน์ถ้าคุณสามารถรวมข้อมูลในโพสต์เองมากกว่าแค่ลิงค์ภายนอก
apraetor

สิ่งนี้จะไม่ทำงานหากมีค่าอยู่ แต่เป็น 0 (ศูนย์)
zmechanic

15
  • โค้ดภายในของคุณif(myVar) { code }จะไม่ถูกดำเนินการเฉพาะเมื่อmyVarเท่ากับ: false, 0, "", null, undefined, NaNหรือคุณไม่เคยกำหนดตัวแปรไว้myVar(จากนั้นโค้ดจะหยุดการทำงานและเพิ่มข้อยกเว้น)
  • รหัสภายในของคุณif(myVar !== null) {code}จะไม่ถูกดำเนินการเฉพาะเมื่อmyVarเท่ากับnullหรือคุณไม่เคยกำหนดไว้ (มีข้อยกเว้น)

ที่นี่คุณมีทั้งหมด ( src )

ถ้า

ป้อนคำอธิบายรูปภาพที่นี่

== (การปฏิเสธของมัน! = )

ป้อนคำอธิบายรูปภาพที่นี่

=== (การปฏิเสธของมัน! == )

ป้อนคำอธิบายรูปภาพที่นี่


9

มีอีกสถานการณ์ที่เป็นไปได้ที่ฉันเพิ่งเจอ

ฉันโทร ajax และรับข้อมูลกลับเป็นโมฆะในรูปแบบสตริง ฉันต้องตรวจสอบดังนี้:

if(value != 'null'){}

ดังนั้น null เป็นสตริงที่อ่านว่า "null" แทนที่จะเป็น null จริง ๆ

แก้ไข:ควรเข้าใจว่าฉันไม่ได้ขายสิ่งนี้ตามที่ควรจะทำ ฉันมีสถานการณ์ที่เป็นวิธีเดียวที่ทำได้ ฉันไม่แน่ใจว่าทำไม ... บางทีคนที่เขียนแบ็คเอนด์กำลังนำเสนอข้อมูลไม่ถูกต้อง แต่ไม่ว่าจะเป็นชีวิตจริง มันน่าผิดหวังที่เห็นคนที่เข้าใจว่าเรื่องนี้ไม่ถูกต้องและลงคะแนนโดยคนที่ช่วยได้จริง


แทนที่จะแจงค่าของคุณมากกว่าการเปรียบเทียบกับnullสตริง
Bergi

1
คำตอบนี้ถูกต้องตามกฎหมายไม่ว่าคุณจะเข้าใจการใช้งานหรือไม่ ฉันไม่ซาบซึ้งในการลงโพสต์สิ่งที่ใช้งานได้จริง คุณสังเกตเห็นว่ามีการโหวตขึ้นก่อนที่คุณจะแตะมัน? นั่นเป็นเพราะมันเป็นสถานการณ์จริง
Flat Cat

3
ใช่และฉันลงเพราะฉันคิดว่ามันเป็นทางออกที่ผิด ในกรณีของการโทร Ajax คุณดีกว่าที่ควรจะทำอย่างไรvalue = JSON.parse(value)และจากนั้นใช้ง่ายและเหมาะสมvalue != nullทดสอบ
Bergi

2
เห็นได้ชัดว่าคุณไม่เข้าใจ ฉันรู้ว่าคุณคิดว่าคุณทำ แต่คุณทำไม่ได้
Flat Cat

4
ฉันเข้าใจว่ามันเป็นวิธีการทำงาน แต่ฉันไม่คิดว่ามันเป็นคำแนะนำที่ดีดังนั้นโปรดเคารพ downvote ของฉัน
Bergi


1

บางครั้งถ้ามันไม่ได้กำหนดไว้จะดีกว่าที่จะเตรียม สำหรับเรื่องนี้ผมใช้typeof

if(typeof(variable) !== "undefined") {
    //it exist
    if(variable !== null) {
        //and is not null
    }
    else {
        //but is null
    }
}
else {
    //it doesn't
}

-4

คำสั่งสองเงื่อนไขที่คุณระบุไว้ที่นี่ไม่ได้ดีไปกว่าข้อความอื่น การใช้งานของคุณขึ้นอยู่กับสถานการณ์ คุณพิมพ์ผิดตามตัวอย่างที่ 2 ควรมีเพียงหนึ่งเครื่องหมายเท่ากับหลังจากเครื่องหมายอัศเจรีย์

ตัวอย่างที่ 1 พิจารณาว่าค่าในmyVarเป็นจริงและเรียกใช้งานโค้ดภายใน{... }

ตัวอย่างที่ 2 ประเมินว่าmyVarไม่เท่ากับ null และถ้ากรณีนั้นเป็นจริงมันจะรันโค้ดของคุณภายใน{... }

ฉันขอแนะนำให้ดูที่งบเงื่อนไขสำหรับเทคนิคเพิ่มเติม เมื่อคุณคุ้นเคยกับพวกเขาคุณสามารถตัดสินใจได้เมื่อคุณต้องการ


12
นั่นอาจไม่ใช่การพิมพ์ผิดในตัวอย่างที่สอง ที่สอง=นั้นมีความสำคัญและสร้างความแตกต่างอย่างมากกับคำถาม บางทีคุณอาจไม่ทราบว่ามีตัวดำเนินการ!==และ===ตัวดำเนินการใน JavaScript หรือไม่
Tim Down

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