Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk menentukan sama ada pembolehubah ialah tatasusunan dalam es6

Bagaimana untuk menentukan sama ada pembolehubah ialah tatasusunan dalam es6

青灯夜游
青灯夜游asal
2023-01-18 18:17:211370semak imbas

Kaedah penghakiman: 1. Gunakan fungsi isArray() bagi objek Array untuk menentukan sama ada pembolehubah ialah tatasusunan Sintaks ialah "Array.isArray(obj)". benar, jika tidak ia akan kembali palsu. 2. Hakim dengan "Object.prototype.toString()", sintaksnya ialah "Object.prototype.toString.apply(a) === '[object Array]'".

Bagaimana untuk menentukan sama ada pembolehubah ialah tatasusunan dalam es6

Persekitaran pengendalian tutorial ini: sistem Windows 7, ECMAScript versi 6, komputer Dell G3.

Mekanisme penaipan JS yang lemah menjadikan menilai jenis pembolehubah sebagai soalan yang diperlukan semasa temu duga untuk pembangun bahagian hadapan junior Secara amnya, saya akan menggunakan ini sebagai soalan pertama semasa memeriksa calon, dan kemudian meneruskan berdasarkan ini.

Menentukan sama ada pembolehubah ialah tatasusunan dalam ES5

Dalam ES5, kita mempunyai sekurang-kurangnya 5 cara berikut untuk menentukan sama ada nilai itu tatasusunan:

var a = []; 
// 1.基于instanceof 
a instanceof Array; 
// 2.基于constructor 
a.constructor === Array; 
// 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]';

Di atas, kecuali Object.prototype.toString, tiada kaedah lain boleh menentukan jenis pembolehubah dengan betul.

Anda mesti tahu bahawa persekitaran berjalan kod adalah sangat kompleks dan pembolehubah mungkin menggunakan semua jenis helah untuk mengelirukan penciptanya. Mari lihat:

var a = {
    __proto__: Array.prototype
}; 
// 分别在控制台试运行以下代码 
// 1.基于instanceof 
a instanceof Array; // => true 
// 2.基于constructor 
a.constructor === Array; // => true 
// 3.基于Object.prototype.isPrototypeOf 
Array.prototype.isPrototypeOf(a); // => true 
// 4.基于getPrototypeOf 
Object.getPrototypeOf(a) === Array.prototype; // => true

Di atas, kesemua 4 kaedah akan kembali benar Mengapa? Kami hanya menetapkan atribut __proto__ objek secara manual sebagai Array.prototype, yang menyebabkan objek mewarisi objek Array Kaedah pewarisan yang tidak bertanggungjawab ini menyebabkan skim penghakiman berdasarkan warisan runtuh serta-merta.

Bukan itu sahaja, kami juga tahu bahawa Array ialah data timbunan, dan pembolehubah hanya menunjuk ke alamat rujukannya, jadi alamat yang dirujuk oleh objek Array bagi setiap halaman adalah berbeza. Untuk tatasusunan yang diisytiharkan dalam iframe, pembinanya ialah objek Tatasusunan dalam iframe. Jika tatasusunan x diisytiharkan dalam iframe dan diperuntukkan kepada pembolehubah y halaman induk, maka y instanceof Array digunakan pada halaman induk, dan hasilnya mestilah palsu. Yang terakhir mengembalikan rentetan, jadi tiada masalah rujukan. Malah, interaksi antara berbilang halaman atau sistem hanya boleh dilakukan dengan rentetan.

Tentukan sama ada pembolehubah ialah tatasusunan dalam ES6

Memandangkan penggunaan biasa tatasusunan, kaedah Array.isArray ditambah dalam ES6, gunakan Kaedah ini sangat mudah untuk menentukan sama ada pembolehubah ialah tatasusunan, seperti berikut:

Array.isArray([]); // => true 
Array.isArray({0: 'a', length: 1}); // => false

Malah, ia juga merupakan standard untuk perpustakaan arus perdana utama untuk menentukan jenis nilai melalui Objek .prototype.toString. Oleh itu, polyfill Array.isArray biasanya kelihatan seperti ini:

if (!Array.isArray){ 
    Array.isArray = function(arg){ 
        return Object.prototype.toString.call(arg) === '[object Array]'; 
    }; 
}

[Cadangan berkaitan: tutorial pembelajaran javascript]

Atas ialah kandungan terperinci Bagaimana untuk menentukan sama ada pembolehubah ialah tatasusunan dalam es6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn