อีกทางเลือกหนึ่งของtypeofคำตอบมากมาย
ตัวแปรโกลบอลที่ประกาศพร้อมvar varname = value;คำสั่งในขอบเขตโกลบอล
สามารถเข้าถึงได้เป็นคุณสมบัติของวัตถุหน้าต่าง
เช่นhasOwnProperty()วิธีการซึ่ง
ส่งคืนบูลีนที่ระบุว่าวัตถุนั้นมีคุณสมบัติที่ระบุเป็นคุณสมบัติของตัวเองหรือไม่ (ซึ่งต่างจากการสืบทอด)
สามารถใช้เพื่อตรวจสอบว่า
varของ"varName"ได้รับการประกาศทั่วโลกเช่นwindowเป็นทรัพย์สินของที่
// Globally established, therefore, properties of window
var foo = "whatever", // string
bar = false, // bool
baz; // undefined
// window.qux does not exist
console.log( [
window.hasOwnProperty( "foo" ), // true
window.hasOwnProperty( "bar" ), // true
window.hasOwnProperty( "baz" ), // true
window.hasOwnProperty( "qux" ) // false
] );
มีอะไรที่ยอดเยี่ยมเกี่ยวกับ hasOwnProperty()เรียกมันว่าเราไม่ได้ใช้ตัวแปรที่อาจยังไม่ได้ประกาศซึ่งแน่นอนว่าครึ่งหนึ่งของปัญหาในตอนแรก
แม้ว่าจะไม่ได้เสมอที่สมบูรณ์แบบหรือเหมาะแก้ปัญหาในบางสถานการณ์ก็แค่งาน!
หมายเหตุ
ด้านบนเป็นจริงเมื่อใช้varเพื่อกำหนดตัวแปรซึ่งตรงข้ามกับletที่:
ประกาศตัวแปรโลคัลขอบเขตบล็อกให้เลือกที่จะกำหนดค่าเป็นค่าเริ่มต้น
ไม่เหมือน varคำหลักซึ่งกำหนดตัวแปรทั่วโลกหรือภายในฟังก์ชันทั้งหมดโดยไม่คำนึงถึงขอบเขตบล็อก
ที่ระดับบนสุดของโปรแกรมและฟังก์ชั่นซึ่งletแตกต่างจากการvarสร้างคุณสมบัติบนวัตถุทั่วโลก
เพื่อความสมบูรณ์: constค่าคงที่คือโดยความหมายไม่ใช่ตัวแปรจริง (แม้ว่าเนื้อหาสามารถเป็นได้); มีความเกี่ยวข้องมากขึ้น:
ค่าคงที่ส่วนกลางไม่กลายเป็นคุณสมบัติของวัตถุหน้าต่างซึ่งแตกต่างจากvarตัวแปร ต้องมี initializer สำหรับค่าคงที่ นั่นคือคุณต้องระบุค่าในคำสั่งเดียวกับที่มีการประกาศ
ค่าของค่าคงที่ไม่สามารถเปลี่ยนแปลงได้ผ่านการกำหนดใหม่และไม่สามารถประกาศใหม่ได้
การประกาศ const สร้างการอ้างอิงแบบอ่านอย่างเดียวกับค่า ไม่ได้หมายความว่าค่าที่เก็บไว้นั้นไม่เปลี่ยนรูปเพียง แต่ตัวระบุตัวแปรไม่สามารถกำหนดใหม่ได้
เนื่องจากletตัวแปรหรือconstค่าคงที่ไม่เคยมีคุณสมบัติของวัตถุใด ๆ ที่มีการสืบทอดhasOwnProperty()วิธีการจึงไม่สามารถใช้เพื่อตรวจสอบการมีอยู่ของพวกเขา
เกี่ยวกับความพร้อมใช้งานและการใช้hasOwnProperty():
วัตถุทุกชนิดที่สืบทอดมาจากวัตถุสืบทอดhasOwnProperty()วิธีการ [... ] ไม่เหมือนกับตัวinดำเนินการวิธีนี้ไม่ได้ตรวจสอบโซ่ต้นแบบของวัตถุ
fooมีการประกาศtypeof foo === 'undefined'หรือไม่typeof foo === typeof undefined