ฉันต้องการตรวจสอบว่าตัวแปรถูกกำหนดหรือไม่ ตัวอย่างเช่นต่อไปนี้จะโยนข้อผิดพลาดที่ไม่ได้กำหนดไว้
alert( x );
ฉันจะจับข้อผิดพลาดนี้ได้อย่างไร
ฉันต้องการตรวจสอบว่าตัวแปรถูกกำหนดหรือไม่ ตัวอย่างเช่นต่อไปนี้จะโยนข้อผิดพลาดที่ไม่ได้กำหนดไว้
alert( x );
ฉันจะจับข้อผิดพลาดนี้ได้อย่างไร
คำตอบ:
ใน JavaScript null
เป็นวัตถุ มีค่าอีกอย่างสำหรับสิ่งที่ไม่มีอยู่, undefined
. DOM ส่งคืนnull
เกือบทุกกรณีที่ล้มเหลวในการค้นหาโครงสร้างบางอย่างในเอกสาร แต่ใน JavaScript เองundefined
คือค่าที่ใช้
ประการที่สองไม่ไม่เทียบเท่าโดยตรง หากคุณต้องการตรวจสอบเป็นพิเศษให้null
ทำ:
if (yourvar === null) // Does not execute if yourvar is `undefined`
หากคุณต้องการตรวจสอบว่ามีตัวแปรอยู่หรือไม่นั้นสามารถทำได้ด้วยtry
/ catch
เนื่องจากtypeof
จะจัดการกับตัวแปรที่ไม่ได้ประกาศและตัวแปรที่ประกาศด้วยค่าundefined
เท่ากับ
แต่เพื่อตรวจสอบว่ามีการประกาศตัวแปรหรือไม่และundefined
:
if (yourvar !== undefined) // Any scope
ก่อนหน้านี้มีความจำเป็นต้องใช้typeof
โอเปอเรเตอร์เพื่อตรวจสอบการไม่ได้กำหนดอย่างปลอดภัยเพราะมันเป็นไปได้ที่จะกำหนดใหม่undefined
เหมือนตัวแปร วิธีเก่า ๆ มีลักษณะเช่นนี้:
if (typeof yourvar !== 'undefined') // Any scope
ปัญหาของundefined
การกำหนดใหม่ได้รับการแก้ไขใน ECMAScript 5 ซึ่งเปิดตัวในปี 2009 ตอนนี้คุณสามารถใช้งานได้อย่างปลอดภัย===
และ!==
ทดสอบundefined
โดยไม่ต้องใช้typeof
เนื่องจากundefined
ได้อ่านอย่างเดียวมาระยะหนึ่งแล้ว
หากคุณต้องการทราบว่าสมาชิกมีอิสระ แต่ไม่สนใจว่าคุณค่าคืออะไร:
if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance
หากคุณต้องการทราบว่าตัวแปรเป็นจริงหรือไม่ :
if (yourvar)
typeof
โอเปอเรเตอร์ ( typeof null == 'object'
) null
ค่าเป็นค่าดั้งเดิมซึ่งเป็นค่าเดียวของชนิด Null
วิธีเดียวที่จะทดสอบว่าตัวแปรคือundefined
ทำสิ่งต่อไปนี้อย่างแท้จริงหรือไม่ โปรดจำไว้ว่าไม่ได้กำหนดเป็นวัตถุใน JavaScript
if (typeof someVar === 'undefined') {
// Your variable is undefined
}
โซลูชันอื่น ๆ บางรายการในชุดข้อความนี้จะทำให้คุณเชื่อว่าตัวแปรไม่ได้ถูกกำหนดแม้ว่าจะได้รับการกำหนด (ด้วยค่า NULL หรือ 0 เป็นต้น)
ReferenceError
การทดสอบเท่านั้นซึ่งไม่สามารถผลิต
undefined
เป็นวัตถุในจาวาสคริปต์คือข้อมูลที่ผิด คำสั่งนี้เกี่ยวข้องกับคำตอบของคุณหรือไม่? มันเป็นค่าundefined
ประเภทได้รับมอบหมายให้ระบุชื่อระดับโลกundefined
undefined
undefined
ได้รับการอ่านอย่างเดียวตั้งแต่ ES5 คุณสามารถทดสอบการใช้งานไม่ได้กำหนดหรือใช้จดชวเลขเช่นนี้if (x === undefined) {...}
if (x === void 0)
ในทางเทคนิคแล้วการแก้ปัญหาที่เหมาะสมคือ (ฉันเชื่อ):
typeof x === "undefined"
บางครั้งคุณอาจขี้เกียจและใช้งานได้
x == null
แต่นั่นจะอนุญาตให้ทั้งตัวแปรที่ไม่ได้นิยาม x และตัวแปร x ที่มีค่า null จะส่งกลับค่าจริง
var x;
แล้วtypeof x;
คุณจะได้รับ"undefined"
เหมือนว่าคุณทำtypeof lakjdflkdsjflsj;
เวอร์ชั่นย่อที่ง่ายยิ่งขึ้นและมากขึ้นคือ:
if (!x) {
//Undefined
}
หรือ
if (typeof x !== "undefined") {
//Do something since x is defined.
}
ฉันมักจะทำ:
function doSomething(variable)
{
var undef;
if(variable === undef)
{
alert('Hey moron, define this bad boy.');
}
}
คุณยังสามารถใช้ตัวดำเนินการเงื่อนไขประกอบไปด้วย:
var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);
//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);
var a = false;
? คุณควรตรวจสอบว่าถ้าa===undefined
แทน
var x;
การดำเนินการด้านบนจะทำให้เกิดข้อผิดพลาด
!a
ทดสอบความเป็นจริงundefined
ก็ยังทดสอบจริงสำหรับ0
และและnull
false
สิ่งนี้ไม่ถูกต้องมากและควรลบออก
ฉันมักจะใช้วิธีที่ง่ายที่สุด:
var variable;
if (variable === undefined){
console.log('Variable is undefined');
} else {
console.log('Variable is defined');
}
แก้ไข:
หากไม่มีการเริ่มต้นตัวแปรข้อยกเว้นจะถูกโยน "Uncaught ReferenceError: ตัวแปรไม่ได้ถูกกำหนด ... "
Uncaught ReferenceError: variable is not defined
variable
var variable;
และตัวอย่างนี้จะแทนที่variable
ในขอบเขตท้องถิ่น มันสามารถทำลายตรรกะที่คาดว่าจะเข้าถึงการปิดหรือตัวแปรทั่วโลก เช่น:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
"ทางออก" ที่เป็นไปได้อีกอย่างหนึ่งคือการใช้window
วัตถุ มันหลีกเลี่ยงปัญหาข้อผิดพลาดของการอ้างอิงเมื่ออยู่ในเบราว์เซอร์
if (window.x) {
alert('x exists and is truthy');
} else {
alert('x does not exist, or exists and is falsy');
}
undefined
อย่างไร สิ่งนี้จะไม่ทำเช่นนั้น
ข้อผิดพลาดกำลังบอกคุณว่าx
ไม่มีอยู่จริง! ยังไม่ได้ประกาศซึ่งแตกต่างจากการกำหนดค่า
var x; // declaration
x = 2; // assignment
หากคุณประกาศx
คุณจะไม่ได้รับข้อผิดพลาด คุณจะได้รับการแจ้งเตือนที่ระบุว่าundefined
เนื่องจากx
มีอยู่ / ได้รับการประกาศแล้วแต่ยังไม่ได้รับการกำหนดค่า
ในการตรวจสอบว่ามีการประกาศตัวแปรหรือไม่คุณสามารถใช้typeof
วิธีอื่นในการตรวจสอบว่ามีตัวแปรอยู่หรือไม่ที่จะทำให้เกิดข้อผิดพลาดเดียวกับที่คุณได้รับในตอนแรก
if(typeof x !== "undefined") {
alert(x);
}
x
นี้คือการตรวจสอบชนิดของค่าที่เก็บไว้ใน มันจะกลับมาundefined
เมื่อx
ยังไม่ได้รับการประกาศหรือถ้ามันได้รับการประกาศและยังไม่ได้รับมอบหมาย
typeof
ผู้ประกอบการอีกต่อไป
void
ผลตอบแทนที่ผู้ประกอบการundefined
สำหรับการโต้แย้งใด ๆ / การแสดงออกผ่านไป เพื่อให้คุณสามารถทดสอบกับผลลัพธ์ (อันที่จริงตัวแปลงบางตัวเปลี่ยนรหัสของคุณจากundefined
เป็นvoid 0
เพื่อบันทึกอักขระสองสามตัว)
ตัวอย่างเช่น:
void 0
// undefined
if (variable === void 0) {
// variable is undefined
}
typeof
และคิดว่าundefined
สามารถกำหนดใหม่ซึ่งไม่สามารถทำได้ประมาณหนึ่งทศวรรษ
undefined
เพราะพระเจ้าเท่านั้นที่รู้เหตุผลว่าการใช้void 0
จะกลับมาundefined
โดยไม่คำนึงถึง
เราสามารถตรวจสอบได้undefined
ดังนี้
var x;
if (x === undefined) {
alert("x is undefined");
} else {
alert("x is defined");
}
ทำสิ่งที่ต้องการด้านล่าง:
function isNotDefined(value) {
return typeof value === "undefined";
}
และเรียกว่าชอบ:
isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
คำตอบที่ยอมรับนั้นถูกต้อง แค่ต้องการเพิ่มอีกหนึ่งตัวเลือก คุณยังสามารถใช้try ... catch
บล็อกเพื่อจัดการสถานการณ์นี้ ตัวอย่างนอกลู่นอกทาง:
var a;
try {
a = b + 1; // throws ReferenceError if b is not defined
}
catch (e) {
a = 1; // apply some default behavior in case of error
}
finally {
a = a || 0; // normalize the result in any case
}
ระวังcatch
บล็อกซึ่งค่อนข้างยุ่งเพราะมันสร้างขอบเขตระดับบล็อก และแน่นอนตัวอย่างนั้นง่ายมากในการตอบคำถามที่ถาม แต่ไม่ครอบคลุมถึงแนวปฏิบัติที่ดีที่สุดในการจัดการข้อผิดพลาด;)
ฉันใช้ฟังก์ชั่นขนาดเล็กเพื่อตรวจสอบว่ามีการประกาศตัวแปรซึ่งลดปริมาณความยุ่งเหยิงในไฟล์จาวาสคริปต์ของฉัน ฉันเพิ่มการตรวจสอบค่าเพื่อให้แน่ใจว่าตัวแปรไม่เพียง แต่มีอยู่ แต่ยังได้รับการกำหนดค่า เงื่อนไขที่สองตรวจสอบว่าตัวแปรได้รับการสร้างอินสแตนซ์หรือไม่เพราะถ้าตัวแปรนั้นถูกกำหนด แต่ไม่ได้สร้างอินสแตนซ์ (ดูตัวอย่างด้านล่าง) ก็จะยังคงเกิดข้อผิดพลาดหากคุณพยายามอ้างอิงค่าใน
ไม่ได้สร้างอินสแตนซ์ - var my_variable;
-var my_variable = "";
function varExists(el) {
if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) {
return true;
} else {
return false;
}
}
จากนั้นคุณสามารถใช้คำสั่งแบบมีเงื่อนไขเพื่อทดสอบว่าตัวแปรได้รับการกำหนดและอินสแตนซ์แบบนี้ ...
if ( varExists(variable_name) ) { // checks that it DOES exist }
หรือเพื่อทดสอบว่ายังไม่ได้กำหนดและใช้งานอินสแตนซ์ ...
if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
return typeof el !== "undefined" && typeof el.val() !== "undefined"