O'zgaruvchining JavaScript-da massiv ekanligini qanday tekshirish mumkin? [dublikat]

Men JavaScript-da o'zgaruvchi massiv yoki bitta qiymat ekanligini tekshirmoqchiman.

Men mumkin bo'lgan yechim topdim ...

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

Buni amalga oshirishning eng yaxshi usulimi?


person Andy McCluggage    schedule 20.04.2009    source manba
comment
Ob'ektni massiv bo'lishini tekshirishda ba'zi maxsus ogohlantirishlar mavjud ... Butrusning javobi siz foydalanishingiz kerak bo'lgan yagona javobdir.   -  person aleemb    schedule 20.04.2009
comment
@Andy Mening javobim eng yaxshi emasga o'xshaydi. Ehtimol, qabul qilinganidek, boshqa javobni tanlashingiz kerakmi?   -  person Peter Smit    schedule 07.08.2011
comment
Yaxshi fikr Piter. Sizning javobingiz shu kabi sharhlarni olganini tushunmadim. O'ylaymanki, men massivlarni tekshirishda JQuery.isArray funksiyasidan anchadan beri foydalana boshladim va qiziq tomoni bu erda berilgan boshqa javoblardan farqli ravishda amalga oshiriladi. Men mashhur javobni to'g'ri deb belgiladim.   -  person Andy McCluggage    schedule 08.08.2011
comment
Kechirasiz, bu noto'g'ri. Men biroz chuqurroq qaradim va (1.6.2 versiyasidan boshlab) JQuery hali ham shakldagi taqqoslashlar yordamida tekshiruvlarni yozmoqda.... toString.call(obj) === [object Array]   -  person Andy McCluggage    schedule 08.08.2011
comment
IE8-ni qo'llab-quvvatlash uchun men buni qilardim if ('push' in variable.__proto__), ba'zi var massiv yoki yo'qligini tekshirishning eng tez va eng yaxshi usuli.   -  person thednp    schedule 06.07.2015
comment
jsben.ch/#/QgYAV - eng keng tarqalgan usullarning benchmarki   -  person EscapeNetscape    schedule 24.10.2016
comment
stackoverflow.com/questions/4775722/check -if-object-is-array/   -  person shinobi    schedule 30.04.2017
comment
Bu savol avval ham berilgan edi... YO'Q, bu savol bundan keyin berilgan   -  person Dexygen    schedule 12.11.2017
comment
Yana, bu StackOverflow   -  person Peppa    schedule 27.07.2020


Javoblar (23)


O'zgaruvchining massiv ekanligini yoki yo'qligini tekshirishning bir necha usullari mavjud. Eng yaxshi yechim siz tanlaganingizdir.

variable.constructor === Array

Bu Chrome va boshqa barcha brauzerlarda eng tezkor usul. Barcha massivlar ob'ektlardir, shuning uchun konstruktor xususiyatini tekshirish JavaScript dvigatellari uchun tezkor jarayondir.

Agar siz obyektlar xususiyati massiv ekanligini aniqlashda muammoga duch kelsangiz, avval ushbu xususiyat mavjud yoki yo'qligini tekshirishingiz kerak.

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

Ba'zi boshqa usullar:

Array.isArray(variable)

2019-yilning 23-may kuni Chrome 75-ni yangilang, @AnduAndriciga o‘z savoli bilan bu savolni qayta ko‘rib chiqishga majbur qilganim uchun baqiring Bu oxirgisi, menimcha, eng xunuk va eng sekinlaridan biri. eng tez. Birinchi misol sifatida 1/5 tezlikda yugurish. Bu odam taxminan 2-5% sekinroq, lekin buni aytish juda qiyin. Foydalanish uchun mustahkam! Natijadan juda ta'sirlandi. Array.prototype, aslida massivdir. bu haqda batafsil ma'lumotni bu yerda o'qishingiz mumkin https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

variable instanceof Array

Bu usul birinchi misol sifatida 1/3 tezlikda ishlaydi. Hali ham juda mustahkam, yanada toza ko'rinadi, agar siz chiroyli kod haqida bo'lsangiz va unchalik unchalik unchalik emas. E'tibor bering, raqamlarni tekshirish ishlamaydi, chunki variable instanceof Number har doim false qaytaradi. Yangilanish: instanceof endi tezlikni 2/3 ga oshirdi!

Yana bir yangilanish

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

Bu yigit massivni tekshirish uchun eng sekin. Biroq, bu siz izlayotgan har qanday tur uchun yagona oyna. Biroq, siz massivni qidirayotganingiz uchun yuqoridagi eng tezkor usuldan foydalaning.

Bundan tashqari, men ba'zi testlarni o'tkazdim: http://jsperf.com/instanceof-array-vs-array-isarray/35 Shunday qilib, biroz zavqlaning va tekshiring.

Eslatma: jsperf.com ishlamay qolganligi sababli @EscapeNetscape boshqa test yaratdi. http://jsben.ch/#/QgYAV Men asl havola jsperf bo'lganda ham saqlanib qolishiga ishonch hosil qilmoqchi edim. Internetga qaytadi.

person jemiloii    schedule 29.10.2014
comment
Berilgan javobni kengaytirish uchun boshqa jsperf testini bu yerda xususiyat testidan (. push && .pop) bu eng tez va barcha brauzerlarda (hatto eskilarida ham) qo'llab-quvvatlanadi. Gap shundaki, ob'ekt massiv bo'lmagan holda "surish" va "pop" xususiyatlariga ega bo'lishi mumkin. Shuni ham yodda tutingki, agar massivni boshqa freymdan yaratilgan (yoki o'tkazilgan) ob'ekt bilan sinovdan o'tkazishda testlarning aksariyati muvaffaqiyatsiz bo'ladi (chunki berilgan oynadagi Masiv Arraydan farq qiladi. > ramka oynasida). Agar massiv yangi massiv orqali yoki tom ma'noda [..] sifatida tuzilgan bo'lsa, ushlash ham mavjud. - person Nikos M.; 15.12.2014
comment
Qizig'i shundaki, men yana bir qancha brauzer sinovini o'tkazishim kerak. Centos 7-dagi Chrome 38 konstruktorga qaraganda 10% tezroq push && pop-ga ega, ammo Windows 8-dagi Chrome 39 konstruktorga ega, chunki yaqin taqqoslash yo'q, chunki konstruktor push && pop-ga qaraganda 70% tezroq ishlaydi. Yana test kelishini kutaman, rahmat! - person jemiloii; 17.12.2014
comment
E'tibor bering, agar siz o'zgaruvchining aniqlanganligiga yoki u null bo'lishi mumkinligiga ishonchingiz komil bo'lmasa, avval ushbu tekshiruvlarni bajaring, chunki ular konstruktorga ega bo'lmagan umumiy qiymatlar/ob'ektlardir. - person Michael Scott Cuthbert; 12.01.2015
comment
Men faqat massiv qismiga e'tibor qaratdim. O'zgaruvchining null yoki aniqlanmaganligiga ishonch hosil qilish uchun siz osongina variable && variable.constructor === Array ga ega bo'lishingiz mumkin. - person jemiloii; 12.01.2015
comment
Qo'shimcha usullar: !!~variable.constructor.toString().indexOf('Array()'), variable.constructor.toString() == Array().constructor.toString() (ehtimol, biroz sekin bo'ladi) va Object.prototype.toString.call(variable) == '[object Array]' - person Ismael Miguel; 26.03.2015
comment
variable.constructor faqat haqiqiy massivlarni tekshirish uchun tezroq. Tasodifiy ob'ektlarni tekshirishda (va haqiqiy dunyoda bu shunday bo'ladi, chunki siz ushbu funktsiyadan foydalanasiz) instanceof dan foydalanish tezroq bo'ladi. jsperf.com/check-if-variable-is-array - person Dinu Sorin; 16.03.2016
comment
Centos 7 da Chrome 50.0.2657.0 dan foydalangan holda konstruktor men uchun hali ham tezroq. Bundan tashqari, konstruktor aniqlanmagan va nulldan tashqari hamma narsada ishlatilishi mumkin. Siz shunchaki variable && variable.constructor qilishingiz mumkin. Shuni ham ta'kidlash kerakki, 5 instanceof Number kutilganidek ishlamaydi. Prototipni qidirish misolida, raqamlar prototipga ega emas, agar siz uni o'rnatmasangiz. Raqamlarning konstruktorlari bor. - person jemiloii; 16.03.2016
comment
Yana bir g'alati eslatma sifatida, ` Object.prototype.toString.call(1) === '[ob'ekt raqami]';' - bu narsa. Javascript g'alati, shuning uchun raqamlarda prototiplar mavjud. Faqat instanceof ulardan foydalanmaydi. Bu g'alati, chunki MDN ma'lumotlariga ko'ra, uning yagona maqsadi ... - person jemiloii; 16.03.2016
comment
QAYD: 'variable.constructor === Array' o'zgaruvchi null bo'lsa, lekin 'array instanceof o'zgaruvchisi' bo'lmasa, EXCEPTION chiqaradi! - person GorvGoyl; 05.10.2016
comment
Agar qarasangiz, men variable && variable.constructor === Array misolini keltirdim - person jemiloii; 05.10.2016
comment
Array.isArray(variable) men uchun ham ishlamadi. Birinchisi juda yaxshi ishladi! - person awe; 20.09.2017
comment
@awe buni qaysi brauzerda ishlatasiz? - person jemiloii; 20.09.2017
comment
Siz e'lon qilgan JSPerf ma'lumotlariga ko'ra, Array.isArray eng tez emas, eng sekin emas - person Ferrybig; 25.09.2017
comment
qaysi brauzer va versiyadasiz? Men uchun, men tezda sinab ko'rgan Chrome/firefox, konstruktor hali ham eng tezkor, ammo faqat string massivlarida sezilarli yaxshilanish bor. Faqat qatorlar juda tezdir. Men ko'proq sinovlarni o'tkazaman. - person jemiloii; 25.09.2017
comment
Chrome 59 dan boshlab isArray() sezilarli darajada tezroq ko'rinadi, shuning uchun men barcha holatlarda isArray() dan foydalanmaslik uchun hech qanday sabab ko'rmayapman. - person Hedley Smith; 10.10.2017
comment
Asl savolda ishlash haqida gapirilmagan. Ushbu mikro optimallashtirishlar deyarli barcha foydalanish holatlari uchun ahamiyatsiz bo'ladi - person Drenai; 15.02.2018
comment
Ba'zi odamlar minimal o'rniga qo'shimcha ma'lumot berishni yoqtirishadi :) - person jemiloii; 18.02.2018
comment
Sizning barcha ko'rsatkichlaringiz noto'g'ri - chunki V8 (Chrome) JIT kompilyatorlarini o'zgartirdi va sizning ko'rsatkichlaringiz tegishli emas. Men sizga ishlash va ayniqsa jsperf haqida mraleph blogini ko'rib chiqishingizni tavsiya qilaman. JSPerf xuddi IC mavjud emas va funksiyaning morfizmi kompilyatorga taalluqli emas, amalda esa ishlash ko'rsatkichlari dvigatel nimani isbotlay olishiga qarab juda farq qiladi. - person Benjamin Gruenbaum; 06.07.2018
comment
variable.constructor === Array hali ham eng tez/eng samarali deb qabul qilingan javobmi? yoki variable instanceof Array yoki Array.isArray(variable) yanada hayotiy bo'lib qoldimi? -- so'rash, chunki javoblar/sharhlar ma'lum joylarda ancha eski. Juda ham minnatdorman :) - person Andu Andrici; 21.05.2019
comment
Ko'rish uchun testlarni o'tkazing, bir lahza kifoya qiladi. - person jemiloii; 23.05.2019
comment
@AnduAndrici Ha, Chrome'da Array.isArray() uchun yaxshi yangilanish bo'ldi. Endi ikkinchi eng tezkor variant. Qattiq! - person jemiloii; 23.05.2019
comment
Men @AnduAndricining savoliga javob bermoqchiman, chunki javobdan qaysi yechim eng samarali ekanligi endi aniq emas. - person Sebastian Gaweda; 17.07.2019
comment
bu aniq @SebastianGaweda, javobni o'qing. variable.constructor === Array Agar endi bunday bo'lmasa, men uni yangilagan bo'lardim va nima uchun yangilaganim sababini ko'rsatgan bo'lardim. - person jemiloii; 31.07.2019
comment
@jemiloii Men buni aniq bo'lishiga qo'shilmayman. Sizning yangilanishlaringiz aytilishicha, instanceof asl javob tezligining 2/3 qismini ishlaydi. Bu tezroq degani? Sekinroq? So'zda noaniqlik bor, garchi paragrafning konteksti sekinroq ekanligini ko'rsatsa ham. jsben.ch/QgYAV sahifasida kodni o'zgartirish orqali men o'zimning ba'zi sinovlarni o'tkazdim, ammo bu natijalar instanceof eng tez ekanligini ko'rsatdi. . Tegishli eslatmaga ko'ra, jsben.ch/QgYAV endi bo'sh benchmarkga havola qiladi. - person Sebastian Gaweda; 31.07.2019
comment
Ajoyib javob. Rahmat. - person Anjana Silva; 11.12.2019
comment
juda ko'p tahrirlar sizning javobingizni o'qib bo'lmaydi. Shuning uchun men past ovoz beraman ... - person Clint Eastwood; 27.01.2020
comment
Hammasi yaxshi, men yillar davomida JavaScript yangilanishini ko'rishdan zavqlanaman. - person jemiloii; 28.01.2020
comment
Agar siz javobingizni tahrir qilmoqchi bo'lsangiz, uni ilgari o'qimaganlar uchun o'qish uchun qulayroq qilish haqida o'ylab ko'ring. - person AtilioA; 11.06.2020

Siz ham foydalanishingiz mumkin:

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

Bu menga juda oqlangan yechim bo'lib tuyuladi, lekin har birining o'zi uchun.

Tahrirlash:

ES5 dan boshlab hozir ham mavjud:

Array.isArray(value);

Agar siz polifilllardan foydalanmasangiz (asosan... IE8 yoki shunga o'xshash) bu eski brauzerlarda buziladi.

person Brett Bender    schedule 20.04.2009
comment
Men taklif qilaman, agar siz bir nechta freymlar bilan ishlamasangiz, aslida ushbu instanceof operatoriga yopishib olishni talab qilaman. Bu ob'ekt turini tekshirishning to'g'ri usuli. - person BYK; 20.04.2009
comment
Agar siz Array instanceof Object == true dan beri massiv yoki ob'ektni sinab ko'rmoqchi bo'lsangiz, bu muvaffaqiyatsiz bo'lishi mumkin. - person Pierre; 29.11.2012
comment
Elementlarni find('code') yoki shunga o'xshash narsa bilan o'tkazish uchun jQuery'dan foydalansangiz, o'zgaruvchini variable instanceof Object bilan tekshirishni xohlaysiz, chunki u massivning namunasi emas. - person tuck; 01.05.2013
comment
@BYK fikrini mustahkamlash uchun bu faqat bitta ramkadagi ob'ektlar bilan ishlaydi. Agar siz bir nechta ramkalar bilan ishlayotgan bo'lsangiz, bunga ishonmang! - person Cory Klein; 25.09.2013
comment
Ba'zi hollarda ishlamaydi: Array.prototype instanceof Array; // false (to'g'ri bo'lishi kerak); shuningdek ({ __proto__ : Array.prototype }) instanceof Array; // true (noto'g'ri bo'lishi kerak) - person vortexwolf; 04.11.2013
comment
Men JS ichki qismlarini yaxshi bilmayman - prototip turi ob'ekt turi bilan bir xil bo'lishi kerakmi? - person Brett Bender; 04.11.2013
comment
@BrettBender Agar siz hali ham faol bo'lsangiz, ES5 dan boshlab bizda Array.isArray mavjudligini aks ettirish uchun javobingizni yangilashingiz mumkinmi? - person Nobbynob Littlun; 22.05.2014
comment
@AndrewK Array.isArray usuliga ega Fela Vinkelmolenning javobiga qarang. Bu javobga kelsak, javobni tahrirlash orqali boshqa javobga aylantirish yaxshi fikr emas. - person muffin; 25.08.2014
comment
Yoki eski brauzerlar sizni qiziqtirmasa, Array.isArray(arr) dan foydalanishingiz mumkin. - person Dominic; 13.10.2014
comment
Bu yaxshi, lekin variable.constructor === Massivdan foydalaning, JavaScript-dagi eng tezkor usul. jsperf.com/instanceof-array-vs-array-isarray - person jemiloii; 29.10.2014
comment
@muffin: nima uchun javobni besh yilga eskirib qo'yish o'rniga yaxshi fikr? Maʼlumki, koʻpchilik foydalanuvchilar javob ostidagi izohlarni (biz xohlagancha) oʻqimaydilar, u yoqda tursin, bu sharhlarning baʼzilari “Koʻproq koʻrsatish” ostida yashiringan. - person Dan Dascalescu; 04.12.2014
comment
@DanDascalescu Siz haqsiz, qimmatli ma'lumotlarni ko'mib qo'yish yaxshi emas. Lekin, menimcha, kimningdir javobini o'zgartirish, u endi bir xil javob bo'lib qolmaydi. Ehtimol, eng ko'p ovoz berilgan javobga tahrirlangan xabarnoma/ma'lumot qatorini qo'shish asl javobning yaxlitligiga xiyonat qilmaydigan tarzda foydali bo'lishi mumkin, ammo agar bu ko'rsatilgan chora bo'lsa, tizim uni ovoz berish bilan bir xil darajada birlashtirishi kerak. va javoblarni qabul qilish. Qanday bo'lmasin, men endi metani ko'rib chiqmayapman: javobning yaxlitligi bo'yicha konsensus nima ekanligini eslay olmayman. - person muffin; 04.12.2014
comment
Bu to'g'ri, chunki qiymat aniqlanmagan yoki null bo'lsa ham ishlaydi. - person James Nurse; 12.08.2015

Barcha o'ziga xos xususiyatlarga ega bo'lgan bir nechta echimlar mavjud. Ushbu sahifa yaxshi umumiy ma'lumot beradi . Mumkin bo'lgan yechimlardan biri:

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}
person Peter Smit    schedule 20.04.2009
comment
Agar siz diqqat bilan o'qib chiqsangiz, bu usul tavsiya etilmaydigan ko'p ramkali hujjatlar bilan ishlaganingizda kerak bo'ladi. Ushbu usul toString funktsiyasidagi ozgina o'zgarishlarni osonlik bilan bartaraf etishi mumkin. - person BYK; 20.04.2009
comment
Shuning uchun Brett ularni tekshirishi va qaysi holatda uning funksiyasi ishlashi kerakligini ko'rishi uchun havola berilgan - person Peter Smit; 20.04.2009
comment
Mening javobimni quyida ko'ring. Men Piter Smitning yo'lini tavsiya qilaman. - person Brian; 29.06.2012
comment
Bu usul Mozilla tomonidan tavsiya etilgan . - person Hank; 28.05.2015

Kimdir jQuery haqida gapirganini payqadim, lekin isArray() funksiyasi borligini bilmasdim. Ma'lum bo'lishicha, u 1.3 versiyasida qo'shilgan.

jQuery buni Piter taklif qilganidek amalga oshiradi:

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

JQuery-ga (ayniqsa, ularning brauzerlar o'rtasidagi moslashuv texnikasi) allaqachon katta ishonganimdan so'ng, men 1.3 versiyasiga yangilayman va ularning funksiyasidan foydalanaman (agar yangilash juda ko'p muammo tug'dirmasa) yoki ushbu tavsiya etilgan usuldan to'g'ridan-to'g'ri o'z sahifamda foydalanaman. kod.

Takliflar uchun katta rahmat.

person Andy McCluggage    schedule 20.04.2009
comment
Buning uchun ushbu maqolaga qarang. mavzu bo'yicha yaxshi muhokama. Xulosa - bu yechimdan foydalanish. - person Nick G.; 12.03.2014
comment
Bu menga IE10 da SCRIPT65535 xatosini beradi. - person polm23; 27.05.2014

Zamonaviy brauzerlarda (va ba'zi eski brauzerlarda) buni qilishingiz mumkin

Array.isArray(obj)

(Qo'llab-quvvatlanadi Chrome 5, Firefox 4.0, IE 9, Opera 10.5 va Safari 5)

Agar siz IE ning eski versiyalarini qoʻllab-quvvatlashingiz kerak boʻlsa, polifill massivi uchun es5-shim dan foydalanishingiz mumkin. .isArray; yoki quyidagilarni qo'shing

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

Agar jQuery dan foydalansangiz, jQuery.isArray(obj) yoki $.isArray(obj) dan foydalanishingiz mumkin. Agar pastki chiziqdan foydalansangiz, _.isArray(obj) dan foydalanishingiz mumkin

Agar siz turli freymlarda yaratilgan massivlarni aniqlashingiz shart bo'lmasa, siz shunchaki instanceof dan foydalanishingiz mumkin.

obj instanceof Array

Eslatma: funksiya argumentiga kirish uchun ishlatilishi mumkin boʻlgan arguments kalit soʻzi massiv emas, garchi u (odatda) oʻzini shunday tutsa ham:

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)

person Fela    schedule 08.01.2014
comment
Bu, ehtimol, eng zamonaviy yondashuv. Men uni MDN da polifill bilan birga ko‘rdim, shuning uchun Mozilla unga ishonadi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person John; 12.04.2014
comment
U yerda prototype yetishmayapsizmi? Object.prototype.toString.call bo'lishi kerak. - person Brock; 20.11.2014

onSelectRow ga uzatilgan id o'zgaruvchisi qator raqamidir. Ushbu jadval SQL qo'ng'irog'i ma'lumotlari asosida yaratilgan va har bir satr o'zining asosiy kalitiga ega. Foydalanuvchi qatorni bosganda, men bu kalitni olishim kerak. Mening fikrimcha, o'sha kalit bilan yashirin ustun qo'shish edi, lekin tableToGrid qo'ng'irog'ida colModel orqali ustunlarni yashirishga urinishda muammoga duch keldim.
person Ibu    schedule 24.10.2011
comment
bu menga juda zo'r tuyuladi! bu mahalliy bo'lishi mumkin. btw prototiplashdan oldin massiv yaratilgan bo'lsa ham ishlaydi? - person Vitim.us; 12.11.2011
comment
@Vitimtk Prototip haqiqiy ob'ekt uchun zaxira sifatida ishlaydi, shuning uchun bu massiv allaqachon mavjud bo'lsa ham ishlashi kerak. Albatta, manba liniyasi qayta ishlanmaguncha ishlamaydi. - person Markus Bruckner; 28.12.2011
comment
Hech kim qilmaydi, deb hisoblasak Object.prototype.isArray = true;! :( - person ErikE; 30.09.2012
comment
Esda tutingki, ES5 da Array.isArray usul (masalan, Array.isArray([1,2,3]) === true), shuning uchun @ErikE troll emas edi. Men bu javobdan qochgan bo'lardim, chunki u ba'zi zamonaviy brauzerlarda kodni buzadi. - person JaredMcAteer; 11.07.2013
comment
@JaredMcAteer sizning namunangiz to'g'ri. Biroq ErikE bu bog'liq emas, Array != [1,2,3] . Shunday qilib, siz hali ham mening yechimim bilan [1,2,3].isArray === true qilishingiz mumkin - person Ibu; 11.07.2013
comment
@Ibu va siz mening yechimim bilan {}.isArray === true ni qilishingiz mumkin, bu butun nuqta edi ... - person ErikE; 12.07.2013
comment
Ma'lumotlar turlari prototipini o'zgartirish menimcha yomon amaliyotdir - person BentOnCoding; 24.09.2014
comment
@BentOnCoding Array.prototype["com.my.unique.name"].isArray haqida nima deyish mumkin;) - person SOFe; 28.12.2018

Krokford orqali:

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

Krokford eslatib o'tgan asosiy muvaffaqiyatsizlik - bu boshqa kontekstda yaratilgan massivlarni to'g'ri aniqlashning mumkin emasligi, masalan, window. Agar bu etarli bo'lmasa, bu sahifada ancha murakkab versiya mavjud.

person Hank Gay    schedule 20.04.2009

Agar siz faqat EcmaScript 5 va undan yuqori versiyalar bilan ishlayotgan bo‘lsangiz, o‘rnatilgan Array.isArray funksiyasidan foydalanishingiz mumkin.

e.g.,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false
person JaredMcAteer    schedule 11.07.2013

Menga shaxsan Piterning taklifi yoqadi: https://stackoverflow.com/a/767499/414784 (ECMAScript 3 uchun. ECMAScript uchun 5, Array.isArray() dan foydalaning)

Postdagi izohlar shuni ko'rsatadiki, agar toString() umuman o'zgartirilsa, massivni tekshirishning bu usuli muvaffaqiyatsiz bo'ladi. Agar siz haqiqatan ham aniq bo'lishni istasangiz va toString() o'zgartirilmaganiga ishonch hosil qilishni istasangiz va ob'ektlar sinfi atributida hech qanday muammo bo'lmasa ([object Array] massiv bo'lgan ob'ektning sinf atributidir), unda men shunday qilishni tavsiya qilaman:

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

Esda tutingki, JavaScript-ning Aniq qo'llanma 6-nashri, 7.10, unda Array.isArray() ECMAScript 5 da Object.prototype.toString.call() yordamida amalga oshirilganligi aytiladi. Shuni ham yodda tutingki, agar siz toString() ilovasining o'zgarishi haqida qayg'urmoqchi bo'lsangiz, boshqa o'rnatilgan usullarning o'zgarishi haqida ham tashvishlanishingiz kerak. . Nima uchun push() dan foydalaniladi? Kimdir uni o'zgartirishi mumkin! Bunday yondashuv ahmoqdir. Yuqoridagi tekshiruv toString() o'zgarishidan xavotirda bo'lganlar uchun taklif qilingan yechimdir, lekin men chekni keraksiz deb hisoblayman.

person Brian    schedule 03.12.2011
comment
ECMAScript 5 standartida yaxshi qo'ng'iroq. Brauzer uni qo‘llab-quvvatlashiga kafolat bera olmaysiz, lekin bu yangi kodni tekshirishning birinchi usuli bo‘lishi kerak. - person styfle; 14.12.2012
comment
Bu mening boshimdan biroz oshib ketganligini aytish bilan boshlayman. Biroq, bunday sinov yanada mustahkamroq bo'larmidi?: return Object.prototype.toString.call(o) === Object.prototype.toString.call([]); - person Grant Lindsay; 24.06.2014

Men ushbu savolni yuborganimda, men foydalanadigan JQuery versiyasi isArray funksiyasini o'z ichiga olmaydi. Agar shunday bo'lganida, men uni ushbu dastur turini tekshirishning eng yaxshi brauzer mustaqil usuli ekanligiga ishongan holda ishlatgan bo'lardim.

JQuery hozir ushbu funktsiyani taklif qilgani uchun men uni har doim ishlatardim ...

$.isArray(obj);

(1.6.2 versiyasi bo'yicha) U hali ham shakldagi satrlardagi taqqoslashlar yordamida amalga oshirilmoqda

toString.call(obj) === "[object Array]"
person Andy McCluggage    schedule 08.08.2011

Underscore.js kutubxonasidan skriptda foydalanayotganlar uchun yana bir variantni qo'shishni o'yladim. Underscore.js isArray() funksiyasiga ega (qarang: http://underscorejs.org/#isArray).

_.isArray(object) 

Ob'ekt massiv bo'lsa, true qiymatini qaytaradi.

person Benjen    schedule 16.03.2012
comment

CSS va JQuery bilan gorizontal vaqt jadvalini yaratish uchun JSFiddle ni birlashtirdim. Vaqt jadvalining harakati quyidagicha:

Sahifa yuklanganda, "timelineSlider" har doim o'zini "1-havola" ostida joylashtiradi. “Bog‘lanish” deb nomlangan har bir ro‘yxat bandini bosgandan so‘ng, “timelineSlider” o‘sha ro‘yxat elementi tomon va ostida siljiydi.

Hozirda foydalanuvchi Link1, Link2, Link3 va keyin Link4 ni bosganida u ketma-ket ishlaydi. Lekin men foydalanuvchi istalgan tartibda roʻyxat bandini bosishini istardim va “timelineSlider” “timelineSlider” ning oldingi holatiga qarab oʻngga yoki chapga siljishi yoki oʻrnini oʻzgartirmasligi kerak. Buni amalga oshirish uchun JS kodimni qanday o'zgartirishim mumkin?

JSFiddle

$(document).ready(function() {
  $("li").click(function() {
    //Get Initial timelineSlider Margin
    var timelineSliderMargin = parseInt($('.timelineSlider').css('margin-left'));
    //Slide the box to the link clicked (left or right) depending on box position
    $(".timelineSlider").animate({
      'margin-left': (parseInt(calculate(0)) + parseInt($('.timelineSlider').css('margin-left'))) + 'px'
    });
  });
});

function calculate(i) {
  var sum = 0;
  for (var j = 0; j <= i; j++) {
    sum = sum + $("ul li:eq(" + j + ")").outerWidth(true);
  }
  return sum;
}
div.eventsWrapper {
  height: 75px;
  margin-left: 5px;
  position: absolute;
  width: 800px;
}
.eventsConnector {
  background: #0070c0 none repeat scroll 50% 50%;
  height: 3px;
  left: 0;
  margin-left: 185px;
  margin-top: -31px;
  position: absolute;
  transition: transform 0.4s ease 0s;
  width: 512px;
  z-index: -1;
}
#events {
  z-index: 2;
}
#events ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
}
#events li {
  display: inline-block;
}
#events a {
  display: block;
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 5px #0070c0 solid;
  text-transform: uppercase;
  text-decoration: none;
  font-size: 15px;
  text-align: center;
  line-height: 50px;
  margin-left: 125px;
  z-index: 3;
  color: #666666;
  background-color: #0070c0;
}
#events a .event {
  background-color: #ffffff;
  border: 1px solid #ffffff;
  border-radius: 50%;
  color: #666666;
  display: block;
  font-size: 15px;
  height: 48px;
  margin-left: 0;
  margin-top: 0;
  position: relative;
  text-align: center;
  text-decoration: none;
  text-transform: uppercase;
  width: 48px;
  z-index: 4;
}
.timelineSlider {
  width: 110px;
  height: 66px;
  border: 0px;
  margin-left: 95px;
  margin-top: 10px;
  position: absolute;
  z-index: 2;
  background-color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<div class="eventsWrapper">
  <div id="events">
    <ul>
      <li>
        <a href="/uz#1">
          <div class="event">LINK1</div>
        </a>
      </li>
      <li>
        <a href="/uz#2">
          <div class="event">LINK2</div>
        </a>
      </li>
      <li>
        <a href="/uz#3">
          <div class="event">LINK3</div>
        </a>
      </li>
      <li>
        <a href="/uz#4">
          <div class="event">LINK4</div>
        </a>
      </li>
    </ul>
  </div>
  <div class="eventsConnector"></div>
  <div class="timelineSlider">Slide this box to the link clicked.</div>
</div>

- person Kris; 24.04.2014
comment
Xuddi shu funksiya Lodashda ham mavjud - person Jundiaius; 13.04.2016

Agar siz Angular dan foydalansangiz, angular.isArray() funksiyasidan foydalanishingiz mumkin

var myArray = [];
angular.isArray(myArray); // returns true

var myObj = {};
angular.isArray(myObj); //returns false

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

person joseph.l.hunsaker    schedule 19.03.2014
comment
Siz Angular-ga xos bo'lmagan, faqat IE9+ va barcha standart brauzerlardan foydalanishingiz mumkin: ‹pre›‹code› Array.isArray(myArray); //to'g'ri qaytaradi Array.isArray(myObj); //soxta ‹/code› ‹/pre› qaytaradi - person PDA; 17.07.2014

Crockfordning JavaScript The Good Parts da berilgan argument massiv ekanligini tekshirish funksiyasi mavjud:

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

U tushuntiradi:

Birinchidan, biz qiymat haqiqat yoki yo'qligini so'raymiz. Biz buni null va boshqa noto'g'ri qiymatlarni rad etish uchun qilamiz. Ikkinchidan, biz qiymat turi "ob'ekt" yoki yo'qligini so'raymiz. Bu ob'ektlar, massivlar va (g'alati) null uchun to'g'ri bo'ladi. Uchinchidan, qiymatning raqam bo'lgan uzunlik xususiyati bor yoki yo'qligini so'raymiz. Bu har doim massivlar uchun to'g'ri bo'ladi, lekin odatda ob'ektlar uchun emas. To'rtinchidan, biz qiymatda birlashma usuli bor yoki yo'qligini so'raymiz. Bu yana barcha massivlar uchun to'g'ri bo'ladi. Nihoyat, biz uzunlik xususiyati sanab bo'ladimi yoki yo'qligini so'raymiz (uzunlik for in loop tomonidan ishlab chiqariladimi?). Bu barcha massivlar uchun noto'g'ri bo'ladi. Bu men topgan massivlik uchun eng ishonchli test. Bu juda murakkab ekanligi achinarli.

person Yunzhou    schedule 03.12.2013
comment
Va bu faqat yaxshi tomonlar edi. Tasavvur qiling-a, JavaScript The Bad Parts qachon nashr etiladi... - person FrancescoMM; 30.01.2017

Universal yechim quyida keltirilgan:

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

ECMAScript 5 dan boshlab, rasmiy yechim:

Array.isArray(arr)

Bundan tashqari, eski JavaScript kutubxonalari uchun siz quyidagi yechimni topishingiz mumkin, ammo u etarlicha aniq emas:

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

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

person PixelsTech    schedule 11.01.2015

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);};
person didxga    schedule 26.05.2011
comment
Nega concat va unshift ni sinab ko'rasiz, unshift uchun test qilish etarli emasmi? - person Marco Demaio; 18.02.2014
comment
Massivda harakat borligini qancha ko'p usullar bilan tekshirsak, bu haqiqatan ham massivdir. Boshqa ob'ektlarda concat yoki unshift bo'lishi mumkin, lekin ikkalasiga ham ega bo'lish ehtimoli kamroq. - person Kris; 24.04.2014

Men ushbu kod qatoridan foydalanardim:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}
person Saeed Neamati    schedule 06.01.2013
comment
Bu umuman yaxshi yechim emas. Ushbu yechim bilan push xossasi haqiqatga to'g'ri keladigan har qanday ob'ekt Massiv hisoblanadi. - person teleclimber; 28.04.2014

Kod-golf bilan shug'ullanadiganlar uchun, eng kam belgilar bilan ishonchsiz sinov:

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

Bu odatda ierarxiyani kesib o'tish/tekislashda qo'llaniladi:

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]
person Joe Frambach    schedule 24.10.2013

w3schools dan:

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}
person Jahid    schedule 29.03.2015

Menga Brayanning javobi yoqdi:

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

lekin siz shunday qilishingiz mumkin:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);
person zeageorge    schedule 20.04.2013

Men haqiqiy turlarni qaytarishi mumkin bo'lgan ushbu kichik kodni yaratdim.

Men ishlashga hali ishonchim komil emas, lekin bu turini to'g'ri aniqlashga urinish.

https://github.com/valtido/better-typeOf bu yerda ham bu haqda bir oz blog yozgan http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

u joriy typeofga o'xshab ishlaydi.

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

Bu biroz nozik sozlashni talab qilishi mumkin deb o'ylaydi va narsalarni hisobga olgan holda, men uni to'g'ri uchratmadim yoki sinab ko'rmadim. Shunday qilib, ish unumdorligi bo'ladimi yoki typeOfni noto'g'ri qayta ko'chirish bo'ladimi, keyingi yaxshilanishlar mamnuniyat bilan qabul qilinadi.

person Val    schedule 28.07.2014

Menimcha, myObj.constructor==Object va myArray.constructor==Array dan foydalanish eng yaxshi usul. Bu toString() dan deyarli 20 baravar tezroq. Agar siz ob'ektlarni o'zingizning konstruktorlaringiz bilan kengaytirsangiz va bu ijodlar ham "ob'ektlar" deb hisoblanishini xohlasangiz, bu ishlamaydi, aksincha, tezroq yo'l. typeof konstruktor usuli kabi tezdir, lekin typeof []=='object' rost qiymatini qaytaradi, bu ko'pincha istalmagan bo'ladi. http://jsperf.com/constructor-vs-tostring

Shuni ta'kidlash kerakki, null.constructor xatoga yo'l qo'yadi, shuning uchun agar siz null qiymatlarni tekshirayotgan bo'lsangiz, avval if(testThing!==null) qilishingiz kerak bo'ladi{}

person user1585789    schedule 24.08.2014

.length xossasi javascriptdagi massivlar uchun maxsus bo'lgani uchun siz shunchaki aytishingiz mumkin

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

Underscorejs va boshqa bir qancha kutubxonalar bu qisqa va oddiy hiyladan foydalanadilar.

person TypingTurtle    schedule 02.03.2014
comment
Buning qanday ishlashini tushuntirib bera olasizmi? Asosan, "+" nima qiladi? - person Andy McCluggage; 03.03.2014
comment
Bu yaxshi, lekin ob'ekt funksiya yoki satr, shuningdek, turdagi raqamning xossa uzunligiga ega bo'lgan boshqa ob'ekt bo'lsa ham to'g'ri. Nega? Xo'sh, unary + operatori aslida o'zgaruvchini raqam sifatida chiqaradi. Shunday qilib, ular obj.length raqam ekanligini tekshiradilar. [object Object] ning xossa uzunligi yo'q, u aniqlanmagan, shuning uchun undefined raqam sifatida chiqarsangiz, u NaN ga aylanadi, yuqoridagi tekshirish noto'g'ri bo'lib chiqadi. Demak, agar ob'ekt xossasining uzunligi massivlar, satrlar va funktsiyalarda to'g'ri bo'lgan raqam bo'lsa, u true qiymatini qaytaradi. Pastki chiziq bundan ham ko'proq narsani qilishi kerak. - person John; 12.04.2014

Men hozirgina o'ylab topgan narsam:

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

person trololol    schedule 12.02.2015
comment
var item = 'bu_massiv_emas'; - person kev; 06.03.2015
comment
Bu yomon yechim! Ipning ham uzunligi bor. - person pmrotule; 09.03.2015
comment
Aslida satr belgilar majmuasidir, shuning uchun aslida bu ishlaydi - person Shingala94; 13.03.2015
comment
@PatrickNijhuis - string javascriptda ibtidoiy tur, massiv esa ob'ekt. Umumiy tilda siz to'g'risiz - string belgilar qatoridir - lekin JavaScriptda bu tasdiq noto'g'ri. Bu muhim farq va bu yomon javobning sababi. - person wahwahwah; 27.03.2015
comment
Yo'q, nol uzunlikdagi massiv hali ham massivdir. - person Dave Burton; 14.08.2016
comment
typeof item == "ob'ekt" ni qo'yishingiz mumkin va javob maqbul bo'lishi mumkin - person Abz Rockers; 31.08.2017
comment
eng muhimi: bo'sh massiv bu testdan o'tolmaydi, chunki 0 noto'g'ri - person David Schumann; 26.03.2020