ทดสอบว่าสิ่งที่ไม่ได้กำหนดใน JavaScript


224

ฉันกำลังตรวจสอบif(response[0].title !== undefined)แต่ฉันได้รับข้อผิดพลาด:

Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'ชื่อ' ของไม่ได้กำหนด


ดูคำตอบได้ที่นี่ใน stackoverflow stackoverflow.com/questions/858181/…
หลุยส์บาเลนเซีย

ซ้ำกันเป็นไปได้ของJavascript: undefined! == undefined?
Diodeus - James MacFarlane

คำตอบ:


345

response[0] ไม่ได้ถูกกำหนดตรวจสอบว่ามีการกำหนดและตรวจสอบชื่อคุณสมบัติแล้ว

if(typeof response[0] !== 'undefined' && typeof response[0].title !== 'undefined'){
    //Do something
}

20
แม้จะมีจำนวนการลงคะแนน แต่นี่ไม่ใช่วิธีที่ดีในการตรวจสอบเพราะundefinedไม่ใช่คำหลัก JavaScript (แม้ว่าทุกคนจะคิดว่าเป็น) หากคุณต้องการคุณสามารถสร้างตัวแปรที่เรียกว่าundefinedแล้วการตรวจสอบนี้จะไม่ถูกต้อง (typeof myVar !== 'undefined')วิธีเดียวที่ถูกต้องคือการตรวจสอบ
BadHorsie

4
@BadHorsie เหมาะสมฉันได้ปรับปรุงคำตอบด้วยความคิดเห็นของคุณ
amosrivera

1
เกิดอะไรขึ้นถ้าตัวแปรมีอยู่และมีสตริงที่อ่าน 'ไม่ได้กำหนด'?
TomeeNS

@BadHorsie อาร์กิวเมนต์ของคุณคือปลอม ทำไมฉันจึงควร redefine undefined?
Robert Siemer

@amosrivera ไม่ความเห็นของเขา / เธอไม่สมเหตุสมผล คุณแย่ลงคำตอบของคุณ
Robert Siemer

39

เพียงตรวจสอบresponse[0]ว่าไม่ได้กำหนด:

if(response[0] !== undefined) { ... }

หากคุณยังคงต้องตรวจสอบชื่ออย่างชัดเจนให้ทำหลังจากการตรวจสอบครั้งแรก:

if(response[0] !== undefined && response[0].title !== undefined){ ... }

35

ฉันมีปัญหากับตัวอย่างโค้ดอื่น ๆ ด้านบนทั้งหมด ใน Chrome นี่เป็นเงื่อนไขที่เหมาะกับฉัน:

typeof possiblyUndefinedVariable !== "undefined"

ฉันจะต้องทดสอบว่าในเบราว์เซอร์อื่นและดูว่าสิ่งที่ฉันไป


2
เหมือนกัน - ฉันพบว่าundefinedต้องเป็นสตริง
remarsh

นี่ต้องเป็นสิ่งใหม่ที่มีโครเมียม (ฉันอยู่ที่ win chrome 41 atm) คำตอบที่ยอมรับใช้ในการทำงานได้ดี! : P
joe

13

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

try{
    if(typeof response[0].title !== 'undefined') {
        doSomething();
    }
  }catch(e){
    console.log('responde[0].title is undefined'); 
  }

ฉันกำลังดู IE 8 และต้องลองจับ
RonanOD

1
นี่เป็นวิธีที่ดีที่สุดถ้าคุณทดสอบว่าฟังก์ชั่นนั้นไม่ได้ถูกกำหนด
edepperson

การโยนข้อผิดพลาดเพื่อตรวจสอบไม่ได้กำหนดไม่ใช่ทางออกที่ดี @amosrivera เป็นทางออกที่ดีที่สุด
user3658423

@ user3658423: ไม่ได้เกิดข้อผิดพลาด มันป้องกันสคริปต์จากการหยุดถ้าการตอบสนองไม่ได้ประกาศ (เพราะจะทำให้เกิดข้อผิดพลาด)
André Luiz

ข้อผิดพลาดบางครั้งอาจมีประโยชน์ ด้วยโซลูชันที่เสนอของคุณถ้า doSomething () ส่งข้อยกเว้นสิ่งที่คุณเห็นในคอนโซลคือ "responde [0] .title ไม่ได้กำหนด" แทนที่จะเป็นข้อความที่มีประโยชน์เกี่ยวกับ "un-catch exception @ line 123 ของไฟล์ xyz .js" ในที่สุดนักพัฒนารายที่สองอาจจะแสดงความคิดเห็นในคำสั่ง console.log () ทำให้ผู้พัฒนารายที่สามเข้ามาได้ยากขึ้นและแก้ไขข้อบกพร่องที่เกิดขึ้นใน doSomething ()
Eric Seastrand




0

ตรวจสอบว่าคุณresponse[0]มีอยู่จริงหรือไม่ดูเหมือนข้อผิดพลาดจะไม่แนะนำ


0

คุณต้องตรวจสอบก่อนresponse[0]ว่าไม่ได้กำหนดไว้และหากยังไม่ได้ตรวจสอบส่วนที่เหลือ นั่นหมายความว่าในกรณีของคุณresponse[0]ไม่ได้กำหนด


0

ฉันรู้ว่าฉันไปที่นี่ 7 เดือน แต่ฉันพบคำถามนี้และมันดูน่าสนใจ ฉันลองสิ่งนี้บนคอนโซลเบราว์เซอร์ของฉัน

try{x,true}catch(e){false}

หากตัวแปร x ไม่ได้ถูกกำหนดข้อผิดพลาดจะถูกจับและมันจะเป็นเท็จถ้าไม่มันจะกลับมาจริง ดังนั้นคุณสามารถใช้ฟังก์ชัน eval เพื่อตั้งค่าให้กับตัวแปร

var isxdefined = eval('try{x,true}catch(e){false}')

1
วิธีการที่น่าสนใจถ้าฉันจะพูดด้วยตัวเอง
Brandito

0

typeofในบางส่วนของคำตอบเหล่านี้มีความเข้าใจผิดพื้นฐานเกี่ยวกับวิธีการใช้

ไม่ถูกต้อง

if (typeof myVar === undefined) {

แก้ไข

if (typeof myVar === 'undefined') {

เหตุผลก็คือtypeofส่งคืนสตริง ดังนั้นคุณควรจะตรวจสอบว่ามันกลับสตริง "ไม่ได้กำหนด" มากกว่าundefined(ไม่ได้อยู่ในเครื่องหมายอัญประกาศ) ซึ่งเป็นหนึ่งในตัวเองJavaScript ของชนิดดั้งเดิม ผู้ประกอบการจะไม่กลับมาเป็นค่าของชนิดtypeofundefined


ภาคผนวก

ในทางเทคนิครหัสของคุณอาจใช้งานได้หากคุณใช้การเปรียบเทียบที่ไม่ถูกต้อง แต่อาจไม่ใช่เพราะเหตุผลที่คุณคิด ไม่มีundefinedตัวแปรที่มีอยู่แล้วใน JavaScript - มันไม่ใช่คำหลักวิเศษที่คุณสามารถเปรียบเทียบสิ่งต่าง ๆ ได้ คุณสามารถสร้างตัวแปรที่เรียกว่าundefinedและให้คุณค่าที่คุณต้องการ

let undefined = 42;

และนี่คือตัวอย่างของวิธีที่คุณสามารถใช้สิ่งนี้เพื่อพิสูจน์ว่าวิธีแรกไม่ถูกต้อง:

https://jsfiddle.net/p6zha5dm/

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