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?
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?
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.
variable && variable.constructor === Array
ga ega bo'lishingiz mumkin.
- person jemiloii; 12.01.2015
!!~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
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
instanceof
ulardan foydalanmaydi. Bu g'alati, chunki MDN ma'lumotlariga ko'ra, uning yagona maqsadi ...
- person jemiloii; 16.03.2016
variable && variable.constructor === Array
misolini keltirdim
- person jemiloii; 05.10.2016
Array.isArray(variable)
men uchun ham ishlamadi. Birinchisi juda yaxshi ishladi!
- person awe; 20.09.2017
Array.isArray
eng tez emas, eng sekin emas
- person Ferrybig; 25.09.2017
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
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
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
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.
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
variable instanceof Object
bilan tekshirishni xohlaysiz, chunki u massivning namunasi emas.
- person tuck; 01.05.2013
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
Array.isArray(arr)
dan foydalanishingiz mumkin.
- person Dominic; 13.10.2014
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]';
}
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.
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)
prototype
yetishmayapsizmi? Object.prototype.toString.call
bo'lishi kerak.
- person Brock; 20.11.2014
Object.prototype.isArray = true;
! :(
- person ErikE; 30.09.2012
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
{}.isArray === true
ni qilishingiz mumkin, bu butun nuqta edi ...
- person ErikE; 12.07.2013
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.
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
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.
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]"
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.
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?
$(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>
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
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.
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
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);};
concat
va unshift
ni sinab ko'rasiz, unshift
uchun test qilish etarli emasmi?
- person Marco Demaio; 18.02.2014
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.
}
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]
w3schools dan:
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
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([]);
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.
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{}
.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.
Men hozirgina o'ylab topgan narsam:
if (item.length)
//This is an array
else
//not an array
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