Arrays em JS são Objetos

← ← ←   5/2/2022, 7:03:57 PM | Posted by: Felippe Regazio


Você já observou que o tipo de um Array em JS é "object"?

typeof [] === typeof {} // true
typeof []  // 'object'
typeof {} // 'object'

Ou seja, um array é um objeto?

Então: SIM. Segue a thread aqui que eu vou explicar porque isso é assim e como um array funciona na runtime 🤓

A primeira coisa que precisamos entender é que um Array não é um tipo, ele é uma estrutura de dados.

Um Array é uma Estrutura de Lista que pode se comportar como LIFO ou FIFO (veja os metodos pop & shift por ex).

A segunda coisa que precisamos entender é que em JavaScript QUASE tudo é objeto:

Temos os seguintes tipos primitivos: number , string , boolean , null , undefined , symbol and bigint. Todo o resto é um do tipo complexo: "object".

Ou seja um Array não pode ser de tipo primitivo - porque ele é um Array (duhhr nao diga rs). Mas os tipos complexos em JS são sempre objetos, então o Array só pode ser um objeto. E de fato é!

O array é um Objeto com prototype e metodos que constoem uma estrutura de dados pra vc

Qdo vc escreve:

const a = [ 'a', 'b', 'c' ];

A runtime entende

const a = {
  0: 'a', 
  1: 'b',
  2: 'c', 
  length: 3,
  __prototype___
};

Essa estrutura é acoplada ao prototype array que tem getters, setters, metodos como pop, shift, map, etc... pra facilitar sua vida.

Por exemplo, abaixo está a implementação dummy de um objeto ao estilo Array que tem somente o método push e a propriedade length.

usamos o Object.create pra definir o prototype dele como quisermos e voilá, temos (grosseiramente falando) um """Array""":

Code image 1

Ou, se vc quiser ser o espertão/tona e reaproveitar o prototype que o JS deixou pronto, vc cria um objeto e diz que o prototype dele é o mesmo de um Array, e voilá: Vc terá um Array. Juro ó:

Code image 2

Então como saber se um Array é um Array mesmo em JS? Você usa o método:

Array.isArray([]); // true
Array.isArray({}); // false

Mas como tal bruxaria é possível? Agora que vc sabe como o maquinario funciona, vc intui que isso é um metodo no prototype que verifica isso pra vc

Concluindo: Um array é uma estrutura nativa em JS de lista LIFO/FIFO do tipo Objeto que contem em seu prototype metodos e propriedades que facilitam sua vida ao lidar com listas e tudo isso junto é um: Array. Como isso é implementado nativamente, convenciona-se a notação: [].