Как Array.isArray понимает что массив не настоящий?

Как Array.isArray понимает что массив не настоящий?
spoiler
console.log(Array.isArray(Object.create(Array.prototype,{length:{value: 0, writable: true, enumerable: false, configurable: false}})))
console.log(Array.isArray([]))

Как исправить чтоб не понимал.
  • Вопрос задан
  • 400 просмотров
Решения вопроса 1
@wind-of
Существуют 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.
oxTSJyk.png

Кто такой этот ваш Array exotic object?
XVNqR99.png

Для сравнения, глянь реализации внутреннего свойства [[defineOwnProperty]] Array EO и String EO

Array.isArray() обмануть нельзя, но можно переопределить :)
Полезная информация (в частности о том, как можно частично сымитировать родное поведение Array.isArray) в первом ответе здесь.
Немного подробнее о том, что у каждого окна/фрейма свой собственный объект Array.

UPD:
Дополню ответ этим прекрасным комментарием:
VpEZ6yQ.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы