ใน es6 คุณสามารถใช้เมธอด isArray() ของ Array เพื่อตรวจสอบว่าตัวแปรนั้นเป็นอาร์เรย์หรือไม่ ไวยากรณ์คือ "Array.isArray(obj)" อาร์เรย์จะส่งกลับค่าจริง มิฉะนั้นจะส่งกลับค่าเท็จ
สภาพแวดล้อมการทำงานของบทช่วยสอนนี้: ระบบ Windows 7, ECMAScript เวอร์ชัน 6, คอมพิวเตอร์ Dell G3
การพิจารณาว่าตัวแปรเป็นอาร์เรย์ใน ES5 หรือไม่ ใน ES5
เรามีอย่างน้อย 5 วิธีต่อไปนี้ในการพิจารณาว่าค่านั้นเป็นอาร์เรย์หรือไม่:
var a = []; // 1. ขึ้นอยู่กับอินสแตนซ์ของ อินสแตนซ์ของ Array; // 2. ขึ้นอยู่กับตัวสร้าง ก.ตัวสร้าง === อาร์เรย์; // 3. ขึ้นอยู่กับ Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // 4. ขึ้นอยู่กับ getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // 5. ขึ้นอยู่กับ Object.prototype.toString Object.prototype.toString.apply(a) === '[object Array]';
ข้างต้น ยกเว้น Object.prototype.toString
วิธีการอื่นไม่สามารถระบุประเภทของตัวแปรได้อย่างถูกต้อง
คุณรู้ไหมว่าสภาพแวดล้อมการทำงานของโค้ดนั้นซับซ้อนมากและตัวแปรอาจใช้กลอุบายทุกประเภทเพื่อสร้างความสับสนให้กับผู้สร้าง มาดูกันว่า
var a = { __โปรโต__: อาร์เรย์.ต้นแบบ - //ลองเรียกใช้โค้ดต่อไปนี้ในคอนโซลตามลำดับ // 1. ขึ้นอยู่กับอินสแตนซ์ของ อินสแตนซ์ของ Array; // => true // 2. ขึ้นอยู่กับตัวสร้าง ก.คอนสตรัคเตอร์ === อาร์เรย์; // => จริง // 3. ขึ้นอยู่กับ Object.prototype.isPrototypeOf Array.prototype.isPrototypeOf(a); // => จริง // 4. ขึ้นอยู่กับ getPrototypeOf Object.getPrototypeOf(a) === Array.prototype; // => true
ข้างต้น ทั้ง 4 วิธีจะ return ค่า true ออกมา เราเพิ่งระบุแอตทริบิวต์ __proto__ ของอ็อบเจ็กต์ด้วยตนเองเป็น Array.prototype ซึ่งทำให้อ็อบเจ็กต์สืบทอดอ็อบเจ็กต์ Array ที่ไม่รับผิดชอบนี้ทำให้รูปแบบการตัดสินตามการสืบทอดพังทลายลงทันที
ไม่เพียงเท่านั้น เรายังรู้ด้วยว่า Array คือข้อมูลฮีป และตัวแปรจะชี้ไปยังที่อยู่อ้างอิงเท่านั้น ดังนั้นที่อยู่อ้างอิงโดยออบเจ็กต์ Array ของแต่ละหน้าจึงแตกต่างกัน สำหรับอาร์เรย์ที่ประกาศใน iframe ตัวสร้างของอาร์เรย์คืออ็อบเจ็กต์ Array ใน iframe หากมีการประกาศอาร์เรย์ x ใน iframe และกำหนดให้กับตัวแปร y ของเพจระดับบนสุด อินสแตนซ์ y ของ Array จะถูกนำมาใช้บนเพจระดับบนสุด และผลลัพธ์จะต้องเป็นเท็จ อันสุดท้ายส่งคืนสตริง ดังนั้นจึงไม่มีปัญหาในการอ้างอิง ในความเป็นจริง การโต้ตอบระหว่างหลายเพจหรือระบบสามารถทำได้ด้วยสตริงเท่านั้น
การพิจารณาว่าตัวแปรเป็นอาร์เรย์ใน ES6 หรือไม่
เนื่องจากการใช้อาร์เรย์ทั่วไป จึงเพิ่มเมธอด Array.isArray ใน ES6 การใช้วิธีนี้เพื่อพิจารณาว่าตัวแปรเป็นอาร์เรย์นั้นง่ายมาก ดังนี้
: ([]); // => จริง Array.isArray({0: 'a', length: 1}); // => false
ที่จริงแล้ว การใช้ Object.prototype.toString
เพื่อกำหนดประเภทของค่าก็เป็นมาตรฐานสำหรับไลบรารีกระแสหลักเช่นกัน ดังนั้น polyfill สำหรับ Array.isArray มักจะมีลักษณะดังนี้:
if (!Array.isArray){ Array.isArray = ฟังก์ชั่น (หาเรื่อง) { กลับ Object.prototype.toString.call (arg) === '[อาร์เรย์วัตถุ]'; - -