ฉันจะทราบได้อย่างไรว่าตัวแปร 'ไม่ได้กำหนด' หรือ 'null'?


2128

ฉันจะตรวจสอบได้อย่างไรว่าตัวแปรundefinedหรือnull?

รหัสของฉันเป็นดังนี้:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

แต่ถ้าฉันทำเช่นนี้ล่าม JavaScript หยุดการทำงาน


คำตอบ:


2848

คุณสามารถใช้คุณสมบัติของตัวดำเนินการความเสมอภาคเชิงนามธรรมเพื่อทำสิ่งนี้:

if (variable == null){
    // your code here.
}

เพราะnull == undefinedเป็นความจริงโค้ดข้างต้นจะจับทั้งสองและnullundefined


5
ฉันพยายามที่จะทดสอบว่าเหตุการณ์เป็นโมฆะใน Firefox และข้อผิดพลาดบล็อกการดำเนินการ: "เหตุการณ์ไม่ได้กำหนด"
Entretoize

3
@MichaelFever มันใช้งานไม่ได้อย่างไร คัดลอกวางในคอนโซลของคุณ: const y = undefined; y == null;มันควรจะกลับมาtrue
Seraf

2
@ChrisStryczynski ในตัวอย่างจากความคิดเห็นของคุณคุณประกาศyคงที่ แต่คุณสุขภัณฑ์เปรียบเทียบabc(ไม่y) เมื่อฉันทดสอบyผ่านทางconsole.log(y == null);Chrome และ Firefox ฉันได้รับtrueผลลัพธ์ หากคุณมีข้อผิดพลาดบางทีคุณอาจลองใช้โอเปอเรเตอร์การมอบหมาย=แทนการเปรียบเทียบ==ซึ่งจะสมเหตุสมผลในการส่งคืนข้อผิดพลาดเนื่องจากconstไม่สามารถกำหนดใหม่ได้
Pshemo

2
ตัวอย่างสดของการเปรียบเทียบที่เกี่ยวข้อง LGTM
Ryan Haining

2
@ZaytsevDmitry ทำไมคุณถึงคาดหวังการทดสอบว่าตัวแปรเป็นnullหรือundefinedผ่านถ้าตัวแปรเท่ากับ0หรือไม่ คำถามไม่ได้เกี่ยวกับการทดสอบสำหรับค่า truthy แต่ค่อนข้างทดสอบอย่างชัดเจนสำหรับหรือnull undefined
rodrigo-silveira

1107

วิธีมาตรฐานในการจับnullและundefinedพร้อมกันคือ:

if (variable == null) {
     // do something 
}

- ซึ่งเทียบเท่ากับ 100% ที่ชัดเจนกว่า แต่กระชับน้อยกว่า:

if (variable === undefined || variable === null) {
     // do something 
}

เมื่อเขียน JS มืออาชีพก็ถ่ายเพื่อรับว่าประเภทความเสมอภาคและลักษณะการทำงานของ==VS===เป็นที่เข้าใจ ดังนั้นเราจึงใช้และเปรียบเทียบเท่านั้นที่จะ==null


แก้ไขอีกครั้ง

ความคิดเห็นที่แนะนำการใช้งานtypeofนั้นผิด ใช่ทางออกของฉันด้านบนจะทำให้ ReferenceError หากไม่มีตัวแปร นี่เป็นสิ่งที่ดี ReferenceError นี้เป็นที่ต้องการ: มันจะช่วยคุณค้นหาข้อผิดพลาดและแก้ไขก่อนที่จะส่งรหัสของคุณเช่นเดียวกับข้อผิดพลาดของคอมไพเลอร์ในภาษาอื่น ๆ ใช้try/ catchหากคุณทำงานกับอินพุตคุณไม่สามารถควบคุมได้

คุณไม่ควรอ้างอิงถึงตัวแปรที่ไม่ได้ประกาศในรหัสของคุณ


47
สิ่งนี้จะทำให้การประมวลผล ReferenceError และตัวแบ่งถ้าตัวแปรไม่ได้กำหนดหรืออ้างถึงเลยในรหัสการใช้ typeof จะปลอดภัยยิ่งขึ้น
Mani Gandham

56
นั่นเป็นจุดของโวหารมากกว่า หากตัวแปรยังไม่ได้รับการประกาศเลยนั่นเป็นเพียงการเขียนที่ไม่ดีในส่วนของผู้เขียน คุณควรรู้ว่าตัวแปรของคุณได้รับการประกาศหรือไม่นั่นไม่น่าจะเป็นคำถาม แต่ใช่ถ้าด้วยเหตุผลบางอย่างกรณีนี้ควรเปลี่ยนเป็นwindow.variableแทนที่จะเป็นแค่ตัวแปรซึ่งจะไม่ทำให้เกิดข้อผิดพลาดในการอ้างอิง ควรหลีกเลี่ยงประเภทของ
temporary_user_name

6
ใช่เพราะคุณเขียนแทน!== !=
temporary_user_name

9
-OP: คำแถลงเกี่ยวกับการเปรียบเทียบเหล่านั้น "เทียบเท่า 100%" นั้นไม่ถูกต้องตามที่คุณบันทึกไว้ในการแก้ไขของคุณเองข้อที่สองจะทำให้ ReferenceError สำหรับการยืนยัน: "คุณไม่ควรมีการอ้างอิงใด ๆ กับตัวแปรที่ไม่ได้ประกาศในรหัสของคุณ" จริงๆ? เคยได้ยินพารามิเตอร์เสริมหรือไม่ jsfiddle.net/3xnbxfsu
Timothy Kanski

16
@TimothyKanski อาจเป็นพารามิเตอร์ที่ไม่ได้กำหนดหากไม่ได้ระบุตัวเลือก แต่เป็นตัวแปรที่ประกาศอย่างแน่นอนที่สุด พวกเขาจะประกาศและมีค่าundefinedเป็นตัวแปรใด ๆ ที่ประกาศ แต่ไม่ได้เตรียมจะกล่าวคือvar someVar;เพื่อให้การโต้แย้งของคุณไม่ได้ถือ
chiliNUT

227

การรวมคำตอบข้างต้นเข้าด้วยกันดูเหมือนว่าคำตอบที่สมบูรณ์ที่สุดจะเป็น:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

สิ่งนี้ควรใช้ได้กับตัวแปรใด ๆ ที่ไม่ได้ประกาศหรือประกาศและตั้งค่าเป็น null หรือไม่ได้กำหนดไว้อย่างชัดเจน นิพจน์บูลีนควรประเมินค่าเป็นเท็จสำหรับตัวแปรที่ประกาศซึ่งมีค่าที่ไม่ใช่ค่าว่างจริง


2
@Aerovistae ฉันรู้ว่าtypeofเป็นตัวดำเนินการไม่ใช่ฟังก์ชั่นดังนั้นจึงไม่จำเป็นต้องใช้วงเล็บ แต่ฉันขอขอบคุณวงเล็บที่ยังคง - เพียงแค่อ่านความชัดเจน
user664833

1
สิ่งที่เกี่ยวกับการตรวจสอบโดยตรงถ้า (ตัวแปร === ไม่ได้กำหนด) แทนที่จะใช้ typeof?
Frozen Crayon

2
@ArjunU ที่จะทำให้ ReferenceError หากไม่มีการประกาศตัวแปร หากคุณไม่ทราบว่าประกาศตัวแปรหรือไม่ให้ใช้วิธีแก้ไขปัญหาข้างต้น หากคุณสามารถรับประกันได้ว่ามีการประกาศตัวแปรอย่างน้อยคุณสามารถใช้variable == null
Rogue

3
นี่เป็นวิธีแก้ปัญหาที่ดีกว่าเนื่องจาก @Rogue ชี้ว่าตัวแปรอาจไม่ถูกประกาศ
Abdul Sadik Yalcin

ถูกต้องฉันถ้าฉันผิด แต่ไม่ใช่ superset แรกของเงื่อนไขที่สองไม่ใช่และดังนั้นเงื่อนไขที่สองจึงไม่จำเป็น?
March Ho

186
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
ในกรณีที่ใครคิดว่านี่เป็นอีกครึ่งคำตอบนี่ใช้งานได้จริง ประเมินเท่ากับundefined null
Chuck

3
ฉันไม่สามารถใช้คอนโซล Chrome ได้ ... ReferenceError: ตัวแปรไม่ได้ถูกกำหนดดังนั้นจึงอาจใช้งานได้ แต่ไม่ใช่สำหรับฉัน ...
Eran Medan

48
มันใช้งานได้เฉพาะกับตัวแปรที่ประกาศไม่ใช่ตัวแปรที่อาจหรืออาจไม่สามารถประกาศได้ซึ่งไม่ค่อยเกิดขึ้น (คุณต้องใช้ typeof + การตรวจสอบ null สำหรับกรณีนั้น)

11
เพียงแค่คิดออกคุณสามารถเพิ่มความคิดเห็นนี้: /*jshint eqnull:true */ที่ด้านบนของเอกสารหรือฟังก์ชั่น JS ของคุณและ JSHint จะหยุดเตือนคุณเกี่ยวกับการใช้งานของ== nullคุณ
Web_Designer

3
@ Aerovistae คุณสามารถชี้ให้ฉันอ้างอิงที่ระบุอย่างชัดเจนว่า==แตก การบีบบังคับif(variable == null)ในคำตอบนี้ทำให้ฉันเข้าใจได้อย่างถ่องแท้ ...
เบ็นแอสตัน

93
if (typeof EmpName != 'undefined' && EmpName) {

จะประเมินค่าเป็นจริงหากค่าไม่ใช่:

  • โมฆะ

  • ไม่ได้กำหนด

  • น่าน

  • สตริงว่าง ("")

  • 0

  • เท็จ


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

กรุณาให้การอ้างอิงของจาวาสคริปต์จาวาสคริปต์นี้
villamejia

1
if (EmpName)นี้เป็นเช่นเดียวกับ ถ้ามันundefinedจะเป็นเท็จแล้ว
รูดี้

1
หากไม่ได้กำหนดตัวแปร ดังนั้นถ้า (EmpName) จะโยนข้อผิดพลาด
Thamaraiselvam

1
@Thamaraiselvam var EmpName; if (EmpName)ผมคิดว่ารูดี้อาจมีความหมายนี้ โดยที่ตัวแปรถูกกำหนด แต่ไม่ได้กำหนดค่าไว้
Hungerstar

27

attr()ฟังก์ชันjQuery ส่งคืนสตริงว่างหรือค่าจริง (และไม่มีnullหรือundefined) ครั้งเดียวที่มันส่งคืนundefinedคือเมื่อตัวเลือกของคุณไม่ได้คืนองค์ประกอบใด ๆ

ดังนั้นคุณอาจต้องการทดสอบกับสตริงว่าง อีกทางหนึ่งเนื่องจากสตริงว่าง, null และไม่ได้กำหนดเป็น false-y, คุณสามารถทำได้:

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 m แสดงข้อผิดพลาดนี้:ReferenceError: EmpName is not defined
Eran Medan

6
@EranMedan ฉันรู้ว่ามันสาย แต่หวังว่าจะช่วยให้ผู้ที่มาที่นี่ในภายหลัง เหตุผลที่คุณได้รับข้อผิดพลาดก็เพราะมันยังไม่ได้ประกาศเลย โดยปกติแล้วคุณจะต้องให้ EmpName (หรือตัวแปรอื่น ๆ ) ถูกส่งผ่านไปยังฟังก์ชั่นหรือค่าตอบแทนของฟังก์ชั่นอื่นดังนั้นจึงประกาศ (ตัวอย่าง: "var x;") เพื่อทดสอบว่ามันส่งคืนไม่ได้กำหนดหรือเป็นโมฆะหรือสตริงว่างคุณสามารถใช้วิธีการแก้ปัญหาข้างต้น
เดฟ

ฉันรู้ว่านี่เป็นคำถามที่เย็นชา แต่ jQuery จะกลับมาundefinedหากไม่มีแอตทริบิวต์อยู่ในองค์ประกอบ (ไม่ใช่แค่ถ้าตัวเลือกไม่มีองค์ประกอบที่ตรงกันตามคำตอบ) ตัวอย่างเช่นการที่imgไม่มีsrcจะส่งกลับundefinedสำหรับ$('img').attr('src');
codinghands

19

ฉันมาเขียนฟังก์ชั่นของตัวเองสำหรับเรื่องนี้ JavaScript แปลก

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

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

typescript ที่เข้ากันได้


ฟังก์ชั่นนี้ควรจะทำอย่างไรว่าสิ่งเดียวกันเช่น PHP ของempty()ฟังก์ชั่น (ดูRETURN VALUES)

พิจารณาundefined, null, false, 0, 0.0, "0" {}, []เป็นที่ว่างเปล่า

"0.0", NaN, " ", trueได้รับการพิจารณาไม่ว่างเปล่า


2
ฉันพบปัญหาการตรวจสอบโมฆะเล็กน้อย { }ฉันต้องการที่จะตรวจสอบว่าพารามิเตอร์ถูกส่งเป็นโมฆะหรือวัตถุที่ว่างเปล่า นี่เป็นปัญหาทางภาษาที่พบได้บ่อย แต่ฉันลืมไปแล้ว การค้นหาของฉันทั้งหมดแสดงคำตอบสำหรับค่า null ที่ไม่ได้กำหนดหรือการเปรียบเทียบความเท่าเทียมกันแบบหลวม (==) แต่ไม่ใช่ความเท่าเทียมที่เข้มงวด (===) หรือเทียบเท่า และที่นี่ในคำตอบที่คุณได้รับการจัดอันดับ -1 ที่ด้านล่างสุดของหน้า (ก่อนที่ฉันจะขึ้นราคา) คือคำตอบที่ทำให้ฉันหลง Object.keys( obj ).length < 1หรืออาจ === 0 สมมติว่าไม่มีวันเป็น -1 อย่างไรก็ตามเพิ่มขึ้นเป็น 0, แสวงหา : p

ขอบคุณฉันสามารถวางฟังก์ชั่นนี้และล้างโค้ดจำนวนมากได้ ทำไมนี่ไม่ใช่ฟังก์ชั่น JS มาตรฐานเกินกว่าฉัน
Andy

3
คุณควรเปลี่ยนทั้งหมดของคุณ==เป็น===ที่นี่จากนั้นนี่จะเป็นฟังก์ชั่นที่สมเหตุสมผล
Ben McIntyre

12

หากตัวแปรที่คุณต้องการตรวจสอบเป็นโกลบอลให้ทำ

if (window.yourVarName) {
    // Your code here
}

วิธีตรวจสอบนี้จะไม่ทำให้เกิดข้อผิดพลาดแม้ว่าyourVarNameจะไม่มีตัวแปร

ตัวอย่าง: ฉันต้องการทราบว่าเบราว์เซอร์ของฉันรองรับ History API หรือไม่

if (window.history) {
    history.back();
}

มันทำงานอย่างไร:

windowเป็นวัตถุที่เก็บตัวแปรส่วนกลางทั้งหมดเป็นคุณสมบัติของมันและใน JavaScript มันถูกกฎหมายเพื่อพยายามเข้าถึงคุณสมบัติวัตถุที่ไม่มีอยู่ ถ้าhistoryไม่ได้อยู่แล้วผลตอบแทนwindow.history เป็นเท็จดังนั้นรหัสในบล็อกจะไม่ทำงานundefinedundefinedif(undefined){}


2
ผู้อ่านควรทราบว่าวิธีการเช่นนี้มีความหมายสำหรับการตรวจสอบ - จาก JavaScript ที่ทำงานในเบราว์เซอร์ - ไม่ว่าจะมีการประกาศตัวแปรทั่วโลกและโดยเฉพาะอย่างยิ่งว่ามีการให้บริการทั่วโลก มันจะไม่ทำงานสำหรับการตรวจสอบว่าตัวแปรที่ไม่ใช่โกลบอลเป็นnullหรือundefinedไม่และจะไม่ทำงานถ้า JavaScript ของคุณทำงานนอกเบราว์เซอร์ (เช่นใน Node.js) มันจะยังรักษา Globals ตั้งค่าให้0, falseหรือ''เช่นเดียวกับผู้ที่ไม่ได้ประกาศหรือundefinedหรือnullซึ่งมักจะเป็นเรื่องปกติ
Mark Amery

นี่ถือว่าสคริปต์ทำงานในเบราว์เซอร์ นั่นไม่ใช่สิ่งที่กำหนด
GreenAsJade

12

สั้นที่สุดและง่ายที่สุด:

if(!EmpName ){
 // DO SOMETHING
}

สิ่งนี้จะประเมินค่าจริงถ้า EmpName คือ:

  • โมฆะ
  • ไม่ได้กำหนด
  • น่าน
  • ว่างเปล่า
  • สตริง ("")
  • 0
  • เท็จ

3
กรณีการใช้ที่นี่คือฉันต้องการทราบความแตกต่างระหว่างไม่ได้กำหนดและเท็จ ฉันจะใช้การตรวจสอบกับโมฆะแล้ว
gast128

11

อาจเป็นวิธีที่สั้นที่สุดในการทำเช่นนี้คือ:

if(EmpName == null) { /* DO SOMETHING */ };

นี่คือหลักฐาน:

และนี่คือรายละเอียดเพิ่มเติมเกี่ยวกับ==(ที่นี่แหล่งที่มา)

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

โบนัส : เหตุผลที่===ชัดเจนกว่า==(ดูที่คำตอบ agc )

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


8

ฉันเพิ่งพบปัญหานี้เช่นตรวจสอบว่าวัตถุนั้นเป็นโมฆะหรือไม่
ฉันแค่ใช้สิ่งนี้:

if (object) {
    // Your code
}

ตัวอย่างเช่น:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
มันจะเป็นการดีกว่าถ้าตั้งค่า var A = document.getElementById ("enterJob") ถ้า (A) A.className + = 'current'; ด้วยวิธีนี้คุณจะได้ผล 50% สำหรับผลลัพธ์เดียวกัน ... แต่บางทีคุณอาจทำเพื่อการแสดงแล้วฉันก็ทักทาย
Harry Svensson

7

เนื่องจากคุณใช้jQueryคุณสามารถตรวจสอบว่าตัวแปรไม่ได้กำหนดหรือค่าเป็นโมฆะโดยใช้ฟังก์ชันเดียว

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันยังคงได้รับข้อผิดพลาด: ReferenceError: s is not definedสำหรับตัวอย่างแรก
Mark

5

องค์ประกอบการตรวจสอบ jQuery ไม่เป็นโมฆะ:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

4

ใน JavaScript ตามความรู้ของฉันเราสามารถตรวจสอบตัวแปรที่ไม่ได้กำหนดเป็นโมฆะหรือเปล่าดังต่อไปนี้

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

ตรวจสอบเงื่อนไขทั้งหมด:

if(variable === undefined || variable === null || variable === ''){
}

varเป็นคำสงวนนี้จะโยนSyntaxError
dhilt

4

คุณสามารถใช้สิ่งต่อไปนี้ได้ (ฉันรู้ว่ามีวิธีที่สั้นกว่าในการทำสิ่งนี้ แต่อาจทำให้ง่ายต่อการสังเกตด้วยสายตา

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

3

วิธีที่ง่ายที่สุดในการตรวจสอบคือ:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
สิ่งนี้จะรันโค้ดหากตัวแปรมีค่าfalseซึ่งอาจไม่เป็นที่ต้องการ
byxor

คำถามนั้นชัดเจน "จะทราบได้อย่างไรว่าตัวแปร 'ไม่ได้กำหนด' หรือ 'null'?" และในจาวาสคริปต์หากตัวแปรมีค่าเป็นโมฆะหรือไม่ได้กำหนดค่าของมันจะเป็นเท็จ
เอ็มอาร์โนลด์

1
ขออภัย แต่นั่นไม่ถูกต้อง นี่คือJSfiddleเพื่อพิสูจน์มัน
byxor

โดยคำตอบของคุณundefined, null และสิ่งอื่น ๆ น้อยเช่นสตริงว่าง 0, -0 NaNและfalseได้รับผ่าน !โอเปอเรเตอร์จะบังคับโอเปอเรเตอร์variable- ที่นี่- ถึงบูลีน: ecma-international.org/ecma-262/#sec-toboolean
Alireza

แต่ตรวจสอบคำถาม: "วิธีการตรวจสอบว่าตัวแปรไม่ได้กำหนดหรือโมฆะ",! ตัวถูกดำเนินการที่ใช้กับถ้าจะกลับสู่ความจริงถ้าตัวแปรเป็นโมฆะหรือไม่ได้กำหนด
เอ็มอาร์โนลด์

2

ด้วยวิธีการแก้ปัญหาด้านล่าง:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

ฉันสามารถตรวจสอบสิ่งต่อไปนี้:

  • โมฆะ
  • ไม่ได้กำหนด
  • น่าน
  • ว่างเปล่า
  • สตริง ("")
  • 0
  • เท็จ

สิ่งนี้ไม่ตอบคำถามซึ่งเป็น "ฉันจะจับโมฆะและไม่ได้กำหนดได้อย่างไร" ไม่ใช่ "ฉันจะจับค่าเท็จทั้งหมดใน JavaScript ได้อย่างไร"
temporary_user_name

@ Aerovistae ฉันคิดว่าฉันทำกับ console.log (isDeepEqual (null, null)); และ console.log (isDeepEqual (ไม่ได้กำหนดไม่ได้กำหนด)); ?
Tony Tai Nguyen

1

เพื่อทดสอบว่าตัวแปรเป็นโมฆะหรือไม่ได้กำหนดฉันใช้โค้ดด้านล่าง

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

ปิด แต่ไม่ ลดtypeofและเปรียบเทียบกับแบบundefinedตรงไม่ใช่เป็นสตริง มันใช้งานได้ แต่ตัวดำเนินการเสริมไม่มีผลใด ๆ
temporary_user_name

ในกรณีนี้ใช่คุณพูดถูกเราไม่จำเป็นต้องใช้ประเภทของ แต่เป็นวิธีปฏิบัติที่ดีในการใช้ typeof เมื่อคุณจัดการกับตัวแปรที่ไม่ได้กำหนด เหตุผลหนึ่งที่ใช้ typeof คือมันไม่ได้เกิดข้อผิดพลาดหากยังไม่ได้ประกาศตัวแปร
DanKodi

นั่นเป็นเรื่องเลวร้ายจริงๆ คุณไม่ต้องการตัวแปรที่ไม่ได้ประกาศในรหัสของคุณ คุณต้องการที่จะโยน ReferenceError เพื่อให้คุณสามารถค้นหาตัวแปรและประกาศ แน่นอนคุณจะไม่ลองในภาษาที่คอมไพล์อย่าง C ++! เพียงเพราะ JS อนุญาตไม่ได้หมายความว่าควรจะทำ
temporary_user_name

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

1

ฉันรันการทดสอบนี้ในคอนโซล Chrome การใช้ (void 0) คุณสามารถตรวจสอบ undefined:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

1

ลองดูที่นี่

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    ในข้างต้นตัวแปรจะถูกประกาศเป็นappleเท่านั้น ในกรณีนี้ถ้าเราเรียกวิธีการalertมันจะแสดงไม่ได้กำหนด

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

ในอันที่สองจะแสดงเป็นโมฆะเนื่องจากตัวแปรของappleค่าเป็นโมฆะ

ดังนั้นคุณสามารถตรวจสอบว่าค่าไม่ได้กำหนดหรือเป็นโมฆะ

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

0

วิธีที่ดีที่สุด:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

6
โซลูชันที่ถูกต้องนี้ได้รับการจัดหาให้โดย @jkindwall เมื่อวันที่ 11 ต.ค. 2556 stackoverflow.com/a/19323555/2943403การโพสต์โค้ดเท่านั้นไม่มีประโยชน์อย่างสมบูรณ์เพราะไม่มีการเพิ่มค่าใหม่ให้กับหน้า ในความเป็นจริงมันคือการเพิ่มหน้าขยายตัวและเสียเวลานักวิจัยอ่านมัน โปรดลบคำตอบนี้
mickmackusa


0
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
จะเกิดอะไรขึ้นหากผู้ใช้ป้อนคำว่า 'ไม่ได้กำหนด'?
Chuck

คำถามของคุณดีแสดงว่าเงื่อนไขเป็นจริงดังนั้นเราจึงจำเป็นต้องเปลี่ยนตัวเลือกปกติที่ไม่ได้กำหนดไว้ในสภาพของประเภท @Chuck
KARTHIKEYAN.A

นี่เป็นสิ่งที่ผิด typeofจะไม่ยอมแพ้undefinedเฉพาะสตริง'undefined'เท่านั้น นอกจากนี้i == nullมีอยู่แล้วจริงถ้าiเป็นundefinedดังนั้นบูลสองจะซ้ำซ้อนแม้ว่าจะทำงาน
temporary_user_name

1
โซลูชันนี้ (ที่มีการย้อนกลับเงื่อนไข) ได้รับการจัดหาให้โดย @jkindwall เมื่อวันที่ 11 ต.ค. 2556 stackoverflow.com/a/19323555/2943403 การโพสต์โค้ดเท่านั้นนี้ไม่มีประโยชน์อย่างสมบูรณ์เพราะไม่มีการเพิ่มค่าใหม่ให้กับหน้า ในความเป็นจริงมันคือการเพิ่มหน้าขยายตัวและเสียเวลานักวิจัยอ่านมัน โปรดลบคำตอบนี้
mickmackusa

0

การfoo == nullตรวจสอบควรทำเคล็ดลับและแก้ไขกรณี "undefined หรือ null" ในลักษณะที่สั้นที่สุด (ไม่ได้พิจารณากรณี "foo ไม่ได้ถูกประกาศ") แต่คนที่เคยมี 3 เท่ากับ (เป็นการปฏิบัติที่ดีที่สุด) อาจไม่ยอมรับ เพียงแค่ดูeqeqeqหรือกฎสามเท่าใน eslint และ tslint ...

แนวทางที่ชัดเจนเมื่อเรากำลังตรวจสอบว่าตัวแปรเป็นundefinedหรือnullแยกกันควรนำมาใช้ในกรณีนี้และการมีส่วนร่วมของฉันในหัวข้อ (27 คำตอบที่ไม่เป็นลบตอนนี้!) คือการใช้void 0เป็นวิธีที่สั้นและปลอดภัยในการตรวจสอบ undefinedสำหรับ

การใช้foo === undefinedไม่ปลอดภัยเนื่องจากไม่ได้กำหนดไม่ใช่คำที่สงวนไว้และสามารถเป็นเงา ( MDN ) การใช้การtypeof === 'undefined'ตรวจสอบนั้นปลอดภัย แต่ถ้าเราไม่สนใจกรณีที่ foo-is-undeclared วิธีการต่อไปนี้สามารถใช้ได้:

if (foo === void 0 || foo === null) { ... }

0

หากคุณสร้างฟังก์ชั่นเพื่อตรวจสอบ:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

การเรียก typeof null ส่งคืนค่า“ object” เนื่องจากค่าพิเศษ null ถือเป็นข้อมูลอ้างอิงวัตถุว่างเปล่า Safari ผ่านเวอร์ชัน 5 และ Chrome ผ่านเวอร์ชัน 7 มีมุมแหลมที่การเรียก typeof บนนิพจน์ทั่วไปส่งคืน“ ฟังก์ชัน” ในขณะที่เบราว์เซอร์อื่น ๆ ส่งคืน“ วัตถุ”


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

คุณสามารถใช้ได้เพียงครั้งที่สองเท่านั้นเนื่องจากจะตรวจสอบทั้งคำจำกัดความและการประกาศ


-1

ฉันยังคิดว่าวิธีที่ดีที่สุด / ปลอดภัยในการทดสอบสองเงื่อนไขนี้คือการคำนวณค่าให้กับสตริง:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

คุณสามารถอธิบายได้ไหมว่าทำไมคุณถึงเชื่อว่านี่เป็น "วิธีที่ดีที่สุด / ปลอดภัย" ในการทำแบบทดสอบ?
sadmicrowave

เนื่องจากการแปลงจะส่งคืนสตริง "ที่ได้มาตรฐาน" (เช่น [object undefined]) ดังนั้นคุณจึงไม่ประสบปัญหาด้วยการทดสอบค่าที่ผิดพลาด นั่นเป็นเพียงความคิดเห็นของฉันตามประสบการณ์ที่ฉันมีกับค่าความจริง / เท็จ
n1kkou

ขอบคุณสำหรับคำอธิบาย ฉันไม่ได้วิจารณ์มันเป็นคำตอบที่น่าสนใจฉันแค่อยากให้คุณให้คำอธิบายแก่ผู้อื่นว่าทำไมมันถึงดีกว่าวิธีอื่น ๆ
sadmicrowave

ไม่ต้องห่วง! ฉันมีปัญหามากมายเกี่ยวกับการเปรียบเทียบประเภทนี้และจนถึงตอนนี้ฉันพบว่ามันเป็นวิธีการที่มีประโยชน์ที่สุดสำหรับเรื่องนี้
n1kkou

-2

คุณสามารถตรวจสอบว่าค่าไม่ได้กำหนดหรือเป็นโมฆะโดยใช้ typeof:

if(typeof value == 'undefined'){

ดูความคิดเห็นในคำตอบก่อนหน้า ( stackoverflow.com/a/21273362/6305294 ) เกี่ยวกับประเภทของ
อเล็กซ์

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

-4

if(x==null)เป็นความคิดที่ไม่ดีใน JavaScript ตัดสินด้วย"=="- อาจทำให้เกิดการข่มขู่ประเภทที่ไม่คาดคิดและ CoffeeScript ไม่สามารถอ่านได้ อย่าใช้ "==" หรือ "! =" ในการตัดสินเงื่อนไข!

if(x)จะดีขึ้น แต่ต้องระวังด้วย0 และ "" มันจะถือว่าเป็นเท็จไม่เท่าเทียมกันกับวิธีการ"!= null"ที่เป็นจริง

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

ดูJavaScript ปฏิบัติที่ดีที่สุด


3
สิ่งนี้ไม่ถูกต้องอย่างสมบูรณ์และการศึกษาคร่าวๆของกรอบงานหรือซอฟต์แวร์ระดับมืออาชีพใด ๆ ที่จะยืนยันว่าภายในเวลาไม่นาน ใช้==เปรียบเทียบกับnullเป็นวิธีมาตรฐานในการจับและใน JS การข่มขู่ด้วยประเภทนั้นไม่ได้มีความเสี่ยงในบริบทที่เฉพาะเจาะจงและในความเป็นจริงการเอาเปรียบเพื่อให้บรรลุเป้าหมายของการจับทั้งสองและพร้อมกัน โปรดใช้เวลามากขึ้นในการทำงานกับภาษาก่อนที่จะเลือกที่จะเสนอคำตอบที่ไม่ถูกต้องและทำให้เข้าใจผิดสำหรับคำถามที่ได้รับการแก้ไขอย่างน่าพอใจเมื่อหลายปีก่อน nullundefined==nullundefined
temporary_user_name

หลีกเลี่ยง "==" ทุกอย่างเปลี่ยนแปลงอยู่เสมอฉันไม่เห็นด้วยกับคุณ @Aerovistae
Albert.Qing

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