1. วิธีการตัดสินอาร์เรย์ที่แท้จริง
วิธีที่ง่ายที่สุดในการประกาศอาร์เรย์ใน JavaScript คือ:
var a = [];
วิธีที่ตรงที่สุดในการพิจารณาว่าเป็นอาร์เรย์หรือไม่:
การคัดลอกรหัสมีดังนี้:
อินสแตนซ์ของอาร์เรย์ // จริง
A.Constructor == Array // true
นี่คืออินสแตนซ์ของไวยากรณ์ Instanceof เป็นผู้ให้บริการคลาวด์ เช่น "+-*/" ไวยากรณ์ของมันมีดังนี้:
ผลลัพธ์ = OBJ Intanceof Class
มันถูกใช้เพื่อตรวจสอบว่าวัตถุเป็นอินสแตนซ์ของคลาสและผลลัพธ์การดำเนินการจะส่งคืนจริงหรือเท็จ คำจำกัดความของคลาสใน JavaScript จะเริ่มต้นผ่านตัวสร้างดังนั้นตัวดำเนินการที่เหมาะสมของอินสแตนซ์ของไวยากรณ์จะต้องเป็นอินสแตนซ์ของฟังก์ชันนั่นคือฟังก์ชันอินสแตนซ์คลาสของคลาสจะต้องเป็นจริงและหากตัวดำเนินการที่เหมาะสมไม่ใช่ฟังก์ชั่นเมื่อใช้อินสแตนซ์ วัตถุทั้งหมดเป็นอินสแตนซ์ของวัตถุดังนั้นวัตถุใด ๆ อินสแตนซ์ของวัตถุที่ส่งกลับจริง แม้ว่าเราจะบอกว่าวัตถุนั้นเริ่มต้นผ่านตัวสร้าง แต่อินสแตนซ์ของไม่ได้ตรวจสอบว่าวัตถุนั้นถูกสร้างขึ้นโดยฟังก์ชั่นหรือไม่ แต่ได้รับการสืบทอดโดยต้นแบบของตัวสร้าง ตัวอย่างต่อไปนี้สามารถแสดงปัญหานี้:
การคัดลอกรหัสมีดังนี้:
ช่วงฟังก์ชัน (ต่ำ, สูง) {
this.low = ต่ำ;
this.high = สูง;
-
range.prototype.constructor == ช่วง; //จริง
range.prototype = {
รวม: ฟังก์ชั่น (x) {return (x> = this.low && x <= this.high); -
ยกเว้น: ฟังก์ชั่น (x) {return (x <this.low && x> this.high); -
-
var r = ช่วงใหม่ (0, 100);
r อินสแตนซ์ของช่วง; //เท็จ
r อินสแตนซ์ของวัตถุ; //จริง
range.prototype.constructor == วัตถุ; //จริง
แม้ว่า R จะถูกสร้างขึ้นผ่านช่วงใหม่ แต่ R ไม่ใช่อินสแตนซ์ของช่วง นี่คือปัญหา คำสั่งการกำหนด prototype จะแทนที่ตัวสร้างเริ่มต้น ก่อนที่จะได้รับการกำหนดต้นแบบช่วงเวลา prototype.constructor เป็นช่วงและหลังจากการมอบหมายให้ทำมันจะกลายเป็นวัตถุ เป็นเรื่องง่ายที่จะเข้าใจเพราะ
การคัดลอกรหัสมีดังนี้:
range.prototype = {
รวม: ฟังก์ชั่น (x) {return (x> = this.low && x <= this.high); -
ยกเว้น: ฟังก์ชั่น (x) {return (x <this.low && x> this.high); -
-
เทียบเท่ากับ:
การคัดลอกรหัสมีดังนี้:
range.prototype = วัตถุใหม่ ({
รวม: ฟังก์ชั่น (x) {return (x> = this.low && x <= this.high); -
ยกเว้น: ฟังก์ชั่น (x) {return (x <this.low && x> this.high); -
-
ดังนั้น range.prototype.constructor == วัตถุจากนั้นอินสแตนซ์ที่สร้างผ่านช่วงใหม่นั้นแน่นอนว่าเป็นอินสแตนซ์ของวัตถุ
มันตรงกว่าที่จะเห็นคำอธิบายอย่างเป็นทางการ:
ตัวดำเนินการอินสแตนซ์ของไม่ได้ตรวจสอบว่า R เริ่มต้นโดยตัวสร้างช่วงหรือไม่ มันตรวจสอบว่ามันสืบทอดมาจาก range.prototype หรือไม่
นอกจากนี้ยังมีประเภทฟังก์ชันใน JavaScript ที่มีฟังก์ชั่นที่คล้ายกันกับอินสแตนซ์ของ แต่จะส่งคืนประเภทข้อมูลพื้นฐานเฉพาะ: จำนวน, สตริง, ฟังก์ชั่น, วัตถุ, ไม่ได้กำหนด, บูลีน มีเพียงหกประเภทเท่านั้นและสิ่งที่ไม่ได้อยู่ในวัตถุส่งคืนหกประเภทเหล่านี้คือ typeof ([]) ส่งคืนวัตถุไม่ใช่อาร์เรย์
ไวยากรณ์อื่นที่เกี่ยวข้องคือตัวสร้างคอนสตรัคเตอร์ส่งคืนตัวสร้างของวัตถุ:
การคัดลอกรหัสมีดังนี้:
var a = [];
A.Constructor; // อาร์เรย์
ตัวสร้างเป็นฟังก์ชั่นการเริ่มต้นของวัตถุซึ่งใช้การโทรใหม่ หากวัตถุเป็นอาร์เรย์ตัวสร้างของมันควรเป็นอาร์เรย์และชั้นเรียนที่คุณเขียนไม่จำเป็นต้องเป็นจริงเพราะตัวสร้างในต้นแบบอาจเปลี่ยนไป
2. วิธีการตัดสินเทียม-อาเรย์
มีอาร์เรย์หลอกในจาวาสคริปต์ มันสามารถข้ามไปได้โดยใช้วิธีการสำรวจแบบ traversal คล้ายกับอาร์เรย์ มันมีแอตทริบิวต์ความยาวเพื่อให้ได้ความยาวขององค์ประกอบ คุณสามารถใช้ [] ตัวห้อย [] เพื่อรับองค์ประกอบที่ระบุ เราเรียกวัตถุแบบนี้ว่าเป็นอาเรย์หลอก วัตถุใน jQuery เป็นอาร์เรย์หลอกทั่วไปดังแสดงในรูปด้านล่าง:
ดังนั้นกุญแจสำคัญในการตัดสินว่าเป็น Pseudo-Array คือการตัดสินว่ามีแอตทริบิวต์ความยาวหรือไม่และมีฟังก์ชั่นการทำงานแบบอาร์เรย์พื้นฐานหรือไม่ ต่อไปนี้เป็นวิธีการตัดสิน:
การคัดลอกรหัสมีดังนี้:
var is_array = function (value) {
คืนค่า &&
typeof value === 'Object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
! (value.propertyisenumerable ('ความยาว'));
-
ที่นี่ Propertyisenumerable ใช้เพื่อตรวจสอบว่าคุณสมบัติความยาวนั้นสามารถระบุได้หรือไม่ ในความเป็นจริงวัตถุสตริงเนทีฟยังมีเอฟเฟกต์อาร์เรย์ แต่เราไม่สามารถปฏิบัติต่อมันเป็นวัตถุอาร์เรย์ได้ดังนั้นเราจึงต้องตัดสินค่า typeof == "วัตถุ" เนื่องจาก typeof a String Object ส่งคืนสตริง