🧱 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 sinnew)
🎭 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()sinnew. - ❌ Evitá
new Boolean(false): produce un objeto truthy. - ❌ Evitá
new Function(): es comoeval(). - ✅ Para arrays, mejor
[]quenew Array(), excepto si necesitás definir tamaño inicial.
🔗 Recursos útiles
Deja un comentario