JavaScript


JavaScript ( / ɑː v ə ˌ s k r ɪ p t / ), [8] a menudo abreviado como JS , es un lenguaje de programación que se ajusta a la ECMAScript especificación. [9] JavaScript es de alto nivel , a menudo compilado justo a tiempo y de múltiples paradigmas . Tiene sintaxis de corchetes , escritura dinámica , orientación a objetos basada en prototipos y funciones de primera clase..

Junto con HTML y CSS , JavaScript es una de las tecnologías centrales de la World Wide Web . [10] Más del 97% de los sitios web lo utilizan del lado del cliente para el comportamiento de las páginas web , [11] a menudo incorporan bibliotecas de terceros . [12] Todos los principales navegadores web tienen un motor JavaScript dedicado para ejecutar el código en el dispositivo del usuario .

Como lenguaje de múltiples paradigmas, JavaScript admite estilos de programación imperativos , funcionales y controlados por eventos . Tiene interfaces de programación de aplicaciones (API) para trabajar con texto, fechas, expresiones regulares , estructuras de datos estándar y el Modelo de objetos de documento (DOM).

El estándar ECMAScript no incluye ninguna entrada / salida (E / S), como redes , almacenamiento o instalaciones gráficas . En la práctica, el navegador web u otro sistema de ejecución proporciona API de JavaScript para E / S.

Los motores de JavaScript se usaban originalmente solo en navegadores web, pero ahora son componentes centrales de otros sistemas de software, principalmente servidores y una variedad de aplicaciones .

Aunque existen similitudes entre JavaScript y Java , incluido el nombre del lenguaje, la sintaxis y las respectivas bibliotecas estándar , los dos lenguajes son distintos y difieren mucho en diseño.

Creación en Netscape

El navegador web Mosaic se lanzó en 1993. Como primer navegador con una interfaz gráfica de usuario accesible para personas sin conocimientos técnicos, jugó un papel destacado en el rápido crecimiento de la naciente World Wide Web . [13] Los desarrolladores principales de Mosaic fundaron la corporación Netscape , que lanzó un navegador más refinado, Netscape Navigator , en 1994. Navigator se convirtió rápidamente en el navegador más utilizado. [14]

Durante estos años de formación de la Web, las páginas web solo podían ser estáticas y carecían de la capacidad de comportamiento dinámico después de que la página se cargara en el navegador. Había un deseo en la floreciente escena del desarrollo web de eliminar esta limitación, por lo que en 1995, Netscape decidió agregar un lenguaje de programación a Navigator. Siguieron dos rutas para lograr esto: colaborar con Sun Microsystems para integrar el lenguaje de programación Java , mientras que también contrataron a Brendan Eich para integrar el lenguaje Scheme . [5]

La gerencia de Netscape pronto decidió que la mejor opción era que Eich diseñara un nuevo lenguaje, con una sintaxis similar a Java y menos a Scheme u otros lenguajes de scripting existentes. [4] [5] Aunque el nuevo lenguaje y su implementación de intérprete se llamaron LiveScript cuando se envió por primera vez como parte de una versión beta de Navigator en septiembre de 1995, el nombre se cambió a JavaScript para el lanzamiento oficial en diciembre. [5] [1] [15]

La elección del nombre de JavaScript ha causado confusión, lo que implica que está directamente relacionado con Java. Dado que Java era el nuevo lenguaje de programación de moda en ese momento, Netscape lo ha caracterizado como una estrategia de marketing para dar su propio y nuevo prestigio al lenguaje. [dieciséis]

Adopción por Microsoft

Microsoft debutó con Internet Explorer en 1995, lo que provocó una guerra de navegadores con Netscape. En el frente de JavaScript, Microsoft realizó ingeniería inversa del intérprete Navigator para crear uno propio, llamado JScript .

JScript se lanzó por primera vez en 1996, junto con el soporte inicial para CSS y extensiones para HTML . Cada una de estas implementaciones fue notablemente diferente de sus contrapartes en Navigator. [17] [18] Estas diferencias dificultaron a los desarrolladores hacer que sus sitios web funcionaran bien en ambos navegadores, lo que llevó a un uso generalizado de los logotipos de "mejor visto en Netscape" y "mejor visto en Internet Explorer" durante varios años. [17] [19]

El auge de JScript

En noviembre de 1996, Netscape envió JavaScript a Ecma International , como punto de partida para una especificación estándar que todos los proveedores de navegadores podrían cumplir. Esto llevó al lanzamiento oficial de la primera especificación del lenguaje ECMAScript en junio de 1997.

El proceso de estándares continuó durante algunos años, con el lanzamiento de ECMAScript 2 en junio de 1998 y ECMAScript 3 en diciembre de 1999. El trabajo en ECMAScript 4 comenzó en 2000.

Mientras tanto, Microsoft ganó una posición cada vez más dominante en el mercado de los navegadores. A principios de la década de 2000, la participación de mercado de Internet Explorer alcanzó el 95%. [20] Esto significó que JScript se convirtió en el estándar de facto para las secuencias de comandos del lado del cliente en la Web.

Microsoft participó inicialmente en el proceso de estándares e implementó algunas propuestas en su lenguaje JScript, pero finalmente dejó de colaborar en el trabajo de Ecma. Por lo tanto, ECMAScript 4 fue suspendido.

Crecimiento y estandarización

Durante el período de dominio de Internet Explorer a principios de la década de 2000, las secuencias de comandos del lado del cliente estaban estancadas. Esto comenzó a cambiar en 2004, cuando el sucesor de Netscape, Mozilla , lanzó el navegador Firefox . Firefox fue bien recibido por muchos y le quitó una participación de mercado significativa a Internet Explorer. [21]

En 2005, Mozilla se unió a ECMA International y comenzó a trabajar en el estándar ECMAScript para XML (E4X). Esto llevó a Mozilla a trabajar en conjunto con Macromedia (luego adquirida por Adobe Systems ), quienes estaban implementando E4X en su lenguaje ActionScript 3, que estaba basado en un borrador de ECMAScript 4. El objetivo se convirtió en estandarizar ActionScript 3 como el nuevo ECMAScript 4. Con este fin, Adobe Systems lanzó la implementación de Tamarin como un proyecto de código abierto. Sin embargo, Tamarin y ActionScript 3 eran demasiado diferentes de las secuencias de comandos del lado del cliente establecidas, y sin la cooperación de Microsoft , ECMAScript 4 nunca llegó a buen término.

Mientras tanto, se estaban produciendo desarrollos muy importantes en comunidades de código abierto no afiliadas al trabajo de ECMA. En 2005, Jesse James Garrett publicó un libro blanco en el que acuñó el término Ajax y describió un conjunto de tecnologías, de las cuales JavaScript era la columna vertebral, para crear aplicaciones web donde los datos se pueden cargar en segundo plano, evitando la necesidad de páginas completas. recarga. Esto provocó un período de renacimiento de JavaScript, encabezado por bibliotecas de código abierto y las comunidades que se formaron a su alrededor. Se crearon muchas bibliotecas nuevas, incluidas jQuery , Prototype , Dojo Toolkit y MooTools .

Google debutó con su navegador Chrome en 2008, con el motor JavaScript V8 que era más rápido que su competencia. [22] [23] La innovación clave fue la compilación justo a tiempo (JIT), [24] por lo que otros proveedores de navegadores necesitaban reacondicionar sus motores para JIT. [25]

En julio de 2008, estos partidos dispares se reunieron para una conferencia en Oslo . Esto llevó al eventual acuerdo a principios de 2009 para combinar todo el trabajo relevante e impulsar el idioma. El resultado fue el estándar ECMAScript 5, lanzado en diciembre de 2009.

Alcanzando la madurez

El trabajo ambicioso en el lenguaje continuó durante varios años, que culminó con una extensa colección de adiciones y mejoras que se formalizaron con la publicación de ECMAScript 6 en 2015. [26]

El borrador de la especificación se mantiene actualmente abiertamente en GitHub , y las ediciones de ECMAScript se producen a través de instantáneas anuales regulares. [27] Las posibles revisiones del lenguaje se examinan a través de un proceso de propuesta integral. [28] [29] Ahora, en lugar de números de edición, los desarrolladores verifican el estado de las próximas funciones de forma individual. [27]

El ecosistema de JavaScript actual tiene muchas bibliotecas y marcos , prácticas de programación establecidas y un mayor uso de JavaScript fuera de los navegadores web. Además, con el auge de las aplicaciones de una sola página y otros sitios web con mucho JavaScript, se han creado varios transpilers para ayudar en el proceso de desarrollo. [30]

"JavaScript" es una marca comercial de Oracle Corporation en los Estados Unidos. [31] [32]

JavaScript es el lenguaje de programación del lado del cliente dominante en la Web, y el 97% de los sitios web lo utilizan para este propósito. [11] Los scripts están incrustados o incluidos en documentos HTML e interactúan con el DOM . Todos los principales navegadores web tienen un motor JavaScript integrado que ejecuta el código en el dispositivo del usuario.

Ejemplos de comportamiento con guión

  • Carga de contenido de una nueva página web sin volver a cargar la página, a través de Ajax o WebSocket . Por ejemplo, los usuarios de las redes sociales pueden enviar y recibir mensajes sin salir de la página actual.
  • Animaciones de páginas web, como hacer que los objetos aparezcan y desaparezcan, cambiar su tamaño y moverlos.
  • Jugar juegos de navegador .
  • Controlar la reproducción de medios de transmisión .
  • Generando pop-ups .
  • Validar los valores de entrada de un formulario web antes de que los datos se envíen a un servidor web .
  • Registrar datos sobre el comportamiento del usuario y luego enviarlos a un servidor. El propietario del sitio web puede utilizar estos datos para análisis , seguimiento de anuncios y personalización .

Bibliotecas y marcos

Más del 80% de los sitios web utilizan una biblioteca JavaScript o un marco web de terceros para sus scripts del lado del cliente. [12]

jQuery es, con mucho, la biblioteca más popular, utilizada por más del 75% de los sitios web. [12] Facebook creó la biblioteca React para su sitio web y luego la lanzó como código abierto ; otros sitios, incluido Twitter , ahora lo usan. Del mismo modo, el marco Angular creado por Google para sus sitios web, incluidos YouTube y Gmail , ahora es un proyecto de código abierto utilizado por otros. [12]

Por el contrario, el término "Vanilla JS" se ha acuñado para los sitios web que no utilizan bibliotecas o marcos, sino que se basan por completo en la funcionalidad estándar de JavaScript. [33]

Otro uso

El uso de JavaScript se ha expandido más allá de las raíces de su navegador web . Los motores de JavaScript ahora están integrados en una variedad de otros sistemas de software, tanto para implementaciones de sitios web del lado del servidor como para aplicaciones que no son de navegador .

Los primeros intentos de promover el uso del lado del servidor JavaScript eran Netscape Enterprise Server y Microsoft 's de Internet Information Services , [34] [35] pero eran pequeños nichos. [36] El uso del lado del servidor finalmente comenzó a crecer a fines de la década de 2000, con la creación de Node.js y otros enfoques . [36]

Electron , Cordova , React Native y otros marcos de aplicaciones se han utilizado para crear muchas aplicaciones con comportamiento implementado en JavaScript. Otras aplicaciones que no son de navegador incluyen compatibilidad con Adobe Acrobat para la creación de scripts de documentos PDF [37] y extensiones de GNOME Shell escritas en JavaScript. [38]

JavaScript ha comenzado a aparecer recientemente en algunos sistemas integrados , generalmente aprovechando Node.js. [39] [40] [41]

Las siguientes características son comunes a todas las implementaciones conformes de ECMAScript, a menos que se especifique explícitamente lo contrario.

Imperativo y estructurado

JavaScript admite gran parte de la sintaxis de programación estructurada de C (por ejemplo, ifdeclaraciones, whilebucles, switchdeclaraciones, do whilebucles, etc.). Una excepción parcial es el alcance : originalmente, JavaScript solo tenía el alcance de la función con var; luego se agregó el alcance del bloque en ECMAScript 2015 con las palabras clave lety const. Como C, JavaScript hace una distinción entre expresiones y declaraciones . Una diferencia sintáctica de C es la inserción automática de punto y coma , que permite omitir los puntos y comas (que terminan las declaraciones). [42]

Débilmente mecanografiado

JavaScript tiene un tipo débil , lo que significa que ciertos tipos se emiten implícitamente según la operación utilizada. [43]

  • El +operador binario convierte ambos operandos en una cadena a menos que ambos operandos sean números. Esto se debe a que el operador de suma funciona como operador de concatenación.
  • El -operador binario siempre convierte ambos operandos a un número
  • Ambos operadores unarios ( +, -) siempre convierten el operando en un número

Los valores se convierten en cadenas como las siguientes: [43]

  • Las cadenas se dejan como están
  • Los números se convierten a su representación de cadena
  • Las matrices tienen sus elementos convertidos en cadenas, después de lo cual se unen mediante comas ( ,)
  • Otros objetos se convierten a la cadena [object Object]donde Objectes el nombre del constructor del objeto.

Los valores se convierten en números convirtiéndolos en cadenas y luego convirtiendo las cadenas en números. Estos procesos se pueden modificar definiendo toStringy valueOffunciones en el prototipo para la fundición de cadenas y números, respectivamente.

JavaScript ha recibido críticas por la forma en que implementa estas conversiones, ya que la complejidad de las reglas puede confundirse con inconsistencias. [44] [43] Por ejemplo, al agregar un número a una cadena, el número se convertirá en una cadena antes de realizar la concatenación, pero al restar un número de una cadena, la cadena se convertirá en un número antes de realizar la resta.

A menudo también se menciona que {} + []resulta en 0(número). Esto es engañoso: {}se interpreta como un bloque de código vacío en lugar de un objeto vacío, y el +operador unario restante convierte la matriz vacía en un número . Si envuelve la expresión entre paréntesis, ({} + [])las llaves se interpretan como un objeto vacío y el resultado de la expresión es el "[object Object]"esperado. [43]

Dinámica

Mecanografía
JavaScript se escribe dinámicamente como la mayoría de los otros lenguajes de secuencias de comandos . Un tipo está asociado con un valor en lugar de una expresión. Por ejemplo, una variable inicialmente vinculada a un número puede reasignarse a una cadena . [45] JavaScript admite varias formas de probar el tipo de objetos, incluida la escritura pato . [46]
Evaluación en tiempo de ejecución
JavaScript incluye una evalfunción que puede ejecutar declaraciones proporcionadas como cadenas en tiempo de ejecución.

Orientación a objetos (basada en prototipos)

La herencia prototípica en JavaScript es descrita por Douglas Crockford como:

Hace prototipos de objetos y luego ... crea nuevas instancias. Los objetos son mutables en JavaScript, por lo que podemos aumentar las nuevas instancias, dándoles nuevos campos y métodos. Estos pueden actuar como prototipos para objetos incluso más nuevos. No necesitamos clases para hacer muchos objetos similares ... Los objetos heredan de los objetos. ¿Qué podría estar más orientado a objetos que eso? [47]

En JavaScript, un objeto es una matriz asociativa , aumentada con un prototipo (ver más abajo); cada clave proporciona el nombre de una propiedad de objeto , y hay dos formas sintácticas de especificar dicho nombre: notación de puntos ( obj.x = 10) y notación de corchetes ( obj['x'] = 10). Una propiedad puede agregarse, recuperarse o eliminarse en tiempo de ejecución. La mayoría de las propiedades de un objeto (y cualquier propiedad que pertenezca a la cadena de herencia del prototipo de un objeto) se pueden enumerar mediante un for...inbucle.

Prototipos
JavaScript usa prototipos donde muchos otros lenguajes orientados a objetos usan clases para herencia . [48] Es posible simular muchas características basadas en clases con prototipos en JavaScript. [49]
Funciones como constructores de objetos
Las funciones se duplican como constructores de objetos, junto con su papel típico. Prefijar una llamada a una función con new creará una instancia de un prototipo, heredando propiedades y métodos del constructor (incluidas las propiedades del Objectprototipo). [50] ECMAScript 5 ofrece el Object.createmétodo, que permite la creación explícita de una instancia sin heredar automáticamente del Objectprototipo (los entornos más antiguos pueden asignar el prototipo a null). [51] La prototypepropiedad del constructor determina el objeto utilizado para el prototipo interno del nuevo objeto. Se pueden agregar nuevos métodos modificando el prototipo de la función utilizada como constructor. Los constructores integrados de JavaScript, como Arrayo Object, también tienen prototipos que se pueden modificar. Si bien es posible modificar el Objectprototipo, generalmente se considera una mala práctica porque la mayoría de los objetos en JavaScript heredarán métodos y propiedades del Objectprototipo, y es posible que no esperen que se modifique el prototipo. [52]
Funciones como métodos
A diferencia de muchos lenguajes orientados a objetos, no hay distinción entre una definición de función y una definición de método . Más bien, la distinción se produce durante la llamada a la función; cuando se llama a una función como método de un objeto, la palabra clave this local de la función está vinculada a ese objeto para esa invocación.

Funcional

Una función es de primera clase ; una función se considera un objeto. Como tal, una función puede tener propiedades y métodos, como .call()y .bind(). [53] Una función anidada es una función definida dentro de otra función. Se crea cada vez que se invoca la función externa. Además, cada función anidada forma un cierre léxico : el alcance léxico de la función externa (incluida cualquier constante, variable local o valor de argumento) se convierte en parte del estado interno de cada objeto de función interna, incluso después de que concluye la ejecución de la función externa. . [54] JavaScript también admite funciones anónimas .

Delegativo

JavaScript admite la delegación implícita y explícita .

Funciones como roles (Rasgos y Mixins)
JavaScript soporta de forma nativa varias implementaciones basadas en funciones de patrones de rol [55] como Traits [56] [57] y Mixins . [58] Dicha función define un comportamiento adicional mediante al menos un método vinculado a la thispalabra clave dentro de su functioncuerpo. Luego, un rol debe delegarse explícitamente a través de callo applyen objetos que deben presentar un comportamiento adicional que no se comparte a través de la cadena de prototipos.
Composición y herencia de objetos
Mientras que la delegación explícita basada en funciones cubre la composición en JavaScript, la delegación implícita ya ocurre cada vez que se recorre la cadena del prototipo para, por ejemplo, encontrar un método que pueda estar relacionado con un objeto pero que no sea propiedad directa de él. Una vez que se encuentra el método, se llama dentro del contexto de este objeto. Por lo tanto, la herencia en JavaScript está cubierta por un automatismo de delegación que está vinculado a la propiedad prototipo de las funciones constructoras.

Diverso

JS es un lenguaje de índice cero .

Entorno de ejecución
JavaScript generalmente se basa en un entorno de tiempo de ejecución (por ejemplo, un navegador web ) para proporcionar objetos y métodos mediante los cuales los scripts pueden interactuar con el entorno (por ejemplo, un DOM de página web ). Estos entornos son de un solo subproceso . JavaScript también se basa en el entorno de tiempo de ejecución para proporcionar la capacidad de incluir / importar scripts (por ejemplo, elementos HTML