Kaip patikrinti, ar kintamasis yra „JavaScript“ masyvas?

Norėčiau patikrinti, ar kintamasis yra arba masyvas, arba viena reikšmė javascript.

Radau galimą sprendimą ...

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

Ar tai geriausias būdas tai padaryti?

1593
20 апр. Andy McCluggage nustatė balandžio 20 d 2009-04-20 12:02 '09, 12:02 2009-04-20 12:02
@ 24 atsakymai

Yra keli būdai patikrinti, ar kintamasis yra masyvas, ar ne. Geriausias sprendimas yra tas, kurį pasirinkote.

 variable.constructor === Array 

Tai greičiausias „Chrome“ būdas ir, greičiausiai, visos kitos naršyklės. Visos matricos yra objektai, todėl konstruktoriaus nuosavybės tikrinimas yra greitas „JavaScript“ variklių procesas.

Jei turite problemų išsiaiškinti, ar objekto ypatybė yra masyvas, pirmiausia turite patikrinti, ar ten yra nuosavybė.

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

Kitu būdu:

 variable instanceof Array 

Šis metodas veikia kaip 1/3 greičio kaip pirmasis pavyzdys. Vis dar gana kietas, atrodo švaresnis, jei jūs visi kalbate apie gerą kodą, o ne apie našumą. Atkreipkite dėmesį, kad skaičiaus patikrinimas neveikia, nes variable instanceof Number visada grąžina false . Atnaujinimas: instanceof dabar ateina su 2/3 greičiu!

 Array.isArray(variable) 

Šis paskutinis, mano nuomone, yra bjauriausias, ir tai yra vienas iš lėtiausių. Pirmasis pavyzdys naudojamas maždaug 1/5 greičiu. Array.prototype iš tikrųjų yra masyvas. Apie jį galite skaityti čia https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

Taigi dar vienas atnaujinimas

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

Šis vaikinas yra pats lėčiausias bandymas patikrinti masyvą. Tačiau tai yra vieno >

Be to, aš patikrinau tam tikrą testą: http://jsperf.com/instanceof-array-vs-array-isarray/33 Taigi turėkite šiek tiek malonumo ir patikrinkite.

Pastaba @EscapeNetscape sukūrė dar vieną testą, nes jsperf.com neveikia. http://jsben.ch/#/QgYAV Norėjau įsitikinti, kad pradinė nuoroda išliks, kai jsperf grįš į tinklą.

1468 m
29 окт. atsakymą pateikė jemiloii 29 okt. 2014-10-29 18:07 '14, 18:07 2014-10-29 18:07

Taip pat galite naudoti:

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

Manau, kad tai gana elegantiškas sprendimas, bet kiekvienam iš jų.

Redaguoti:

ES5 taip pat turi:

 Array.isArray(value); 

Tačiau, jei nenaudosite politikos (dažniausiai ... IE8 arba lygiavertė), ji bus pertrauka į senesnes naršykles.

1007
20 апр. Brett Benderio atsakymas, pateiktas balandžio 20 d 2009-04-20 12:05 '09, 12:05 2009-04-20 12:05

Pastebėjau, kad kažkas paminėjo jQuery, bet nežinojau, kad yra funkcija „ isArray() . Pasirodo, kad jis buvo pridėtas prie 1.3 versijos.

JQuery jį įgyvendina, kaip siūlo Peteris:

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

Didelė tikėjimas jQuery (ypač jų suderinamumu su keliomis naršyklėmis), aš arba atnaujinu į 1.3 versiją, arba naudoju jų funkciją (su sąlyga, kad naujinimas nesukelia per daug problemų) arba naudokite šį siūlomą metodą tiesiogiai mano kode.

Labai ačiū už pasiūlymus.

73
20 апр. Atsakymą pateikė Andy McCluggage balandžio 20 d 2009-04-20 13:10 '09 13:10 2009-04-20 13:10

Yra daug sprendimų su visais savo sprendimais. Šiame puslapyje pateikiama gera apžvalga. Vienas galimas sprendimas:

 function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; } 
71
20 апр. Peter Smit atsakymas, pateiktas balandžio 20 d 2009-04-20 12:08 '09, 12:08 2009-04-20 12:08

Šiuolaikinėse naršyklėse (ir kai kuriose pasenusiose naršyklėse) galite tai padaryti

 Array.isArray(obj) 

(„Chrome“ 5, „Firefox 4.0“, „IE 9“, „Opera 10.5“ ir „Safari 5“ yra palaikomi )

Jei reikia palaikyti senesnes IE versijas, galite naudoti ES5 pamušalo polifilą Array.isArray; arba pridėkite šiuos

 # 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]'; } }; 

Jei naudojate jQuery, galite naudoti jQuery.isArray(obj) arba $.isArray(obj) . Jei naudojate pabraukimą, galite naudoti _.isArray(obj)

Jei jums nereikia aptikti įvairių rėmelių sukurtų matricų, galite naudoti tik instanceof

 obj instanceof Array 

Pastaba : arguments , kuriuos galima naudoti norint pasiekti funkcijų argumentą, nėra masyvas, nors jis (paprastai) veikia kaip visuma:

59
08 янв. Atsakymą pateikė Fela Winkelmolen 08 sausis 2014-01-08 10:37 '14 at 10:37 2014-01-08 10:37

Tai senas klausimas, tačiau su ta pačia problema aš rasiu labai elegantišką sprendimą, kurį norėčiau pasidalinti.

Prototipo pridėjimas prie masyvo leidžia jį labai paprasta.

 Array.prototype.isArray = true; 

Dabar, jei turite objektą, kurį norite išbandyti, patikrinkite, ar jam reikia masyvo, reikalingo naujam turtui patikrinti

 var box = doSomething(); if (box.isArray) { // do something } 

isArray yra prieinama tik tada, jei jos masyvas

53
25 окт. Atsakyti Ibu spalio 25 d. 2011-10-25 00:12 '11, 12:12, 2011-10-25 00:12

Via Crockford :

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

Pagrindinis „Crockford“ nuorodų trūkumas yra nesugebėjimas teisingai apibrėžti kitoje aplinkoje, pvz., window sukurtų matricų. Šiame puslapyje yra daug sudėtingesnė versija, jei to nepakanka.

45
20 апр. atsakymą pateikė Hank Gay 20 balandis. 2009-04-20 12:07 '09, 12:07 2009-04-20 12:07

Asmeniškai man patinka Petro pasiūlymas: ngn-wiki.ru.site/questions/990 / ... (ECMAScript 3 atveju. Naudokite „ECMAScript 5“ naudokite „ Array.isArray() )

Pranešimo komentarai rodo, kad jei visai pakeista toString() , šis masyvo patikrinimo metodas nepavyks. Jei tikrai norite būti konkretūs ir įsitikinti, kad toString() nebuvo pakeistas, ir nėra problemų su objekto klasės atributu ( [object Array] yra klasės atributas objektui, kuris yra masyvas), tada aš rekomenduoju daryti kažką panašaus :

 //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 an array //returns false if it passes test and it 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; } } 

Atminkite, kad javascript. Galutinis vadovas. 6-asis leidimas, 7.10, sako, kad „ Array.isArray() yra įdiegta naudojant „ Object.prototype.toString.call() į ECMAScript 5. Taip pat atkreipkite dėmesį, kad jei ketinate nerimauti dėl „ toString() įgyvendinimo pakeitimo, taip pat turėtumėte susirūpinimas ir dėl kiekvieno kito įterpto metodo. Kodėl naudoti push() ? Kažkas gali tai pakeisti! Toks požiūris yra kvailas. Pirmiau pateiktas patikrinimas yra siūlomas sprendimas tiems, kurie yra susirūpinę dėl toString() pakeitimų, bet manau, kad patikrinimas nėra būtinas.

26
03 дек. Atsakymą pateikė Brian 03 dec. 2011-12-03 06:17 '11 at 6:17 2011-12-03 06:17

Kai aš paskelbiau šį klausimą, jQuery versija, kurią naudoju, neįtraukė „ isArray funkcijos. Jei turėčiau tai, tikriausiai jį naudoju, manydamas, kad įgyvendinimas būtų geriausia naršyklė, nepriklausomas būdas atlikti šį konkretų tipo patikrinimą.

Kadangi jQuery dabar siūlo šią funkciją, aš visada ją naudosiu ...

 $.isArray(obj); 

(nuo 1.6.2 versijos) Jis vis dar įgyvendinamas naudojant eilutės palyginimus

 toString.call(obj) === "[object Array]" 
19
08 авг. atsakymą pateikė Andy McCluggage 08 rug . 2011-08-08 17:42 '11, 17:42, 2011-08-08 17:42

Jei tvarkote tik „EcmaScript 5“ ir naujesnę versiją, galite naudoti integruotą funkciją „ Array.isArray

Pavyzdžiui

 Array.isArray([]) // true Array.isArray("foo") // false Array.isArray({}) // false 
16
11 июля '13 в 17:05 2013-07-11 17:05 atsakymą pateikė JaredMcAteer liepos 11 d., 17:05 2013-07-11 17:05

Manau, pridėsiu dar vieną parinktį tiems, kurie jau gali naudoti „Underscore.js“ biblioteką. Underscore.js turi funkciją isArray () (žr. Http://underscorejs.org/#isArray ).

 _.isArray(object) 

Grąžinamas tiesa, jei objektas yra masyvas.

16
16 марта '12 в 10:50 2012-03-16 10:50 Benjeno atsakymą pateikė kovo 16 d. 12 val. 10:50 2012-03-16 10:50

Jei naudojate kampinį, galite naudoti funkciją angular.isArray ()

 var myArray = []; angular.isArray(myArray); // returns true var myObj = {}; angular.isArray(myObj); //returns false 

http://docs.angularjs.org/api/ng/function/angular.isArray

10
19 марта '14 в 11:40 2014-03-19 11:40 atsakymą pateikė joseph.l.hunsaker kovo 19, 14, 11:40 2014-03-19 11:40

„Crockford JavaScript“ gerose dalyse yra funkcija patikrinti, ar tam tikras argumentas yra masyvas:

 var is_array = function (value) { return value  typeof value === 'object'  typeof value.length === 'number'  typeof value.splice === 'function'  !(value.propertyIsEnumerable('length')); }; 

Jis paaiškina:

Pirmiausia prašome, ar tai teisinga. Tai darome, kad atmestume nulį ir kitas klaidingas vertybes. Antra, mes prašome, ar tipas yra „objekto“ reikšmė. Tai pasakytina apie objektus, masyvus ir (keistai) null. Trečia, mes klausiame, ar ilgio nuosavybė, kuri yra skaičius, turi vertę. Tai visada tinka matricoms, bet paprastai tai nėra objektams. Ketvirta, mes prašome, ar reikšme yra susiejimo metodas. Tai vėl bus tiesa visoms matricoms. Galiausiai, mes klausiame, ar ilgio nuosavybė yra skaičiuojama (ar ilgis bus sukurtas naudojant kilpą?). Tai bus klaidinga visoms matricoms. Tai patikimiausias masyvumo testas, kurį radau. Deja, taip sunku.

9
03 дек. Atsakymas, kurį pateikė Yunzhou 03 Dec 2013-12-03 06:44 '13, 6:44 2013-12-03 06:44

Žemiau pateiktas universalus sprendimas:

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

Pradedant nuo ECMAScript 5, formalus sprendimas yra:

 Array.isArray(arr) 

Be to, senesnėse „JavaScript“ bibliotekose galite rasti toliau pateiktą sprendimą, nors jis nėra pakankamai tikslus:

 var is_array = function (value) { return value  typeof value === 'object'  typeof value.length === 'number'  typeof value.splice === 'function'  !(value.propertyIsEnumerable('length')); }; 

Sprendimai iš http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript

5
11 янв. Atsakymas yra PixelsTech 11 sausis 2015-01-11 17:17 '15, 17:17, 2015-01-11 17:17

Naudoju šią eilutės kodą:

 if (variable.push) { // variable is array, since AMAIK only arrays have push() method. } 
4
06 янв. Saeed Neamati atsakymas yra 06 sausis 2013-01-06 11:01 '13, 11:01, 2013-01-06 11:01

nurodyta https://github.com/miksago/Evan.js/blob/master/src/evan.js

  var isArray = Array.isArray || function(obj) { return !!(obj  obj.concat  obj.unshift  !obj.callee);}; 
3
26 мая '11 в 16:08 2011-05-26 16:08 Atsakymas duotas didxga Gegužės 26, 11 d. 16:08 2011-05-26 16:08

w3schools :

 function isArray(myArray) { return myArray.constructor.toString().indexOf("Array") > -1; } 
2
29 марта '15 в 16:07 2015-03-29 16:07 „ Jahid“ atsakymą pateikė kovo 29 d. 15 d. 16:07 2015-03-29 16:07

Tiems, kurie koduoja golfą, nepatikimas testas su mažiausiai simbolių:

 function isArray(a) { return a.map; } 

Tai dažniausiai naudojama perkeliant / lyginant hierarchiją:

 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] 
2
24 окт. Joe Frambach atsakymas spalio 24 d 2013-10-24 21:43 '13, 21:43, 2013-10-24 21:43

Man patiko Briano atsakymas:

 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; } } 

bet galite tiesiog atlikti šiuos veiksmus:

 return Object.prototype.toString.call(o) === Object.prototype.toString.call([]); 
1
20 апр. atsakymas pateikiamas zeageorge 20 balandis. 2013-04-20 20:17 '13, 08:17 pm 2013-04-20 20:17

Manau, kad naudojant myObj.constructor == Objektą ir myArray.constructor == Array yra geriausias būdas. Tai beveik 20 kartų greitesnis nei naudojant toString (). Jei išplėsite objektus su savo konstruktoriais ir norite, kad šie kūriniai būtų laikomi „objektais“, tai neveikia, tačiau kitaip jo kelias yra greitesnis. typeof yra toks pat greitas, kaip konstruktoriaus metodas, bet tipo [] == „objektas“ grįžta tiesa, o tai dažnai yra nepageidaujama. http://jsperf.com/constructor-vs-tostring

Pažymėtina, kad „null.constructor“ pateikia klaidą, todėl, jei galite patikrinti nulines reikšmes, pirmiausia turite padaryti, jei (testThing! == null) {}

1
24 авг. atsakymą pateikė vartotojo1585789 24 rug . 2014-08-24 23:32 '14 ne 23:32 2014-08-24 23:32

Sukūriau šį mažą kodą, kuris gali grąžinti tikrus tipus.

Aš nesu tikras apie našumą, bet tai yra bandymas teisingai nustatyti tipą.

https://github.com/valtido/better-typeOf taip pat šiek tiek apie tai kalbėjo http://www.jqui.net/jquery/better-type--anan-the-javascript-native-typeof/

jis veikia kaip dabartinis tipas.

 var user = [1,2,3] typeOf(user); //[object Array] 

Jis mano, kad tai gali užtrukti šiek tiek truputį ir atsižvelgti į tai, ką aš nesu susidūriau, arba jų netikrinau. todėl yra palankūs tolesni patobulinimai, neatsižvelgiant į tai, ar jie yra veiksmingi, ar netinkamai pertvarko tipo „OO“.

1
28 июля '14 в 12:32 2014-07-28 12:32 atsakymas pateikiamas Val liepos 28 d. 14, 12:32 2014-07-28 12:32
 function isArray(x){ return ((x != null)  (typeof x.push != "undefined")); } 
-3
13 марта '13 в 10:12 2013-03-13 10:12 atsakymą davė Lajos Meszaros kovo 13 d. 13 val. 2013-03-13 10:12

Kadangi „.length“ turtas yra ypatingas „JavaScript“ masyvams, galite tiesiog pasakyti

 obj.length === +obj.length // true if obj is an array 

Šią trumpą ir paprastą triuką naudoja Underscorejs ir keletas kitų bibliotekų.

-5
02 марта '14 в 21:01 2014-03-02 21:01 atsakymas pateikiamas „ TypingTurtle“ kovo 2 d. 14 d. 21:01 2014-03-02 21:01

Ką ką tik atėjau:

if (item.length) //This is an array else //not an array

-16
13 февр. atsakymą pateikė trololol Feb 13 2015-02-13 02:01 '15 - 2: 01 : 2015-02-13 02:01

Peržiūrėkite kitus klausimus apie „ arba užduoti klausimą