Saya ingin memeriksa apakah sebuah variabel berupa array atau nilai tunggal dalam JavaScript.
Saya telah menemukan sebuah solusi yang mungkin...
if (variable.constructor == Array)...
Ini adalah cara terbaik yang bisa dilakukan?
Ada beberapa cara untuk memeriksa apakah suatu variabel adalah suatu array atau tidak. Solusi terbaik adalah salah satu yang anda telah memilih.
variable.constructor === Array
Ini adalah metode tercepat pada Chrome, dan kemungkinan besar semua browser lainnya. Semua array adalah objek, jadi memeriksa konstruktor properti adalah proses yang cepat untuk JavaScript engine.
Jika anda mengalami masalah dengan mencari tahu jika sebuah objek properti adalah sebuah array, anda harus terlebih dahulu memeriksa apakah properti yang ada.
variable.prop && variable.prop.constructor === Array
Beberapa cara lain adalah:
Array.isArray(variable)
Update 23 Mei 2019 menggunakan Chrome 75, berteriak ke @AnduAndrici untuk memiliki saya kembali ini dengan pertanyaan
Yang terakhir ini adalah, menurut pendapat saya yang paling jelek, dan itu adalah salah satu lambat tercepat. Berjalan sekitar 1/5 kecepatan sebagai contoh pertama. pria Ini adalah sekitar 2-5% lebih lambat, tapi itu's cukup sulit untuk mengatakan. Padat untuk digunakan! Cukup terkesan dengan hasilnya. Array.prototipe, sebenarnya adalah array. anda dapat membaca lebih lanjut tentang hal itu di sini https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
variable instanceof Array
Metode ini berjalan sekitar 1/3 kecepatan sebagai contoh pertama. Masih cukup solid, terlihat bersih, jika anda're semua tentang cantik kode dan tidak begitu banyak pada kinerja. Perhatikan bahwa untuk memeriksa angka-angka tidak bekerja seperti variabel instanceof Nomor
selalu kembali palsu
. Update: instanceof
sekarang pergi 2/3 kecepatan!
Jadi belum update lagi
Object.prototype.toString.call(variable) === '[object Array]';
Orang ini adalah yang paling lambat untuk mencoba untuk memeriksa sebuah Array. Namun, ini adalah salah satu stop shop untuk semua jenis anda're looking for. Namun, karena anda'kembali mencari sebuah array, hanya menggunakan metode tercepat di atas.
Juga, aku berlari beberapa tes: http://jsperf.com/instanceof-array-vs-array-isarray/35 Jadi bersenang-senang dan check it out.
Catatan: @EscapeNetscape telah menciptakan tes lain sebagai jsperf.com lebih ke bawah. http://jsben.ch/#/QgYAV saya ingin pastikan link asli yang sempurna untuk setiap kali jsperf datang kembali online.
Anda juga bisa menggunakan:
if (value instanceof Array) {
alert('value is Array!');
} else {
alert('Not an array');
}
Ini menurut saya cukup elegan solusi, tapi untuk masing-masing sendiri.
Edit:
Sebagai ES5 ada sekarang juga:
Array.isArray(value);
Tapi ini akan istirahat pada browser lama, kecuali jika anda menggunakan polyfills (pada dasarnya... IE8 atau yang serupa).
Ada beberapa solusi dengan semua kebiasaan mereka sendiri. Halaman ini memberikan gambaran yang baik. Salah satu solusi yang mungkin adalah:
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
Aku melihat seseorang yang disebutkan jQuery, tapi saya didn't tahu ada isArray()
fungsi. Ternyata itu ditambahkan di versi 1.3.
jQuery mengimplementasikannya sebagai Peter menyarankan:
isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},
Setelah menempatkan banyak iman dalam jQuery sudah (terutama teknik mereka untuk kompatibilitas cross-browser) saya akan meng-upgrade ke versi 1.3 dan menggunakan fungsi mereka (memberikan upgrade yang tidak menyebabkan terlalu banyak masalah) atau menggunakan metode yang disarankan langsung dalam kode saya.
Banyak terima kasih untuk saran.
Di browser modern (dan beberapa warisan browser), anda dapat melakukan
Array.isArray(obj)
(Didukung oleh Chrome 5, Firefox 4.0, IE 9, Opera 10.5 dan Safari 5)
Jika anda perlu dukungan versi IE, anda dapat menggunakan es5-shim untuk polyfill Array.isArray; atau tambahkan baris berikut
# 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, anda dapat menggunakan jQuery.isArray(obj)
atau $.isArray(obj)
. Jika anda menggunakan garis bawah anda dapat menggunakan _.isArray(obj)
Jika anda don't perlu untuk mendeteksi array yang dibuat dalam frame yang berbeda anda juga dapat hanya menggunakan instanceof
obj instanceof Array
Catatan: argumen
kata kunci yang dapat digunakan untuk mengakses argumen dari fungsi isn't Array, meskipun (biasanya) berperilaku seperti satu:
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)
Ini adalah pertanyaan lama tetapi memiliki masalah yang sama saya menemukan sebuah solusi yang sangat elegan yang saya inginkan untuk berbagi.
Menambahkan sebuah prototipe untuk Array membuatnya sangat sederhana
Array.prototype.isArray = true;
Sekarang sekali jika anda memiliki sebuah objek yang anda inginkan untuk menguji untuk melihat jika array semua yang anda butuhkan adalah untuk memeriksa properti baru
var box = doSomething();
if (box.isArray) {
// do something
}
isArray ini hanya tersedia jika array
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;
}
Utama gagal Crockford menyebutkan adalah ketidakmampuan untuk benar menentukan array yang dibuat dalam konteks yang berbeda, misalnya, jendela
.
Halaman yang memiliki banyak versi yang lebih canggih jika hal ini tidak cukup.
Saya pribadi suka Peter's saran: https://stackoverflow.com/a/767499/414784 (untuk ECMAScript 3. Untuk ECMAScript 5, menggunakan Array.isArray()
)
Komentar pada pos menunjukkan, bagaimanapun, bahwa jika toString()
berubah sama sekali, bahwa cara memeriksa array akan gagal. Jika anda benar-benar ingin menjadi spesifik dan pastikan toString()
tidak pernah berubah, dan tidak ada masalah dengan benda-benda atribut class ([Array object]
adalah atribut kelas dari suatu 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 Panduan Definitif edisi 6, 7.10, ia mengatakan Array.isArray()
ini diimplementasikan dengan menggunakan Objek.prototipe.toString.call()
dalam ECMAScript 5. Perhatikan juga bahwa jika anda're akan khawatir tentang toString()
's implementasi berubah, anda juga harus khawatir tentang setiap yang dibangun dalam metode berubah juga. Mengapa menggunakan push()
? Seseorang dapat mengubah itu! Pendekatan seperti itu adalah konyol. Di atas adalah aplikasi yang menawarkan solusi untuk mereka yang khawatir tentang toString()
mengubah, tapi aku percaya cek yang tidak perlu.
Jika anda're hanya berurusan dengan EcmaScript 5 dan di atas maka anda dapat menggunakan built in Array.isArray
fungsi
misalnya,
Array.isArray([]) // true
Array.isArray("foo") // false
Array.isArray({}) // false
Ketika saya memposting pertanyaan ini versi JQuery yang saya gunakan tidak't memiliki sebuah isArray
fungsi. Kalau aku mungkin akan hanya digunakan percaya bahwa implementasi untuk menjadi yang terbaik browser independen cara untuk melakukan ini jenis tertentu cek.
Sejak JQuery sekarang tidak menawarkan fungsi ini, aku akan selalu menggunakannya...
$.isArray(obj);
(sebagai versi 1.6.2) masih dilaksanakan dengan menggunakan perbandingan pada string dalam bentuk
toString.call(obj) === "[object Array]"
Pikir saya akan menambahkan pilihan lain bagi mereka yang mungkin sudah menggunakan Underscore.js pustaka dalam naskah mereka. Underscore.js memiliki isArray() fungsi (lihat http://underscorejs.org/#isArray).
_.isArray(object)
Mengembalikan true jika object adalah sebuah Array.
Jika anda menggunakan Sudut, anda dapat menggunakan sudut.isArray() fungsi
var myArray = [];
angular.isArray(myArray); // returns true
var myObj = {};
angular.isArray(myObj); //returns false
Di Crockford's JavaScript The Good Parts, ada fungsi untuk memeriksa apakah diberikan argumen adalah array:
var is_array = function (value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
Ia menjelaskan:
Pertama, kami meminta jika nilai truthy. Hal ini kami lakukan untuk menolak null dan lain falsy nilai-nilai. Kedua, kami meminta jika typeof nilai 'objek'. Ini akan berlaku untuk objek, array, dan (ganjil) null. Ketiga, kami meminta jika nilai memiliki panjang properti itu adalah nomor. Ini akan selalu benar untuk array, tetapi biasanya tidak untuk benda-benda. Keempat, kami meminta jika nilai berisi sambatan metode. Ini lagi-lagi akan menjadi kenyataan bagi semua array. Akhirnya, kami meminta jika panjang properti enumerable (akan suhu udara yang akan diproduksi oleh a untuk di loop?). Itu akan salah untuk semua array. Ini adalah yang paling dapat diandalkan tes untuk arrayness yang saya temukan. Sangat disayangkan bahwa hal ini begitu rumit.
Solusi universal di bawah ini:
Object.prototype.toString.call(obj)=='[object Array]'
Mulai dari ECMAScript 5, solusi yang formal adalah :
Array.isArray(arr)
Juga, untuk lama JavaScript libs, anda dapat menemukan berikut solusi meskipun itu's tidak cukup akurat:
var is_array = function (value) {
return value &&
typeof value === 'object' &&
typeof value.length === 'number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));
};
Solusi dari http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript
Bagi mereka yang kode-golf, tidak dapat diandalkan tes dengan sedikit karakter:
function isArray(a) {
return a.map;
}
Ini biasanya digunakan ketika melintasi/perataan hirarki:
function golf(a) {
return a.map?[].concat.apply([],a.map(golf)):a;
}
input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Saya pikir menggunakan myObj.konstruktor==Objek dan myArray.konstruktor==Array adalah cara terbaik. Hampir 20x lebih cepat daripada menggunakan toString(). Jika anda memperpanjang objek dengan anda sendiri konstruktor dan ingin orang-kreasi dianggap "benda" dan juga dari ini doesn't bekerja, tetapi jika cara yang lebih cepat. jenis ini hanya sebagai cepat sebagai metode konstruktor tapi typeof []=='objek' mengembalikan true yang akan sering menjadi tidak diinginkan. http://jsperf.com/constructor-vs-tostring
satu hal yang perlu diperhatikan adalah null.konstruktor akan melempar kesalahan jadi jika anda mungkin akan memeriksa untuk nilai-nilai null anda akan harus terlebih dahulu dilakukan jika(testThing!==null){}
Saya telah membuat ini sedikit kode, yang dapat kembali benar jenis.
Saya tidak yakin tentang kinerja, tapi itu's merupakan upaya untuk benar mengidentifikasi jenis.
https://github.com/valtido/better-typeOf juga menulis sedikit tentang hal itu di sini http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/
ia bekerja, mirip dengan yang saat ini typeof.
var user = [1,2,3]
typeOf(user); //[object Array]
Ia berpikir mungkin perlu sedikit fine tuning, dan memperhitungkan hal-hal, saya belum menemukan atau menguji dengan benar. sehingga perbaikan lebih lanjut yang diterima, apakah itu's kinerja bijaksana, atau salah pelaporan typeOf.