JS'deki nesnelerin tür kontrolü instanceof, örn.
obj instanceof Array
Her karenin kendi Arraynesnesi olduğundan, nesne kare sınırlarının ötesine geçirilirse bu çalışmaz . Nesnenin dahili [[Class]] özelliğini kontrol ederek bu sorunu çözebilirsiniz . Bunu elde etmek için kullanın Object.prototype.toString()(bunun ECMA-262 tarafından çalışması garantilidir):
Object.prototype.toString.call(obj) === '[object Array]'
Her iki yöntem de yalnızca gerçek diziler için çalışır ve argumentsnesne veya düğüm listeleri gibi dizi benzeri nesneler için çalışmaz . Dizi benzeri tüm nesnelerin sayısal bir lengthözelliği olması gerektiğinden, bunları şu şekilde kontrol ederim:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Dizelerin bu denetimi geçeceğini ve IE'nin dizinin karakterlerine dizine göre erişime izin vermemesi nedeniyle sorunlara yol açabileceğini lütfen unutmayın. Bu nedenle, değiştirmek isteyebilirsiniz typeof obj !== 'undefined'üzere typeof obj === 'object'farklı türleri ile ilkeller ve ana nesneleri dışlamak için 'object'alltogether. Bu, yine de manuel olarak dışarıda bırakılması gereken dize nesnelerinin geçmesine izin verecektir.
Çoğu durumda, aslında bilmek istediğiniz şey, sayısal indeksler aracılığıyla nesne üzerinde yineleme yapıp yapamayacağınızdır. Bu nedenle, nesnenin 0bunun yerine adlandırılmış bir özelliğe sahip olup olmadığını kontrol etmek iyi bir fikir olabilir, bu şu kontrollerden biriyle yapılabilir:
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
Nesneye çevrim, dizi benzeri ilkellerin (yani dizelerin) doğru çalışması için gereklidir.
JS dizileri için sağlam denetimler için kod:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
ve yinelenebilir (yani boş olmayan) dizi benzeri nesneler:
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}