Javascript Avanzado VII

🧱 Funciones constructoras nativas: ¿cuándo new es un problema? En JavaScript existen funciones nativas que podés usar de dos maneras: Como funciones simples (por ejemplo: String(«hola»)) O como constructores (por ejemplo: new String(«hola»)) Ejemplos de funciones constructoras nativas: String() Number() Boolean() Array() Object() Function() RegExp() Date() Symbol() (⚠️ solo sin…

🧱 Funciones constructoras nativas: ¿cuándo new es un problema?

En JavaScript existen funciones nativas que podés usar de dos maneras:

  • Como funciones simples (por ejemplo: String("hola"))
  • O como constructores (por ejemplo: new String("hola"))

Ejemplos de funciones constructoras nativas:

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Symbol() (⚠️ solo sin new)

🎭 Diferencia entre usar String() y new String()

let a = new String("Hello World");
typeof a;         // "object"
a === "Hello World"; // false

let b = String("Hello World");
typeof b;         // "string"
b === "Hello World"; // true

¿La diferencia? String() devuelve un valor primitivo, mientras que new String() devuelve un objeto wrapper. Lo mismo sucede con Number y Boolean.

Consejo: salvo en casos muy específicos, usá la versión sin new.


⚠️ Peligro: new Boolean(false)

if (new Boolean(false)) {
  console.log("¡Esto es true!");
}

Esto se ejecuta porque new Boolean(false) crea un objeto, y en JavaScript todos los objetos son truthy. ¡Incluso si el valor interno es false!


🔮 ¿Y qué pasa con new Function()?

let sum = new Function("a", "b", "return a + b;");
sum(2, 3); // 5

Esta forma de crear funciones existe, pero NO es recomendable, ya que:

  • Evalúa el código en el scope global, no en el actual.
  • Se comporta como una especie de eval().
  • Rompe el acceso al contexto léxico actual.

En resumen: usá function o funciones flecha siempre que puedas.


🧠 Sobre typeof y Object String

Los objetos primitivos devueltos por new tienen una propiedad interna llamada [[Class]] que determina su tipo interno, accesible con:

Object.prototype.toString.call(new String("abc"));
// "[object String]"

Esto puede ser útil para detectar tipos reales cuando typeof te devuelve simplemente «object».


📌 En resumen

  • ✅ Usá String(), Number(), Boolean() sin new.
  • ❌ Evitá new Boolean(false): produce un objeto truthy.
  • ❌ Evitá new Function(): es como eval().
  • ✅ Para arrays, mejor [] que new Array(), excepto si necesitás definir tamaño inicial.

🔗 Recursos útiles

+

Deja un comentario