อีกทางเลือกหนึ่งของ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