ใน 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) === '[อาร์เรย์วัตถุ]';
-
-