¿Todo en JavaScript es un objeto?

Hace unos días, un seguidor de Laserants.com, hizo la pregunta de si una función era un objeto. Mi respuesta fue en torno a explicar cómo casi todo es un objeto en JavaScript. He acá una clasificación de los types en JavaScript:

  • Primitivos (cadena, número, nulo, booleano, indefinido, símbolo): estos son tipos de datos inmutables. No son objetos, no tienen métodos y se almacenan en memoria por valor.
  • No primitivos (funciones, matrices y objetos): estos son tipos de datos mutables. Son objetos y se almacenan en memoria por referencia.

##¿Qué es un objeto? La clase Object representa uno de los tipos de datos de JavaScript. Se utiliza para almacenar varias colecciones con clave y entidades más complejas. Podemos decir que en JavaScript, un objeto es un entidad independiente con propiedades y tipos.

Para crear un objeto podemos hacer algo como esto:

const obj = {
  propiedad1: 'Valor 1',
  propiedad2: 'Valor2'
}

Ahora vamos a añadir una nueva propiedad al objeto

obj.propiedad3 = 'Valor 3';

Arrays como objetos

Un array es un objeto en JavaScript, y lo podemos demostrar de dos formas:

  1. Usando typeof:
var a = [1,2,3];
console.log(typeof a);  // Salida: 'object'
  1. Añadiendo más propiedades o claves
const arr = [1,2,3];
arr.saludar = () => console.log("hola");  // Añadiendo la propiedad saludar al objeto arr.

console.log(arr.length); // Salida: 3
console.log(arr.saludar); // Salida: hola
console.log(arr); // Salida: (3) [1, 2, 3, saludar: ƒ]

Funciones como Objeto

Ahora veamos el caso de un Array con este ejemplo, primero crearemos una función

function saludar() {
  console.log("Hola!");
}

Ahora le añadiremos más propiedades

saludar.nombre = "Fernando"; 
saludar.conNombre = function() {
    console.log(`Hola, ${this.nombre}!`)
}

Imprimamos unos logs

saludar() // Salida: Hola!
console.log(saludar.nombre); // Salida: Fernando
saludar.conNombre() // Salida: Hola, Fernando!

String

Existen tipos de datos no-primitivos, que son objetos, y que tienen su alternativa primitiva, entre estos tenemos el String (nótese la mayúscula en la S). Veamos un ejemplo de como un String puede ser un objeto

const nombrePrimitivo = "Carlos";
const nombreNoPrimitivo = new String("Fernando");

Intentando añadir propiedades a ambos objetos

nombrePrimitivo.apellido = "Arias";
nombreNoPrimitivo.apellido = "Barrios";

Añadiendo logs

console.log(nombrePrimitivo); // Salida: Carlos
console.log(nombrePrimitivo.apellido); // Salida: undefined
console.log(typeof nombrePrimitivo); // Salida: string

console.log(nombreNoPrimitivo); // Salida: String {'Fernando', apellido: 'Barrios**'}
console.log(nombreNoPrimitivo.apellido); // Salida: 'Barrios'
console.log(typeof nombreNoPrimitivo); // Salida: object