Существуют
ordinary objects и
exotic objects.
exotic objects— это всё, что не является ordinary object
У каждого exotic object есть свои особенности реализации, по которым можно определить, с каким именно exotic object мы имеем дело. Как говорит спека:
This specification recognizes different kinds of exotic objects by those objects' internal methods. An object that is behaviourally equivalent to a particular kind of exotic object (such as an Array exotic object or a bound function exotic object), but does not have the same collection of internal methods specified for that kind, is not recognized as that kind of exotic object.
Абстрактная операция
isArray(), используемая для того, чтобы определить, является ли argument array exotic object.
Кто такой этот ваш Array exotic object?
Для сравнения, глянь реализации внутреннего свойства [[defineOwnProperty]]
Array EO и
String EO
Array.isArray() обмануть нельзя, но можно переопределить :)
Полезная информация (в частности о том, как можно частично сымитировать родное поведение Array.isArray) в первом ответе
здесь.
Немного подробнее о том, что
у каждого окна/фрейма свой собственный объект Array.
UPD:
Дополню ответ этим прекрасным комментарием: