Pertanyaan Bagaimana Anda memeriksa apakah suatu variabel adalah larik dalam JavaScript? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya ingin memeriksa apakah suatu variabel adalah array atau nilai tunggal dalam JavaScript.

Saya telah menemukan solusi yang mungkin ...

if (variable.constructor == Array)...

Apakah ini cara terbaik yang bisa dilakukan?


1478
2018-04-20 09:02


asal


Jawaban:


Ada beberapa cara untuk memeriksa apakah suatu variabel adalah array atau tidak. Solusi terbaik adalah yang Anda pilih.

variable.constructor === Array

Ini adalah metode tercepat di Chrome, dan kemungkinan besar semua browser lainnya. Semua array adalah objek, jadi memeriksa properti konstruktor adalah proses cepat untuk mesin JavaScript.

Jika Anda mengalami masalah dengan mencari tahu apakah properti objek adalah larik, Anda harus terlebih dahulu memeriksa apakah properti ada di sana.

variable.prop && variable.prop.constructor === Array

Beberapa cara lain adalah:

variable instanceof Array

Metode ini berjalan sekitar 1/3 kecepatan sebagai contoh pertama. Masih cukup solid, terlihat lebih bersih, jika Anda semua tentang kode cantik dan tidak begitu banyak pada kinerja. Perhatikan bahwa memeriksa nomor tidak berfungsi sebagai variable instanceof Number selalu kembali false. Memperbarui: instanceof sekarang berjalan 2/3 kecepatan!

Array.isArray(variable)

Yang terakhir ini, menurut saya yang paling jelek, dan ini adalah salah satu yang paling lambat. Menjalankan sekitar 1/5 kecepatan sebagai contoh pertama. Array.prototype, sebenarnya adalah sebuah array. Anda dapat membaca lebih lanjut tentang ini di sini https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

Jadi pembaruan lain

Object.prototype.toString.call(variable) === '[object Array]';

Orang ini adalah yang paling lambat untuk mencoba memeriksa Array. Namun, ini adalah one stop shop untuk semua jenis yang Anda cari. Namun, karena Anda mencari array, cukup gunakan metode tercepat di atas.

Juga, saya menjalankan beberapa tes: http://jsperf.com/instanceof-array-vs-array-isarray/33 Jadi bersenang-senanglah dan periksa.

Catatan: @EscapeNetscape telah membuat tes lain karena jsperf.com tidak aktif. http://jsben.ch/#/QgYAV Saya ingin memastikan tautan asli tetap ada saat jsperf kembali online.


1312
2017-10-29 15:07



Anda juga bisa menggunakan:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

Ini menurut saya solusi yang cukup elegan, tetapi untuk masing-masing miliknya sendiri.

Edit:

Pada ES5 sekarang ada juga:

Array.isArray(value);

Tetapi ini akan merusak browser lama, kecuali Anda menggunakan polyfill (pada dasarnya ... IE8 atau sejenisnya).


982
2018-04-20 09:05



Saya melihat seseorang menyebutkan jQuery, tetapi saya tidak tahu ada isArray() fungsi. Ternyata itu ditambahkan dalam versi 1.3.

jQuery mengimplementasikannya seperti yang disarankan oleh Peter:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

Telah menaruh banyak kepercayaan pada jQuery (terutama teknik mereka untuk kompatibilitas antar-browser) Saya akan meningkatkan ke versi 1.3 dan menggunakan fungsinya (dengan syarat bahwa peningkatan tidak menyebabkan terlalu banyak masalah) atau menggunakan metode yang disarankan ini secara langsung di kode.

Banyak terima kasih atas sarannya.


72
2018-04-20 10:10



Ada beberapa solusi dengan semua kebiasaan mereka sendiri. Halaman ini memberikan ikhtisar yang bagus. Salah satu solusi yang mungkin adalah:

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

71
2018-04-20 09:08



Di browser modern (dan beberapa browser lawas), Anda dapat melakukannya

Array.isArray(obj)

(Didukung oleh Chrome 5, Firefox 4.0, IE 9, Opera 10.5, dan Safari 5)

Jika Anda perlu mendukung IE versi lama, Anda dapat menggunakannya es5-shim ke polyfill Array.isArray; atau tambahkan yang berikut ini

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

Jika Anda menggunakan jQuery yang dapat Anda gunakan jQuery.isArray(obj) atau $.isArray(obj). Jika Anda menggunakan garis bawah Anda dapat menggunakan _.isArray(obj)

Jika Anda tidak perlu mendeteksi larik yang dibuat dalam bingkai berbeda, Anda juga dapat menggunakan instanceof

obj instanceof Array

Catatan: the arguments kata kunci yang dapat digunakan untuk mengakses argumen suatu fungsi bukanlah Array, meskipun biasanya (biasanya) berperilaku seperti:

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

54
2018-01-08 07:37



Ini adalah pertanyaan lama tetapi memiliki masalah yang sama saya menemukan solusi yang sangat elegan yang ingin saya bagikan.

Menambahkan prototipe ke Array membuatnya sangat sederhana

Array.prototype.isArray = true;

Sekarang sekali jika Anda memiliki objek yang ingin Anda uji untuk melihat apakah sebuah array yang Anda butuhkan adalah untuk memeriksa properti baru

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray hanya tersedia jika array-nya


49
2017-10-24 21:12



Melalui Crockford:

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

Gagal Crockford utama yang gagal adalah ketidakmampuan untuk menentukan susunan yang dibuat dalam konteks yang berbeda, misalnya, window. Halaman itu memiliki versi yang jauh lebih canggih jika ini tidak mencukupi.


45
2018-04-20 09:07



Saya pribadi menyukai saran Petrus: https://stackoverflow.com/a/767499/414784 (untuk ECMAScript 3. Untuk ECMAScript 5, gunakan Array.isArray())

Komentar pada posting menunjukkan, bagaimanapun, bahwa jika toString() diubah sama sekali, bahwa cara memeriksa array akan gagal. Jika Anda benar-benar ingin lebih spesifik dan pastikan toString() belum diubah, dan tidak ada masalah dengan atribut class objects ([object Array] adalah atribut class dari objek yang merupakan array), maka saya sarankan melakukan sesuatu seperti ini:

//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')
    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    }
    else
    {
        // may want to change return value to something more desirable
        return -1; 
    }
}

Perhatikan bahwa dalam JavaScript The Definitive Guide edisi 6th, 7.10, dikatakan Array.isArray() diimplementasikan menggunakan Object.prototype.toString.call() di ECMAScript 5. Juga perhatikan bahwa jika Anda akan khawatir toString()Implementasi berubah, Anda juga harus khawatir tentang setiap metode built in lainnya juga berubah. Mengapa digunakan? push()? Seseorang dapat mengubahnya! Pendekatan semacam itu konyol. Cek di atas adalah solusi yang ditawarkan kepada mereka yang khawatir toString() berubah, tapi saya yakin cek itu tidak perlu.


26
2017-12-03 03:17