Publicada la versión 7.6.0: Accesores estáticos privados y sintaxis intrínseca de V8
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
¡Acabamos de publicar una nueva versión menor de Babel!
Incluye soporte para accesores estáticos privados en clases y soporte en el parser para la sintaxis intrínseca de V8. También corregimos varios problemas persistentes relacionados con el manejo de TDZ (Zona Muerta Temporal) y mejoramos el soporte para expresiones do. Puedes leer el registro de cambios completo en GitHub.
¡Gracias a Serhii Muryhin, Ashwin Ramaswami, Sungmin Lee, Serge Havas, Ziad El Khoury Hanna, Even Alander, Shrey Banga, Dylan Kirkby, Ajay Sagar, Adam Ramberg y Bin Xin por sus primeras PRs! (Y también gracias a Codetriage README Bot y dependabot 🤖)
Bloomberg continúa patrocinando la implementación de nuevas características de clases en Babel: después de proporcionarnos muchas funciones nuevas para clases (campos estáticos privados, métodos de instancia privados, accesores de instancia privados y métodos estáticos privados), ¡acaban de implementar getters y setters estáticos privados!
¡Otro gran reconocimiento para Frontend Masters por realizar dos importantes donaciones el mes pasado, así como a todos nuestros otros patrocinadores que permiten al equipo de Babel dedicar más tiempo al proyecto!
Si tú o tu empresa quieren apoyar a Babel y la evolución de JavaScript pero no están seguros de cómo hacerlo, pueden donar en OpenCollective y, mejor aún, ¡trabajar directamente con nosotros en la implementación de nuevas propuestas de ECMAScript! Como proyecto impulsado por voluntarios, dependemos del apoyo de la comunidad tanto para financiar nuestros esfuerzos en soportar la amplia gama de usuarios de JavaScript como para asumir la responsabilidad del código. Contacta a Henry en henry@babeljs.io si quieres conversar más al respecto.
Accesores estáticos privados (getters y setters) (#10217)
class Resource {
static #loaderInstance = null;
static get #loader() {
if (!this.#loaderInstance) this.#loaderInstance = new Loader();
return this.#loaderInstance;
}
status = null;
constructor(url) {
this.status = Resource.#loader.load(url);
}
}
¡Gracias a Tim (Bloomberg) por implementar esta propuesta!
Puedes probar esta nueva función añadiendo @babel/plugin-proposal-private-methods a tu configuración si aún no lo has hecho, o activando el preset stage-3 en el REPL online.
¡El soporte para características privadas en clases está finalmente completo! 🎉
| Class Private | Instance | Static |
|---|---|---|
Fields class A { #a = 1 } | 7.0.0 | 7.1.0 |
Methods class A { #a() {} } | 7.2.0 | 7.4.0 |
Accessors class A { get #a() {} } | 7.3.0 | 7.6.0 |

Análisis sintáctico de funciones intrínsecas de V8 (#10148)
Esta es una extensión no estándar del lenguaje, que solo puede usarse en V8 al habilitar la bandera de línea de comandos --allow-natives-syntax.
V8, el motor JavaScript usado por Node.js y navegadores basados en Chromium, puede exponer varias funcionalidades internas como funciones JavaScript. Aunque estas APIs no deben usarse en código JavaScript de producción, estas funciones especiales pueden ser útiles en escenarios de pruebas y depuración, por ejemplo, para entender cómo se representan tus valores JavaScript en memoria o para invocar directamente rutinas de la especificación ECMAScript.
Estas llamadas "intrínsecas de V8" tienen una sintaxis diferente a las funciones normales: sus nombres siempre comienzan con %. Además, solo pueden invocarse directamente y nunca usarse como valores normales (no puedes, por ejemplo, asignarlas a otra variable).
function fn() { /* ... */ }
const status = %GetOptimizationStatus(fn);
if (status === 2) {
console.log("The function is not optimized!");
}
Puedes encontrar la lista completa de intrínsecas de V8 en el código fuente de V8.
Puedes habilitar esta sintaxis en @babel/parser usando el plugin v8intrinsic:
const { parse } = require("@babel/parser");
parse(code, {
plugins: ["v8intrinsic"]
})
Actualizaciones del operador de coalescencia nula (??) (#10269)
La propuesta de coalescencia nula en etapa 3 recientemente recibió actualizaciones: para evitar confusión con la precedencia de otros operadores lógicos (&& y ||), la especificación se modificó para prohibir mezclarlos.
Esto significa que las siguientes expresiones ahora son inválidas:
a ?? b || c;
a && b ?? c;
En cambio, debes agregar paréntesis donde corresponda:
(a ?? b) || c; /* or */ a ?? (b || c);
(a && b) ?? c; /* or */ a && (b ?? c);
Esto es similar a cómo interactúan el signo menos unario (-) y el operador de exponenciación (**): no puedes escribir -1 ** 2, sino que debes elegir entre (-1) ** 2 y -(1 ** 2).