stringtranslate.com

javascript

JavaScript ( / ˈ ɑː v ə s k r ɪ p t / ), a menudo abreviado como JS , es un lenguaje de programación y tecnología central de la World Wide Web , junto con HTML y CSS . A partir de 2024 , el 98,9% de los sitios web utilizan JavaScript en el lado del cliente para el comportamiento de la página web , [10] y a menudo incorporan bibliotecas de terceros . Todos los principales navegadores web tienen un motor JavaScript dedicado para ejecutar el código en los dispositivos de los usuarios .

JavaScript es un lenguaje compilado de alto nivel , a menudo justo a tiempo, que se ajusta al estándar ECMAScript . [11] Tiene escritura dinámica , orientación a objetos basada en prototipos y funciones de primera clase . Es multiparadigma y admite estilos de programación imperativo , funcional y basado en 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 instalaciones de redes , almacenamiento o gráficos . En la práctica, el navegador web u otro sistema de ejecución proporciona API de JavaScript para E/S.

Los motores JavaScript se usaban originalmente solo en navegadores web, pero ahora son componentes centrales de algunos servidores y una variedad de aplicaciones . El sistema de ejecución más popular para este uso es Node.js.

Aunque Java y JavaScript son similares en nombre, sintaxis y bibliotecas estándar respectivas , los dos lenguajes son distintos y difieren mucho en diseño.

Historia

Creación en Netscape

El primer navegador web popular con una interfaz gráfica de usuario , Mosaic , se lanzó en 1993. Accesible para personas sin conocimientos técnicos, desempeñó un papel destacado en el rápido crecimiento de la primera World Wide Web . [12] Los principales desarrolladores de Mosaic fundaron entonces la corporación Netscape , que lanzó un navegador más pulido, Netscape Navigator , en 1994. Este rápidamente se convirtió en el más utilizado. [13]

Durante estos años de formación de la Web, las páginas web sólo podían ser estáticas y carecían de la capacidad de comportamiento dinámico una vez cargadas en el navegador. En la floreciente escena del desarrollo web existía el deseo de eliminar esta limitación, por lo que en 1995, Netscape decidió agregar un lenguaje de programación a Navigator. Siguieron dos caminos para lograrlo: colaborar con Sun Microsystems para integrar el lenguaje de programación Java y al mismo tiempo contratar a Brendan Eich para integrar el lenguaje Scheme . [6]

El objetivo original era un "lenguaje para las masas", [14] "para ayudar a los no programadores a crear sitios web dinámicos e interactivos ". [15] En este sentido, la dirección de Netscape pronto decidió que la mejor opción era que Eich ideara un nuevo lenguaje, con una sintaxis similar a Java y menos parecida a Scheme u otros lenguajes de scripting existentes . [5] [6] 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. [6] [1] [16]

La elección del nombre JavaScript ha causado confusión, dando a entender que está directamente relacionado con Java. En ese momento, el boom de las puntocom había comenzado y Java era un nuevo lenguaje popular, por lo que Eich consideró el nombre de JavaScript como una estrategia de marketing de Netscape. [14]

Adopción por Microsoft

Microsoft presentó Internet Explorer en 1995, lo que llevó a una guerra de navegadores con Netscape. En el frente de JavaScript, Microsoft realizó ingeniería inversa al intérprete Navigator para crear el suyo propio, llamado JScript . [17]

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

El auge de JScript

En noviembre de 1996, Netscape presentó JavaScript a Ecma International , como punto de partida para una especificación estándar que todos los proveedores de navegadores pudieran 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. [17]

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 cuota de mercado de Internet Explorer alcanzó el 95%. [21] Esto significó que JScript se convirtió en el estándar de facto para secuencias de comandos del lado del cliente en la Web.

Microsoft inicialmente participó 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 quedó 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 empezó a cambiar en 2004, cuando el sucesor de Netscape, Mozilla , lanzó el navegador Firefox . Firefox fue bien recibido por muchos, quitándole una importante cuota de mercado a Internet Explorer. [22]

En 2005, Mozilla se unió a ECMA International y se inició el trabajo en el estándar ECMAScript para XML (E4X). Esto llevó a Mozilla a trabajar conjuntamente con Macromedia (posteriormente adquirida por Adobe Systems ), que estaban implementando E4X en su lenguaje ActionScript 3, que se basaba en un borrador de ECMAScript 4. El objetivo era estandarizar ActionScript 3 como el nuevo ECMAScript 4. Para ello, 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 los scripts del lado del cliente establecidos y, sin la cooperación de Microsoft , ECMAScript 4 nunca llegó a buen término.

Mientras tanto, se estaban produciendo avances 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 describía 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ágina completa. recargas. Esto provocó un período de renacimiento de JavaScript, encabezado por las 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 presentó su navegador Chrome en 2008, con el motor JavaScript V8 que era más rápido que su competencia. [23] [24] La innovación clave fue la compilación justo a tiempo (JIT), [25] por lo que otros proveedores de navegadores necesitaron revisar sus motores para JIT. [26]

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

Alcanzando la madurez

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

La creación de Node.js en 2009 por Ryan Dahl provocó un aumento significativo en el uso de JavaScript fuera de los navegadores web. Node combina el motor V8 , un bucle de eventos y API de E/S , proporcionando así un sistema de ejecución de JavaScript independiente. [28] [29] A partir de 2018, millones de desarrolladores habían utilizado Node, [30] y npm tenía la mayor cantidad de módulos que cualquier administrador de paquetes del mundo. [31]

El borrador de la especificación ECMAScript es actualmente [ a partir de? ] se mantiene abiertamente en GitHub y las ediciones se producen a través de instantáneas anuales periódicas. [32] Las posibles revisiones del lenguaje se examinan mediante un proceso de propuesta integral. [33] [34] Ahora, en lugar de los números de edición, los desarrolladores verifican el estado de las próximas funciones individualmente. [32]

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

Marca comercial

"JavaScript" es una marca comercial de Oracle Corporation en Estados Unidos. [36] [37] La ​​marca registrada se emitió originalmente a Sun Microsystems el 6 de mayo de 1997 y se transfirió a Oracle cuando adquirieron Sun en 2009. [38]

Uso del sitio web del lado del cliente

JavaScript es el lenguaje de secuencias de comandos del lado del cliente dominante en la Web, y el 98% de todos los sitios web (mediados de 2022) lo utilizan para este propósito. [39] 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 programado

Bibliotecas y marcos web

En 2012, más del 80% de los sitios web utilizaban una biblioteca de JavaScript o un marco web de terceros para sus secuencias de comandos del lado del cliente. [40]

Reaccionar

React (también conocido como React.js o ReactJS) es una biblioteca JavaScript front-end gratuita y de código abierto [41] [42] para crear interfaces de usuario basadas en componentes . Lo mantiene Meta (anteriormente Facebook) y una comunidad de desarrolladores y empresas individuales. [43] [44] [45]

React se puede utilizar para desarrollar aplicaciones de una sola página , móviles o renderizadas en servidor con marcos como Next.js. Debido a que React solo se preocupa por la interfaz de usuario y la representación de componentes en el DOM , las aplicaciones de React a menudo dependen de bibliotecas para el enrutamiento y otras funciones del lado del cliente. [46] [47] Una ventaja clave de React es que solo renderiza aquellas partes de la página que han cambiado, evitando la renderización innecesaria de elementos DOM sin cambios.

Angular

Angular (también conocido como "Angular 2+") [48] es un marco de aplicación web de una sola página , gratuito y de código abierto, basado en TypeScript , dirigido por el equipo Angular de Google y por una comunidad de individuos y corporaciones. Angular es una reescritura completa del mismo equipo que creó AngularJS .

jQuery

En 2012, jQuery fue, con diferencia, la biblioteca del lado del cliente más popular, utilizada por más del 75% de los sitios web. [40] Si bien todavía tiene un uso generalizado, su popularidad ha sido superada por bibliotecas y marcos más nuevos.

vainilla js

El apodo similar a un marco "Vanilla JS" es solo otro nombre para el antiguo JavaScript. Ha sido acuñado para sitios web que no utilizan ninguna biblioteca o marco, sino que dependen completamente de la funcionalidad estándar de JavaScript. [49] Ejemplo de uso: "¿Qué marco utilizas?" "Oh, usamos Vanilla JS".

El término se incluye aquí para evitar confusiones.

Otro uso

El uso de JavaScript se ha expandido más allá de las raíces de los navegadores web . Los motores 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 intentos iniciales de promover el uso de JavaScript en el lado del servidor fueron Netscape Enterprise Server y Internet Information Services de Microsoft , [50] [51] pero eran nichos pequeños. [52] El uso del lado del servidor finalmente comenzó a crecer a finales de la década de 2000, con la creación de Node.js y otros enfoques . [52]

Se han utilizado Electron , Cordova , React Native y otros marcos de aplicaciones para crear muchas aplicaciones con comportamiento implementado en JavaScript. Otras aplicaciones que no son de navegador incluyen soporte de Adobe Acrobat para secuencias de comandos de documentos PDF [53] y extensiones de GNOME Shell escritas en JavaScript. [54]

JavaScript ha comenzado a aparecer recientemente en algunos sistemas integrados , generalmente aprovechando Node.js. [55] [56] [57]

Sistema de ejecución

Compilación justo a tiempo

motor javascript

Un motor JavaScript es un componente de software que ejecuta código JavaScript . Los primeros motores de JavaScript eran meros intérpretes , pero todos los motores modernos relevantes utilizan la compilación justo a tiempo para mejorar el rendimiento. [58]

Los motores de JavaScript suelen ser desarrollados por proveedores de navegadores web y todos los navegadores importantes tienen uno. En un navegador, el motor JavaScript se ejecuta en conjunto con el motor de renderizado a través del Modelo de objetos de documento .

El uso de motores JavaScript no se limita a los navegadores. Por ejemplo, el motor V8 es un componente central de los sistemas de ejecución Node.js y Deno .

Dado que ECMAScript es la especificación estandarizada de JavaScript, el motor ECMAScript es otro nombre para estos motores. Con la llegada de WebAssembly , algunos motores también pueden ejecutar este código en el mismo entorno limitado que el código JavaScript normal.

Entorno de ejecución

JavaScript normalmente se basa en un entorno 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 depende del entorno de ejecución para proporcionar la capacidad de incluir/importar scripts (por ejemplo, elementos HTML <script> ). Esta no es una característica del lenguaje en sí, pero es común en la mayoría de las implementaciones de JavaScript. JavaScript procesa los mensajes de una cola de uno en uno. JavaScript llama a una función asociada con cada mensaje nuevo, creando un marco de pila de llamadas con los argumentos y las variables locales de la función . La pila de llamadas se reduce y crece según las necesidades de la función. Cuando la pila de llamadas está vacía al finalizar la función, JavaScript pasa al siguiente mensaje en la cola. Esto se denomina bucle de eventos y se describe como "ejecución hasta completarse" porque cada mensaje se procesa por completo antes de considerar el siguiente. Sin embargo, el modelo de concurrencia del lenguaje describe el bucle de eventos como sin bloqueo : la entrada/salida del programa se realiza mediante eventos y funciones de devolución de llamada . Esto significa, por ejemplo, que JavaScript puede procesar un clic del mouse mientras espera que una consulta de base de datos devuelva información. [59]

Ejemplos

Nodo.js
Node.js es un entorno de ejecución de JavaScript de código abierto y multiplataforma que puede ejecutarse en Windows , Linux , Unix , macOS y más. Node.js se ejecuta en el motor JavaScript V8 y ejecuta código JavaScript fuera de un navegador web .
Deno
Deno / d n / [60] es un tiempo de ejecución para JavaScript, TypeScript y WebAssembly que se basa en el motor JavaScript V8 y el lenguaje de programación Rust . Deno fue cocreado por Ryan Dahl , quien también creó Node.js. [61]

Características

Las siguientes características son comunes a todas las implementaciones ECMAScript conformes 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 alcance de función con var; El alcance del bloque se agregó en ECMAScript 2015 con las palabras clave lety const. Al igual que C, JavaScript hace una distinción entre expresiones y declaraciones . Una diferencia sintáctica con respecto a C es la inserción automática de punto y coma , que permite omitir los puntos y coma (que terminan las declaraciones). [62]

débilmente escrito

JavaScript tiene tipos débiles , lo que significa que ciertos tipos se convierten implícitamente según la operación utilizada. [63]

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

Los valores se convierten en números convirtiéndose en cadenas y luego convirtiendo las cadenas en números. Estos procesos se pueden modificar definiendo funciones toStringy valueOfen el prototipo para la conversió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 inconsistencia. [64] [63] 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 el {} + []resultado de 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 "[object Object]"el esperado. [63]

Dinámica

Mecanografía

JavaScript se escribe dinámicamente como la mayoría de los otros lenguajes de programación . 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 . [65] JavaScript admite varias formas de probar el tipo de objetos, incluida la escritura pato . [66]

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)

Douglas Crockford describe la herencia prototípica en JavaScript como:

Creas objetos prototipo y luego... creas 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 de objetos aún más nuevos. No necesitamos clases para crear muchos objetos similares... Los objetos heredan de los objetos. ¿Qué podría ser más orientado a objetos que eso? [67]

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 se puede agregar, recuperar o eliminar 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 . [68] Es posible simular muchas características basadas en clases con prototipos en JavaScript. [69]

Funciones como constructores de objetos.

Las funciones funcionan también como constructores de objetos, junto con su función típica. Prefijar una llamada de función con new creará una instancia de un prototipo, heredando propiedades y métodos del constructor (incluidas las propiedades del Objectprototipo). [70] 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). [71] La propiedad del constructor prototypedetermina 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. [72]

Funciones como métodos

A diferencia de muchos lenguajes orientados a objetos, en JavaScript no hay distinción entre una definición de función y una definición de método . Más bien, la distinción ocurre durante la llamada a la función. Cuando se llama a una función como método de un objeto, la palabra clave local this de la función está vinculada a ese objeto para esa invocación.

Funcional

Las funciones de JavaScript son de primera clase ; una función se considera un objeto. [73] Como tal, una función puede tener propiedades y métodos, como .call()y .bind(). [74]

Cierre léxico

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 concluya la ejecución de la función externa. . [75]

Función anónima

JavaScript también admite funciones anónimas .

delegado

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

Funciones como roles (Rasgos y Mixins)

JavaScript admite de forma nativa varias implementaciones basadas en funciones de patrones Role [76] como Traits [77] [78] y Mixins . [79] 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 callobjetos applyque 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.

Misceláneas

Numeración basada en cero

JavaScript es un lenguaje de índice cero .

Funciones variadas

Se puede pasar un número indefinido de parámetros a una función. La función puede acceder a ellos a través de parámetros formales y también a través del argumentsobjeto local. También se pueden crear funciones variadas utilizando el bindmétodo.

Literales de matriz y objeto

Como en muchos lenguajes de programación, las matrices y los objetos ( matrices asociativas en otros lenguajes) se pueden crear con una sintaxis de acceso directo sucinta. De hecho, estos literales forman la base del formato de datos JSON .

Expresiones regulares

De manera similar a Perl , JavaScript también admite expresiones regulares , que proporcionan una sintaxis concisa y potente para la manipulación de texto que es más sofisticada que las funciones de cadena integradas. [80]

Promesas y Async/await

JavaScript admite promesas y Async/await para manejar operaciones asincrónicas. [ cita necesaria ]

Promesas

Un objeto Promise integrado proporciona funcionalidad para manejar promesas y asociar controladores con el resultado final de una acción asincrónica. Recientemente, la especificación de JavaScript introdujo métodos combinadores, que permiten a los desarrolladores combinar múltiples promesas de JavaScript y realizar operaciones basadas en diferentes escenarios. Los métodos introducidos son: Promise.race, Promise.all, Promise.allSettled y Promise.any.

asíncrono/espera

Async/await permite estructurar una función asincrónica y sin bloqueo de forma similar a una función síncrona ordinaria. Se puede escribir código asincrónico y sin bloqueo, con una sobrecarga mínima, estructurado de manera similar al código de bloqueo síncrono tradicional.

Extensiones específicas del proveedor

Históricamente, algunos motores de JavaScript admitían estas funciones no estándar:

Sintaxis

Ejemplos simples

Las variables en JavaScript se pueden definir usando las palabras clave var, [82] let[83] o const[84] . Las variables definidas sin palabras clave se definirán en el ámbito global.

// Declara una variable con ámbito de función denominada `x` e implícitamente le asigna el // valor especial `undefinido`. Las variables sin valor se // establecen automáticamente como indefinidas. // var generalmente se considera una mala práctica y generalmente se prefieren let y const. varx ; _ // Las variables se pueden configurar manualmente en `indefinido`, así let x2 = undefinido ;   // Declara una variable con ámbito de bloque denominada `y` e implícitamente la establece en // `indefinido`. La palabra clave `let` se introdujo en ECMAScript 2015. let y ; // Declara una variable no reasignable con ámbito de bloque denominada `z` y la establece // como una cadena literal. La palabra clave `const` también se introdujo en ECMAScript 2015 // y debe asignarse explícitamente.// La palabra clave `const` significa constante, por lo tanto, la variable no se puede reasignar // ya que el valor es `constante`. const z = "¡este valor no se puede reasignar!" ;   // Declara una variable de ámbito global y asigna 3. Esto generalmente se considera // una mala práctica y no funcionará si el modo estricto está activado. t = 3 ;  // Declara una variable llamada `myNumber` y le asigna un número literal (el valor // `2`). deje miNúmero = 2 ;   // Reasigna `myNumber`, configurándolo en una cadena literal (el valor `"foo"`). // JavaScript es un lenguaje de tipo dinámico, por lo que es legal. miNúmero = "foo" ;  

Tenga en cuenta los comentarios en los ejemplos anteriores, todos los cuales estaban precedidos por dos barras diagonales .

No hay una funcionalidad de entrada/salida incorporada en JavaScript, sino que la proporciona el entorno de ejecución. La especificación ECMAScript en la edición 5.1 menciona que "no hay disposiciones en esta especificación para la entrada de datos externos o la salida de resultados calculados". [85] Sin embargo, la mayoría de los entornos de ejecución tienen un consoleobjeto que se puede utilizar para imprimir la salida. [86] Aquí hay un minimalista "¡Hola, mundo!" programa en JavaScript en un entorno de ejecución con un objeto de consola:

consola . log ( "¡Hola mundo!" );

En documentos HTML, se requiere un programa como este para obtener una salida:

// Los nodos de texto se pueden crear utilizando el método "escribir". // Esto está mal visto, ya que puede sobrescribir el documento si está completamente cargado. documento . escribir ( 'foo' );// También se pueden crear elementos. Primero, deben crearse en el DOM. const myElem = documento . crearElement ( 'intervalo' );   // También se pueden configurar atributos como clases y la identificación myElem . Lista de clase . agregar ( 'foo' ); miElem . identificación = 'barra' ;  // Después de configurar esto, la etiqueta se verá así: `<span class="foo" id="bar" data-attr="baz"></span>` myElem . setAttribute ( 'atributo-datos' , 'baz' ); // Que también podría escribirse como `myElem.dataset.attr = 'baz'`  // Finalmente, añádelo como elemento secundario al <cuerpo> en el documento HTML . cuerpo . appendChild ( miElem );// Los elementos se pueden capturar imperativamente con querySelector para un elemento, o querySelectorAll para múltiples elementos que se pueden repetir con forEach document . querySelector ( '.clase' ); // Selecciona el primer elemento con el documento de clase "clase" . selector de consulta ( '#id' ); // Selecciona el primer elemento con un `id` de documento "id" . querySelector ( '[datos-otros]' ); // Selecciona el primer elemento con el atributo "datos-otros" documento . querySelectorAll ( '.múltiple' ); // Devuelve una NodeList similar a una matriz de todos los elementos con la clase "múltiple"    

Una función recursiva simple para calcular el factorial de un número natural :

function factorial ( n ) { // Comprobando la legitimidad del argumento. Factorial se define para números enteros positivos. if ( isNaN ( n )) { consola . error ( "No se permiten argumentos no numéricos." ); devolver NaN ; // El valor especial: No es un número } if ( n === 0 ) devuelve 1 ; // 0! = 1 si ( n < 0 ) devuelve indefinido ; // El factorial de números negativos no está definido. si ( n % 1 ) { consola . warn ( ` ${ n } se redondeará al entero más cercano. Para números no enteros, considere usar la función gamma en su lugar.` ); n = Matemáticas . redondo ( norte ); } // No es necesario repetir las comprobaciones anteriores en la recursividad, por lo que se define la parte recursiva real por separado a continuación.                                     // La siguiente línea es una expresión de función para calcular recursivamente el factorial. Utiliza la sintaxis de flechas introducida en ES6. const recursivamenteCalcular = a => a > 1 ? a * recursivamente Calcular ( a - 1 ) : 1 ; // Tenga en cuenta el uso del operador ternario `?`. regresar recursivamente Calcular ( n ); }                   factores ( 3 ); // Devuelve 6 

Una función anónima (o lambda):

contador constante = función () { let count = 0 ; función de retorno () { retorno ++ recuento ; } };              constante x = contador (); X (); // Devuelve 1 x (); // Devuelve 2 x (); // Devuelve 3      

Este ejemplo muestra que, en JavaScript, los cierres de funciones capturan sus variables no locales por referencia.

Las funciones de flecha se introdujeron por primera vez en la sexta edición: ECMAScript 2015 . Acortan la sintaxis para escribir funciones en JavaScript. Las funciones de flecha son anónimas, por lo que se necesita una variable que haga referencia a ellas para poder invocarlas después de su creación, a menos que estén entre paréntesis y se ejecuten inmediatamente.

Ejemplo de función de flecha:

// Las funciones de flecha nos permiten omitir la palabra clave `función`. // Aquí `long_example` apunta a un valor de función anónimo. const long_example = ( entrada1 , entrada2 ) => { consola . log ( "¡Hola mundo!" ); salida constante = entrada1 + entrada2 ;              salida de retorno ; }; // Si no hay llaves, la función de flecha simplemente devuelve la expresión // Entonces aquí está (entrada1 + entrada2) const short_example = ( entrada1 , entrada2 ) => entrada1 + entrada2 ;        ejemplo_largo ( 2 , 3 ); // Imprime "¡Hola mundo!" y devuelve 5 ejemplo_corto ( 2 , 5 ); // Devuelve 7    // Si una función de flecha tiene solo un parámetro, se pueden eliminar los paréntesis. const no_parentheses = entrada => entrada + 2 ;       no_paréntesis ( 3 ); // Devuelve 5 // Una función de flecha, al igual que otras definiciones de funciones, se puede ejecutar en la misma declaración en la que se crean. // Esto es útil al escribir bibliotecas para evitar llenar el alcance global y para cierres. sean tres = (( a , b ) => a + b ) ( 1 , 2 );          const generate_multiplier_function = a => ( b => isNaN ( b ) || ! b ? a : a *= b ); const cinco_múltiples = generar_función_multiplicadora ( 5 ); // El argumento proporcionado "genera" la expresión y es retenido por a. cinco_múltiplos ( 1 ); // Devuelve 5 cinco_múltiplos ( 3 ); // Devuelve 15 cinco_múltiplos ( 4 ); // Devuelve 60                    

En JavaScript, los objetos se pueden crear como instancias de una clase .

Ejemplo de clase de objeto:

clase bola {   constructor ( radio ) { este . radio = radio ; este . área = Matemáticas . PI * ( radio ** 2 ); }               // Las clases (y por tanto los objetos) pueden contener funciones conocidas como métodos show () { console . log ( este . radio ); } };    const miBola = nueva Bola ( 5 ); // Crea una nueva instancia del objeto bola con radio 5 myBall . radio ++ ; // Las propiedades del objeto normalmente se pueden modificar desde fuera de myBall . espectáculo (); // Usando la función heredada "mostrar" registra "6"       

En JavaScript, se pueden crear instancias de objetos directamente desde una función.

Ejemplo funcional de objeto:

función Bola ( radio ) {   área constante = Matemáticas . PI * ( radio ** 2 ); const obj = { radio , área };                 // Los objetos son mutables y las funciones se pueden agregar como propiedades. objeto . mostrar = () => consola . log ( obj . radio ); objeto de retorno ; };       const miBola = Bola ( 5 ); // Crea un nuevo objeto de bola con radio 5. No se necesita la palabra clave "nueva". Mi bola . radio ++ ; // La propiedad de la instancia se puede modificar. Mi bola . espectáculo (); // El uso de la función "mostrar" registra "6": el nuevo valor de instancia.      

Demostración de función variable ( argumentses una variable especial ): [87]

función suma () { sea x = 0 ;       for ( sea i = 0 ; i < argumentos . longitud ; ++ i ) x += argumentos [ i ];            devolver x ; } suma ( 1 , 2 ); // Devuelve 3 suma ( 1 , 2 , 3 ); // Devuelve 6     // A partir de ES6, usando el operador rest. función suma (... args ) { return args . reducir (( a , b ) => a + b ); }         suma ( 1 , 2 ); // Devuelve 3 suma ( 1 , 2 , 3 ); // Devuelve 6     

Las expresiones de función invocadas inmediatamente se utilizan a menudo para crear cierres. Los cierres permiten reunir propiedades y métodos en un espacio de nombres y hacer que algunos de ellos sean privados:

let contador = ( function () { let i = 0 ; // Propiedad privada          return { // Métodos públicos obtienen : función () { alerta ( i ); }, establecer : función ( valor ) { i = valor ; }, incremento : función () { alerta ( ++ i ); } }; })(); // módulo                     encimera . conseguir (); // Devuelve 0 contador . conjunto ( 6 ); encimera . incremento (); // Devuelve 7 contadores . incremento (); // Devuelve 8   

Los objetos generadores (en forma de funciones generadoras) proporcionan una función a la que se puede llamar, salir y volver a ingresar mientras se mantiene el contexto interno (estado). [88]

función * rawCounter () { rendimiento 1 ; rendimiento 2 ; }      función * contador dinámico () { let count = 0 ; while ( true ) { // No se recomienda utilizar bucles while true en la mayoría de los casos. rendimiento ++ recuento ; } }             // Instancias const contador1 = rawCounter (); contador constante2 = contador dinámico ();      // Contador de implementación1 . próximo (); // {valor: 1, hecho: falso} contador1 . próximo (); // {valor: 2, hecho: falso} contador1 . próximo (); // {valor: indefinido, hecho: verdadero}   contador2 . próximo (); // {valor: 1, hecho: falso} contador2 . próximo (); // {valor: 2, hecho: falso} contador2 . próximo (); // {valor: 3, hecho: falso} // ...infinitamente   

JavaScript puede exportar e importar desde módulos: [89]

Ejemplo de exportación:

/* mymodule.js */ // Esta función permanece privada, ya que no se exporta let sum = ( a , b ) => { return a + b ; }          // Exportar variables export let nombre = 'Alice' ; exportar dejar edad = 23 ;        // Exportar funciones con nombre export function add ( num1 , num2 ) { return num1 + num2 ; }        // Exportar clase exportar clase Multiplicación { constructor ( num1 , num2 ) { this . número1 = número1 ; este . número2 = número2 ; }              add () { return suma ( este . num1 , este . num2 ); } }     

Ejemplo de importación:

// Importar una propiedad import { add } from './mymodule.js' ; consola . iniciar sesión ( agregar ( 1 , 2 )); // 3      // Importar múltiples propiedades import { nombre , edad } de './mymodule.js' ; consola . iniciar sesión ( nombre , edad ); ///> "Alicia", 23       // Importar todas las propiedades de un módulo import * desde la consola './module.js' . iniciar sesión ( nombre , edad ); ///> "Alicia", 23 consola . iniciar sesión ( agregar ( 1 , 2 )); // 3    

Ejemplo más avanzado

Este código de muestra muestra varias funciones de JavaScript.

/* Encuentra el mínimo común múltiplo (MCM) de dos números */ function LCMCalculator ( x , y ) { // función constructora if ( isNaN ( x * y )) throw new TypeError ( "No se permiten argumentos no numéricos". ) ; const checkInt = function ( x ) { // función interna if ( x % 1 !== 0 ) throw new TypeError ( x + "no es un número entero" );                           devolver x ; };   este . a = checkInt ( x ) // el punto y coma ^^^^ son opcionales, una nueva línea es suficiente . b = comprobarInt ( y ); } // El prototipo de las instancias de objeto creadas por un constructor es // la propiedad "prototipo" de ese constructor. Calculadora LMC . prototipo = { // constructor literal del objeto : LCMCalculator , // al reasignar un prototipo, establece la propiedad del constructor apropiadamente gcd : función () { // método que calcula el máximo común divisor // Algoritmo euclidiano: let a = Math . abs ( este . a ), b = Matemáticas . abs ( este . b ), t ;                          if ( a < b ) { // intercambiar variables // t = b; segundo = a; a = t; [ a , b ] = [ b , a ]; // intercambiar usando asignación desestructurante (ES6) }              mientras ( b !== 0 ) { t = b ; b = un % b ; a = t ; }                 // Solo es necesario calcular el MCD una vez, por lo que "redefine" este método. // (En realidad no es una redefinición: se define en la instancia misma, // de modo que this.gcd se refiere a esta "redefinición" en lugar de LCMCalculator.prototype.gcd. // Tenga en cuenta que esto conduce a un resultado incorrecto si los miembros del objeto LCMCalculator "a" y/o "b" se modifican después.) // Además, 'gcd' === "gcd", this['gcd'] === this.gcd this [ 'gcd' ] = function () { devolver un ; };            devolver un ; },   // Los nombres de las propiedades de los objetos se pueden especificar mediante cadenas delimitadas por comillas dobles (") o simples ('). "lcm" : function () { // Los nombres de las variables no chocan con las propiedades del objeto, por ejemplo, |lcm| no es | this.lcm|. // no usar | this.a*this.b| para evitar problemas de precisión de FP let lcm = this.a / this.gcd ( ) * this.b ;              // Sólo es necesario calcular el mcm una vez, por lo que "redefine" este método. este . mcm = función () { retorno mcm ; };        devolver mcm ; },   // Los métodos también se pueden declarar usando la sintaxis de ES6 toString () { // Usando los literales de plantilla de ES6 y el operador (+) para concatenar valores return `LCMCalculator: a = ${ this . a } , b = ` + esto . b ; } };        // Definir función de salida genérica; Esta implementación sólo funciona para navegadores web. Función de salida ( x ) { document . cuerpo . appendChild ( documento . createTextNode ( x )); documento . cuerpo . appendChild ( documento . createElement ( 'br' )); }    // Nota: map() y forEach() de la matriz están definidos en JavaScript 1.6. // Se utilizan aquí para demostrar la naturaleza funcional inherente de JavaScript. [ [ 25 , 55 ], [ 21 , 56 ], [ 22 , 58 ], [ 28 , 56 ] ]. map ( function ( par ) { // matriz literal + función de mapeo devuelve nueva LCMCalculator ( par [ 0 ], par [ 1 ]); }). ordenar (( a , b ) => a . lcm () - b . lcm ()) // ordenar con esta función comparativa; => es una forma abreviada de una función, llamada "función de flecha" . para cada uno ( imprimirResultado );                     funcion imprimirResultado ( obj ) { salida ( obj + ", gcd = " + obj . gcd () + ", lcm = " + obj . lcm ()); }           

El siguiente resultado debería mostrarse en la ventana del navegador.

Calculadora LCMC: a = 28, b = 56, mcd = 28, mcm = 56 Calculadora LCMC: a = 21, b = 56, mcd = 7, mcm = 168 Calculadora LCMC: a = 25, b = 55, mcd = 5, mcm = 275 LCMCalculadora: a = 22, b = 58, mcd = 2, mcm = 638

Seguridad

JavaScript y DOM brindan a los autores maliciosos la posibilidad de entregar scripts para ejecutarlos en una computadora cliente a través de la Web. Los autores de navegadores minimizan este riesgo utilizando dos restricciones. En primer lugar, los scripts se ejecutan en un entorno limitado en el que sólo pueden realizar acciones relacionadas con la Web, no tareas de programación de propósito general como la creación de archivos. En segundo lugar, los scripts están restringidos por la política del mismo origen : los scripts de un sitio web no tienen acceso a información como nombres de usuario, contraseñas o cookies enviadas a otro sitio. La mayoría de los errores de seguridad relacionados con JavaScript son infracciones de la misma política de origen o de la zona de pruebas.

Hay subconjuntos de JavaScript general (ADsafe, Secure ECMAScript (SES)) que brindan mayores niveles de seguridad, especialmente en código creado por terceros (como anuncios). [90] [91] Cierre Toolkit es otro proyecto para la incrustación y el aislamiento seguros de JavaScript y HTML de terceros. [92]

La Política de seguridad de contenido es el principal método previsto para garantizar que solo se ejecute código confiable en una página web.

Vulnerabilidades entre sitios

secuencias de comandos entre sitios

Un problema de seguridad común relacionado con JavaScript son las secuencias de comandos entre sitios (XSS), una violación de la política del mismo origen . Las vulnerabilidades XSS ocurren cuando un atacante puede hacer que un sitio web objetivo, como un sitio web de banca en línea, incluya un script malicioso en la página web presentada a la víctima. El script de este ejemplo puede acceder a la aplicación bancaria con los privilegios de la víctima, lo que podría revelar información secreta o transferir dinero sin la autorización de la víctima. Una solución a las vulnerabilidades XSS es utilizar el escape HTML cada vez que se muestran datos que no son de confianza.

Algunos navegadores incluyen protección parcial contra ataques XSS reflejados , en los que el atacante proporciona una URL que incluye un script malicioso. Sin embargo, incluso los usuarios de esos navegadores son vulnerables a otros ataques XSS, como aquellos en los que el código malicioso se almacena en una base de datos. Sólo el diseño correcto de las aplicaciones web en el lado del servidor puede prevenir completamente el XSS.

Las vulnerabilidades XSS también pueden ocurrir debido a errores de implementación por parte de los autores del navegador. [93]

Falsificación de solicitudes entre sitios

Otra vulnerabilidad entre sitios es la falsificación de solicitudes entre sitios (CSRF). En CSRF, el código en el sitio de un atacante engaña al navegador de la víctima para que realice acciones que el usuario no pretendía en el sitio de destino (como transferir dinero en un banco). Cuando los sitios de destino dependen únicamente de cookies para la autenticación de solicitudes, las solicitudes que se originan a partir del código del sitio del atacante pueden llevar las mismas credenciales de inicio de sesión válidas del usuario que las inicia. En general, la solución a CSRF es exigir un valor de autenticación en un campo de formulario oculto, y no sólo en las cookies, para autenticar cualquier solicitud que pueda tener efectos duraderos. También puede resultar útil comprobar el encabezado HTTP Referrer.

El "secuestro de JavaScript" es un tipo de ataque CSRF en el que una <script>etiqueta en el sitio de un atacante explota una página del sitio de la víctima que devuelve información privada como JSON o JavaScript. Las posibles soluciones incluyen:

Confianza fuera de lugar en el cliente

Los desarrolladores de aplicaciones cliente-servidor deben reconocer que los clientes que no son de confianza pueden estar bajo el control de atacantes. El autor de la aplicación no puede asumir que su código JavaScript se ejecutará según lo previsto (o que se ejecutará en absoluto) porque un adversario determinado podría extraer cualquier secreto incrustado en el código. Algunas implicaciones son:

Confianza fuera de lugar en los desarrolladores

Los sistemas de gestión de paquetes como npm y Bower son populares entre los desarrolladores de JavaScript. Estos sistemas permiten a un desarrollador gestionar fácilmente las dependencias de su programa con respecto a las bibliotecas de programas de otros desarrolladores. Los desarrolladores confían en que los mantenedores de las bibliotecas las mantendrán seguras y actualizadas, pero no siempre es así. Ha surgido una vulnerabilidad debido a esta confianza ciega. Las bibliotecas de confianza pueden tener nuevas versiones que provoquen la aparición de errores o vulnerabilidades en todos los programas que dependen de ellas. A la inversa, una biblioteca puede quedar sin parches con vulnerabilidades conocidas en el exterior. En un estudio realizado en una muestra de 133.000 sitios web, los investigadores encontraron que el 37% de los sitios web incluían una biblioteca con al menos una vulnerabilidad conocida. [96] "El retraso medio entre la versión más antigua de la biblioteca utilizada en cada sitio web y la versión más nueva disponible de esa biblioteca es de 1.177 días en ALEXA, y el desarrollo de algunas bibliotecas que aún están en uso activo cesó hace años". [96] Otra posibilidad es que el responsable de una biblioteca pueda eliminarla por completo. Esto ocurrió en marzo de 2016 cuando Azer Koçulu eliminó su repositorio de npm. Esto provocó que decenas de miles de programas y sitios web que dependían de sus bibliotecas fallaran. [97] [98]

Errores de codificación del navegador y del complemento

JavaScript proporciona una interfaz para una amplia gama de capacidades del navegador, algunas de las cuales pueden tener fallas como desbordamientos del búfer . Estas fallas pueden permitir a los atacantes escribir scripts que ejecutarían cualquier código que deseen en el sistema del usuario. Este código no está limitado de ninguna manera a otra aplicación JavaScript. Por ejemplo, un exploit de desbordamiento del búfer puede permitir que un atacante obtenga acceso a la API del sistema operativo con privilegios de superusuario.

Estos fallos han afectado a los principales navegadores, incluidos Firefox, [99] Internet Explorer, [100] y Safari. [101]

Los complementos, como los reproductores de vídeo, Adobe Flash y la amplia gama de controles ActiveX habilitados de forma predeterminada en Microsoft Internet Explorer, también pueden tener fallas explotables a través de JavaScript (dichas fallas se han explotado en el pasado). [102] [103]

En Windows Vista, Microsoft ha intentado contener los riesgos de errores como desbordamientos del búfer ejecutando el proceso de Internet Explorer con privilegios limitados. [104] Google Chrome de manera similar limita sus visualizadores de páginas a su propio " sandbox ".

Errores de implementación de la zona de pruebas

Los navegadores web son capaces de ejecutar JavaScript fuera del entorno limitado, con los privilegios necesarios para, por ejemplo, crear o eliminar archivos. Dichos privilegios no están destinados a otorgarse al código de la Web.

La concesión incorrecta de privilegios a JavaScript desde la Web ha influido en las vulnerabilidades tanto en Internet Explorer [105] como en Firefox. [106] En Windows XP Service Pack 2, Microsoft degradó los privilegios de JScript en Internet Explorer. [107]

Microsoft Windows permite que los archivos fuente de JavaScript en el disco duro de una computadora se ejecuten como programas de propósito general, no en espacio aislado (consulte: Windows Script Host ). Esto hace que JavaScript (como VBScript ) sea un vector teóricamente viable para un caballo de Troya , aunque los caballos de Troya JavaScript son poco comunes en la práctica. [108] [ verificación fallida ]

Vulnerabilidades de hardware

En 2015, investigadores de seguridad describieron en un artículo una implementación de prueba de concepto basada en JavaScript de un ataque de martillo . [109] [110] [111] [112]

En 2017, se demostró un ataque basado en JavaScript a través del navegador que podía eludir ASLR . Se llama "ASLR⊕Cache" o AnC. [113] [114]

En 2018, el documento que anunció los ataques de Spectre contra Speculative Execution en Intel y otros procesadores incluía una implementación de JavaScript. [115]

Herramientas de desarrollo

Herramientas importantes han evolucionado con el lenguaje.

Análisis estático del programa.

ESLint

ESLint es una herramienta de análisis de código estático para identificar patrones problemáticos encontrados en el código JavaScript. Fue creado por Nicholas C. Zakas en 2013. [118] [119] Las reglas en ESLint son configurables y se pueden definir y cargar reglas personalizadas. ESLint cubre cuestiones de calidad y estilo de codificación . ESLint admite los estándares actuales de ECMAScript y la sintaxis experimental de borradores para estándares futuros. El código que usa JSX o TypeScript también se puede procesar cuando se usa un complemento o transpilador. [120] [121]

JSLint

JSLint es una herramienta de análisis de código estático utilizada en el desarrollo de software para comprobar si el código fuente de JavaScript cumple con las reglas de codificación . Se proporciona principalmente como una aplicación web basada en navegador a la que se puede acceder a través del dominio jslint.com, pero también existen adaptaciones de línea de comandos. [122] Fue creado en 2002 por Douglas Crockford . [123]

Incompatibilidad de código

Al ser un lenguaje compilado justo a tiempo, o incluso interpretado, el código JavaScript no se ejecuta en todos los tipos de entornos de ejecución. Dependiendo del navegador y del soporte del motor JavaScript para las numerosas ediciones del estándar ECMAScript, existen tantas variaciones del lenguaje JavaScript. Desde que HTML 4 dejó de usar el atributo de idioma de las etiquetas de script , el código ya no puede detectar la compatibilidad con la versión de JavaScript. En cambio, la cadena User-Agent reconoce el navegador específico que se está utilizando, aunque a menudo esto no es suficiente para garantizar la compatibilidad.

Se espera que los desarrolladores degraden elegantemente el código incompatible y utilicen técnicas de detección de funciones según las pautas de programación normativa. Esto es especialmente importante cuando no se establece la compatibilidad con la estandarización anterior de ES5.1 (ISO/IEC 16262:2011, retirada en mayo de 2018). Los preprocesadores Transpiler como Babel también están disponibles para la conversión automatizada de código ES6+. Ciertos navegadores, entornos de ejecución o incluso versiones instaladas pueden designarse como requisitos del sistema para implementaciones específicas.

Tecnologías relacionadas

Java

Un error común es pensar que JavaScript es lo mismo que Java . De hecho, ambos tienen una sintaxis similar a C (el lenguaje C es su lenguaje ancestro común más inmediato). También suelen estar protegidos (cuando se usan dentro de un navegador) y JavaScript se diseñó teniendo en cuenta la sintaxis y la biblioteca estándar de Java. En particular, todas las palabras clave de Java estaban reservadas en JavaScript original, la biblioteca estándar de JavaScript sigue las convenciones de nomenclatura de Java y JavaScript y los Mathobjetos Datese basan en clases de Java 1.0. [124]

Java y JavaScript aparecieron por primera vez en 1995, pero Java fue desarrollado por James Gosling de Sun Microsystems y JavaScript por Brendan Eich de Netscape Communications.

Las diferencias entre los dos idiomas son más prominentes que sus similitudes. Java tiene escritura estática , mientras que la escritura de JavaScript es dinámica . Java se carga desde el código de bytes compilado , mientras que JavaScript se carga como código fuente legible por humanos. Los objetos de Java se basan en clases , mientras que los de JavaScript se basan en prototipos . Finalmente, Java no dio soporte a la programación funcional hasta Java 8, mientras que JavaScript lo ha hecho desde el principio, siendo influenciado por Scheme .

JSON

JSON (Notación de objetos JavaScript, pronunciado / ˈ s ən / ; también / ˈ ˌ s ɒ n / ) es un formato de archivo estándar abierto y un formato de intercambio de datos que utiliza texto legible por humanos para almacenar y transmitir objetos de datos que consisten en pares y matrices atributo-valor (u otros valores serializables ). Es un formato de datos comúnmente utilizado con diversos usos en el intercambio electrónico de datos , incluido el de aplicaciones web con servidores .

JSON es un formato de datos independiente del idioma . Se deriva de JavaScript, pero muchos lenguajes de programación modernos incluyen código para generar y analizar datos en formato JSON. Los nombres de archivos JSON usan la extensión .json.

Douglas Crockford especificó originalmente el formato JSON a principios de la década de 2000. [125] Él y Chip Morningstar enviaron el primer mensaje JSON en abril de 2001.

Mecanografiado

TypeScript (TS) es una variante estrictamente tipificada de JavaScript. TS se diferencia al introducir anotaciones de tipo a variables y funciones, e introducir un lenguaje de tipos para describir los tipos dentro de JS. De lo contrario, TS comparte prácticamente el mismo conjunto de características que JS, para permitir que se transpile fácilmente a JS para ejecutarlo en el lado del cliente e interoperar con otro código JS. [126]

Asamblea web

Desde 2017, los navegadores web admiten WebAssembly , un formato binario que permite a un motor JavaScript ejecutar partes críticas para el rendimiento de scripts de páginas web cercanas a la velocidad nativa. [127] El código WebAssembly se ejecuta en el mismo entorno limitado que el código JavaScript normal.

asm.js es un subconjunto de JavaScript que sirvió como precursor de WebAssembly. [128]

Transpiladores

JavaScript es el lenguaje dominante del lado del cliente en la Web y muchos sitios web utilizan muchos scripts. Por ello se han creado transpiladores para convertir código escrito en otros lenguajes, lo que puede ayudar en el proceso de desarrollo. [35]

Ájax

Ajax (también AJAX / ˈ æ k s / ; abreviatura de " JavaScript y XML asíncronos " o "Transferencia de JavaScript asíncrono (x-fer)" [129] [130] ) es un conjunto de técnicas de desarrollo web que utiliza varias técnicas de desarrollo web. Tecnologías en el lado del cliente para crear aplicaciones web asincrónicas . Con Ajax, las aplicaciones web pueden enviar y recuperar datos de un servidor de forma asincrónica (en segundo plano) sin interferir con la visualización y el comportamiento de la página existente. Al desacoplar la capa de intercambio de datos de la capa de presentación, Ajax permite que las páginas web y, por extensión, las aplicaciones web cambien el contenido dinámicamente sin la necesidad de recargar toda la página. [131] En la práctica, las implementaciones modernas suelen utilizar JSON en lugar de XML.

Ajax no es una tecnología, sino un concepto de programación. HTML y CSS se pueden utilizar en combinación para marcar y diseñar información. La página web se puede modificar mediante JavaScript para mostrarse dinámicamente y permitir al usuario interactuar con la nueva información. El objeto XMLHttpRequest incorporado se utiliza para ejecutar Ajax en páginas web, lo que permite a los sitios web cargar contenido en la pantalla sin actualizar la página. Ajax no es una tecnología nueva ni un lenguaje nuevo. Más bien, se trata de tecnologías existentes utilizadas de una manera nueva.

Referencias

  1. ^ ab "Netscape y Sun anuncian JavaScript, el lenguaje de secuencias de comandos de objetos abierto y multiplataforma para redes empresariales e Internet" (Presione soltar). 4 de diciembre de 1995. Archivado desde el original el 16 de septiembre de 2007.
  2. ^ "Especificación del lenguaje ECMAScript® 2021". Junio ​​2021 . Consultado el 27 de julio de 2021 .
  3. ^ Error: no se puede mostrar la referencia correctamente. Consulte la documentación para obtener más detalles.
  4. ^ "nodejs/nodo-eps". GitHub . Archivado desde el original el 29 de agosto de 2020 . Consultado el 5 de julio de 2018 .
  5. ^ ab Seibel, Peter (16 de septiembre de 2009). Codificadores en el trabajo: reflexiones sobre el oficio de programar. Presione. ISBN 9781430219484. Archivado desde el original el 24 de diciembre de 2020 . Consultado el 25 de diciembre de 2018 . Eich: La preocupación inmediata en Netscape era que debía parecerse a Java.
  6. ^ abcde "Capítulo 4. Cómo se creó JavaScript". hablandojs.com . Archivado desde el original el 27 de febrero de 2020 . Consultado el 21 de noviembre de 2017 .
  7. ^ "Popularidad - Brendan Eich".
  8. ^ "Brendan Eich: Introducción a JavaScript, JSConf 2010". YouTube . pag. 22m. Archivado desde el original el 29 de agosto de 2020 . Consultado el 25 de noviembre de 2019 . Eich: "función", ocho letras, AWK me influyó.
  9. ^ Eich, Brendan (1998). "Prefacio". En Goodman, Danny (ed.). Biblia JavaScript (3ª ed.). John Wiley e hijos . ISBN 0-7645-3188-3. LCCN  97078208. OCLC  38888873. OL  712205M.
  10. ^ "Estadísticas de uso de JavaScript como lenguaje de programación del lado del cliente en sitios web, enero de 2024". w3techs.com . Consultado el 29 de enero de 2024 .
  11. ^ "Especificación del lenguaje ECMAScript® 2020". Archivado desde el original el 8 de mayo de 2020 . Consultado el 8 de mayo de 2020 .
  12. ^ "Cambiadores de juego de Bloomberg: Marc Andreessen". Bloomberg . Bloomberg. 17 de marzo de 2011. Archivado desde el original el 16 de mayo de 2012 . Consultado el 7 de diciembre de 2011 .
  13. ^ Enzer, Larry (31 de agosto de 2018). "La evolución de los navegadores web". Desarrolladores web de Monmouth . Archivado desde el original el 31 de agosto de 2018 . Consultado el 31 de agosto de 2018 .
  14. ^ ab Fin JS (17 de junio de 2016), Brendan Eich, director ejecutivo de Brave, archivado desde el original el 10 de febrero de 2019 , recuperado 7 de febrero de 2018
  15. ^ "Netscape Communications Corp.", Mejoras en el navegador. DVD de la suite de referencia definitiva de Encyclopædia Britannica 2006
  16. ^ "TechVision: innovadores de la red: Brendan Eich y JavaScript". Archivado desde el original el 8 de febrero de 2008.
  17. ^ ab "Capítulo 5. Estandarización: ECMAScript". hablandojs.com . Archivado desde el original el 1 de noviembre de 2021 . Consultado el 1 de noviembre de 2021 .
  18. ^ ab Champeon, Steve (6 de abril de 2001). "JavaScript, ¿cómo llegamos aquí?". oreilly.com . Archivado desde el original el 19 de julio de 2016 . Consultado el 16 de julio de 2016 .
  19. ^ "Microsoft Internet Explorer 3.0 Beta ya disponible". microsoft.com . Microsoft. 29 de mayo de 1996. Archivado desde el original el 24 de noviembre de 2020 . Consultado el 16 de julio de 2016 .
  20. ^ McCracken, Harry (16 de septiembre de 2010). "El regreso no deseado de" Mejor visto con Internet Explorer"". technologizer.com . Archivado desde el original el 23 de junio de 2018 . Consultado el 16 de julio de 2016 .
  21. ^ Baker, Loren (24 de noviembre de 2004). "La cuota de mercado del navegador de Internet Mozilla Firefox aumenta al 7,4%". Diario del motor de búsqueda . Archivado desde el original el 7 de mayo de 2021 . Consultado el 8 de mayo de 2021 .
  22. ^ Weber, Tim (9 de mayo de 2005). "El asalto al gigante del software Microsoft". Noticias de la BBC . Archivado desde el original el 25 de septiembre de 2017.
  23. ^ "Gran prueba de comparación de navegadores: Internet Explorer frente a Firefox, Opera, Safari y Chrome". Hardware de juegos de PC . Computec Media AG. 3 de julio de 2009. Archivado desde el original el 2 de mayo de 2012 . Consultado el 28 de junio de 2010 .
  24. ^ Purdy, Kevin (11 de junio de 2009). "Pruebas de velocidad de Lifehacker: Safari 4, Chrome 2". Hacker de vida . Archivado desde el original el 14 de abril de 2021 . Consultado el 8 de mayo de 2021 .
  25. ^ "TraceMonkey: JavaScript Lightspeed, blog de Brendan Eich". Archivado desde el original el 4 de diciembre de 2015 . Consultado el 22 de julio de 2020 .
  26. ^ "Mozilla pregunta: '¿Ya somos rápidos?'". Cableado . Archivado desde el original el 22 de junio de 2018 . Consultado el 18 de enero de 2019 .
  27. ^ "ECMAScript 6: Nuevas funciones: descripción general y comparación". es6-features.org . Archivado desde el original el 18 de marzo de 2018 . Consultado el 19 de marzo de 2018 .
  28. ^ Professional Node.js: creación de software escalable basado en JavaScript Archivado el 24 de marzo de 2017 en Wayback Machine , John Wiley & Sons, 1 de octubre de 2012
  29. ^ Sams Aprenda usted mismo Node.js en 24 horas Archivado el 23 de marzo de 2017 en Wayback Machine , Sams Publishing, 5 de septiembre de 2012
  30. ^ Lawton, George (19 de julio de 2018). "La historia secreta detrás del éxito de npm y Node". El lado del servidor . Archivado desde el original el 2 de agosto de 2021 . Consultado el 2 de agosto de 2021 .
  31. ^ Brown, Paul (13 de enero de 2017). "Estado de la Unión: npm". Linux.com . Archivado desde el original el 2 de agosto de 2021 . Consultado el 2 de agosto de 2021 .
  32. ^ ab Branscombe, María (4 de mayo de 2016). "El estándar de JavaScript pasa al calendario de lanzamiento anual; estas son las novedades de ES16". La nueva pila . Archivado desde el original el 16 de enero de 2021 . Consultado el 15 de enero de 2021 .
  33. ^ "El proceso TC39". tc39.es. _ ECMA Internacional. Archivado desde el original el 7 de febrero de 2021 . Consultado el 15 de enero de 2021 .
  34. ^ "Propuestas de ECMAScript". TC39. Archivado desde el original el 4 de diciembre de 2020 . Consultado el 15 de enero de 2021 .
  35. ^ ab Ashkenas, Jeremy . "Lista de lenguajes que se compilan en JS". GitHub . Archivado desde el original el 31 de enero de 2020 . Consultado el 6 de febrero de 2020 .
  36. ^ "Nº de serie de marca registrada de EE. UU. 75026640". uspto.gov . Oficina de Patentes y Marcas de Estados Unidos . 1997-05-06. Archivado desde el original el 13 de julio de 2021 . Consultado el 8 de mayo de 2021 .
  37. ^ "Avisos legales". oracle.com . Corporación Oráculo . Archivado desde el original el 5 de junio de 2021 . Consultado el 8 de mayo de 2021 .
  38. ^ "Oracle comprará Sun en un acuerdo de 7,4 mil millones de dólares". Los tiempos económicos . 21 de abril de 2009.
  39. ^ "Estadísticas de uso de JavaScript como lenguaje de programación del lado del cliente en sitios web". w3techs.com . 2021-04-09. Archivado desde el original el 13 de febrero de 2022 . Consultado el 9 de abril de 2021 .
  40. ^ ab "Estadísticas de uso de bibliotecas JavaScript para sitios web". w3techs.com . Archivado desde el original el 26 de mayo de 2012 . Consultado el 9 de abril de 2021 .
  41. ^ "React: una biblioteca de JavaScript para crear interfaces de usuario". reaccionarjs.org . Archivado desde el original el 8 de abril de 2018 . Consultado el 7 de abril de 2018 .
  42. ^ "Capítulo 1. ¿Qué es React? - Qué es React y por qué es importante [Libro]". www.oreilly.com . Archivado desde el original el 6 de mayo de 2023 . Consultado el 6 de mayo de 2023 .
  43. ^ Krill, Paul (15 de mayo de 2014). "React: creación de interfaces de usuario más rápidas y fluidas para aplicaciones web basadas en datos". InfoMundo . Consultado el 23 de febrero de 2021 .
  44. ^ Hemel, Zef (3 de junio de 2013). "La biblioteca de interfaces de usuario React JavaScript de Facebook recibe críticas mixtas". infoq.com . Archivado desde el original el 26 de mayo de 2022 . Consultado el 11 de enero de 2022 .
  45. ^ Dawson, Chris (25 de julio de 2014). "La historia de JavaScript y cómo condujo a ReactJS". La nueva pila . Archivado desde el original el 6 de agosto de 2020 . Consultado el 19 de julio de 2020 .
  46. ^ En 2017.
  47. ^ Panchal 2022.
  48. ^ "AngularJS y Angular 2+: una comparación detallada". 6 de abril de 2018.
  49. ^ "Vainilla JS". vanilla-js.com . 2020-06-16. Archivado desde el original el 16 de junio de 2020 . Consultado el 17 de junio de 2020 .
  50. ^ "Guía de JavaScript del lado del servidor". oracle.com . Corporación Oráculo . 11 de diciembre de 1998. Archivado desde el original el 11 de marzo de 2021 . Consultado el 8 de mayo de 2021 .
  51. ^ Clinick, Andrew (14 de julio de 2000). "Presentación de JScript .NET". Red de desarrolladores de Microsoft . Microsoft. Archivado desde el original el 10 de noviembre de 2017 . Consultado el 10 de abril de 2018 . [Des]de la introducción de JScript versión 1.0 en 1996... hemos estado viendo un aumento constante en el uso de JScript en el servidor, particularmente en Active Server Pages (ASP).
  52. ^ ab Mahemoff, Michael (17 de diciembre de 2009). "JavaScript del lado del servidor, de vuelta con venganza". leer y escribir.com . Archivado desde el original el 17 de junio de 2016 . Consultado el 16 de julio de 2016 .
  53. ^ "JavaScript para Acrobat". adobe.com . 2009-08-07. Archivado desde el original el 7 de agosto de 2009 . Consultado el 18 de agosto de 2009 .
  54. ^ treiter (2 de febrero de 2013). "Respondiendo a la pregunta:" ¿Cómo desarrollo una aplicación para GNOME? livejournal.com . Archivado desde el original el 11 de febrero de 2013 . Consultado el 7 de febrero de 2013 .
  55. ^ "Tessel 2... Aproveche todas las bibliotecas de Node.JS para crear dispositivos útiles en minutos con Tessel". tessel.io . Archivado desde el original el 26 de mayo de 2021 . Consultado el 8 de mayo de 2021 .
  56. ^ "Introducción a Node.js Raspberry Pi GPIO". w3schools.com . Archivado desde el original el 13 de agosto de 2021 . Consultado el 3 de mayo de 2020 .
  57. ^ "Espruino - JavaScript para microcontroladores". espruino.com . Archivado desde el original el 1 de mayo de 2020 . Consultado el 3 de mayo de 2020 .
  58. ^ Looper, Jen (21 de septiembre de 2015). "Una guía de motores JavaScript para idiotas". Red de desarrolladores de Telerik . Archivado desde el original el 8 de diciembre de 2018 . Consultado el 8 de diciembre de 2018 .
  59. ^ "Modelo de concurrencia y bucle de eventos". Red de desarrolladores de Mozilla . Archivado desde el original el 5 de septiembre de 2015 . Consultado el 28 de agosto de 2015 .
  60. ^ "Manual Deno". deno.tierra . Consultado el 17 de mayo de 2019 .
  61. ^ Schiemann, Dylan (26 de diciembre de 2018). "Deno: tiempo de ejecución seguro de TypeScript V8 del creador original de Node.js". InfoQ . Archivado desde el original el 17 de mayo de 2019 . Consultado el 17 de mayo de 2019 .
  62. ^ Flanagan, David (17 de agosto de 2006). JavaScript: la guía definitiva: la guía definitiva. "O'Reilly Media, Inc.". pag. 16.ISBN _ 978-0-596-55447-7. Archivado desde el original el 1 de agosto de 2020 . Consultado el 29 de marzo de 2019 .
  63. ^ abcd Korolev, Mikhail (1 de marzo de 2019). "Peculiaridades de JavaScript en una imagen de Internet". La comunidad DEV . Archivado desde el original el 28 de octubre de 2019 . Consultado el 28 de octubre de 2019 .
  64. ^ Bernhardt, Gary (2012). "Qué". Destruya todo el software . Archivado desde el original el 28 de octubre de 2019 . Consultado el 28 de octubre de 2019 .
  65. ^ "Tipos de datos y estructuras de datos de JavaScript". MDN . 16 de febrero de 2017. Archivado desde el original el 14 de marzo de 2017 . Consultado el 24 de febrero de 2017 .
  66. ^ Flanagan 2006, págs. 176-178.
  67. ^ Crockford, Douglas. "Herencia prototípica en JavaScript". Archivado desde el original el 13 de agosto de 2013 . Consultado el 20 de agosto de 2013 .
  68. ^ "La herencia y la cadena de prototipos". Red de desarrolladores de Mozilla . Archivado desde el original el 25 de abril de 2013 . Consultado el 6 de abril de 2013 .
  69. ^ Herman, David (2013). JavaScript efectivo. Addison-Wesley. pag. 83.ISBN _ 978-0-321-81218-6.
  70. ^ Haverbeke, Marijn (2011). JavaScript elocuente. Sin prensa de almidón. págs. 95–97. ISBN 978-1-59327-282-1.
  71. ^ Katz, Yehuda (12 de agosto de 2011). "Comprensión de los" prototipos "en JavaScript". Archivado desde el original el 5 de abril de 2013 . Consultado el 6 de abril de 2013 .
  72. ^ Herman, David (2013). JavaScript efectivo. Addison-Wesley. págs. 125-127. ISBN 978-0-321-81218-6.
  73. ^ "Función: JavaScript". Documentos web de MDN . Consultado el 30 de octubre de 2021 .
  74. ^ "Propiedades del objeto función". Es5.github.com. Archivado desde el original el 28 de enero de 2013 . Consultado el 26 de mayo de 2013 .
  75. ^ Flanagan 2006, pag. 141.
  76. ^ Los muchos talentos de JavaScript para generalizar enfoques de programación orientada a roles como Traits y Mixins Archivado el 5 de octubre de 2017 en Wayback Machine , Peterseliger.blogpsot.de, 11 de abril de 2014.
  77. ^ Rasgos de JavaScript Archivado el 24 de julio de 2014 en Wayback Machine , 2010.
  78. ^ "Inicio | CóctelJS". Cocktailjs.github.io . Archivado desde el original el 4 de febrero de 2017 . Consultado el 24 de febrero de 2017 .
  79. ^ Croll, Angus (31 de mayo de 2011). "Una nueva mirada a los Mixins de JavaScript". JavaScript, JavaScript… . Archivado desde el original el 15 de abril de 2020.
  80. ^ Haverbeke, Marijn (2011). JavaScript elocuente. Sin prensa de almidón. págs. 139-149. ISBN 978-1-59327-282-1.
  81. ^ "E4X - Archivo de contenido obsoleto". Red de desarrolladores de Mozilla . Fundación Mozilla. 14 de febrero de 2014. Archivado desde el original el 24 de julio de 2014 . Consultado el 13 de julio de 2014 .
  82. ^ "var-JavaScript". La red de desarrolladores de Mozilla . Archivado desde el original el 23 de diciembre de 2012 . Consultado el 22 de diciembre de 2012 .
  83. ^ "dejar". Documentos web de MDN . Mozilla. Archivado desde el original el 28 de mayo de 2019 . Consultado el 27 de junio de 2018 .
  84. ^ "constante". Documentos web de MDN . Mozilla. Archivado desde el original el 28 de junio de 2018 . Consultado el 27 de junio de 2018 .
  85. ^ "Especificación del lenguaje ECMAScript - ECMA-262 Edición 5.1". ECMA Internacional . Archivado desde el original el 26 de noviembre de 2012 . Consultado el 22 de diciembre de 2012 .
  86. ^ "consola". Red de desarrolladores de Mozilla . Mozilla . Archivado desde el original el 28 de febrero de 2013 . Consultado el 6 de abril de 2013 .
  87. ^ "argumentos". Red de desarrolladores de Mozilla . Mozilla . Archivado desde el original el 13 de abril de 2013 . Consultado el 6 de abril de 2013 .
  88. ^ "función* - JavaScript | MDN". desarrollador.mozilla.org . Consultado el 27 de septiembre de 2022 .
  89. ^ "Módulos de JavaScript". Documentos web de MDN . Mozilla. Archivado desde el original el 17 de julio de 2022 . Consultado el 28 de julio de 2022 .
  90. ^ "Hacer que JavaScript sea seguro para la publicidad". ADseguro. Archivado desde el original el 6 de julio de 2021 . Consultado el 8 de mayo de 2021 .
  91. ^ "Secuencia de comandos ECMA segura (SES)". Archivado desde el original el 15 de mayo de 2013 . Consultado el 26 de mayo de 2013 .
  92. ^ "Proyecto Google Caja". Google . Archivado desde el original el 22 de enero de 2021 . Consultado el 9 de julio de 2021 .
  93. ^ "Vulnerabilidad de secuencias de comandos entre sitios de Mozilla informada y solucionada: MozillaZine Talkback". Mozillazine.org . Archivado desde el original el 21 de julio de 2011 . Consultado el 24 de febrero de 2017 .
  94. ^ Kottelin, Thor (17 de junio de 2008). ¿"Protección" del botón derecho del ratón? Olvídalo. blog.anta.net . Archivado desde el original el 9 de agosto de 2011 . Consultado el 28 de julio de 2022 .
  95. ^ Rehorik, enero (29 de noviembre de 2016). "Por qué nunca debería incluir datos confidenciales en su JavaScript". Blog de objetos de servicio . Objetos de servicio. Archivado desde el original el 3 de junio de 2019 . Consultado el 3 de junio de 2019 .
  96. ^ ab Lauinger, Tobías; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Cristo; Kirda, Engin (21 de diciembre de 2016), "No dependerás de mí: análisis del uso de bibliotecas de JavaScript obsoletas en la Web" (PDF) , Northeastern University , arXiv : 1811.00918 , doi :10.14722/ndss.2017.23414, ISBN 978-1-891562-46-4, S2CID  17885720, archivado desde el original (PDF) el 29 de marzo de 2017 , recuperado 28 de julio 2022
  97. ^ Collins, Keith (27 de marzo de 2016). "Cómo un programador rompió Internet eliminando un pequeño fragmento de código". Cuarzo . Archivado desde el original el 22 de febrero de 2017 . Consultado el 22 de febrero de 2017 .
  98. ^ SC Magazine UK, Las 11 líneas de código eliminado del desarrollador 'rompen Internet' Archivado el 23 de febrero de 2017 en Wayback Machine .
  99. ^ Mozilla Corporation, Desbordamiento de búfer en crypto.signText() Archivado el 4 de junio de 2014 en Wayback Machine.
  100. ^ Festa, Paul (19 de agosto de 1998). "Error de desbordamiento de búfer en IE". CNET . Archivado desde el original el 25 de diciembre de 2002.
  101. ^ SecurityTracker.com, El desbordamiento del búfer de JavaScript de Apple Safari permite a los usuarios remotos ejecutar código arbitrario y el error de redireccionamiento HTTP permite a los usuarios remotos acceder a archivos Archivado el 18 de febrero de 2010 en Wayback Machine.
  102. ^ SecurityFocus, Microsoft WebViewFolderIcon Vulnerabilidad de desbordamiento del búfer de control ActiveX Archivado el 11 de octubre de 2011 en Wayback Machine.
  103. ^ Fusion Authority, Desbordamiento del búfer ActiveX de Macromedia Flash Archivado el 13 de agosto de 2011 en Wayback Machine.
  104. ^ "Modo protegido en Vista IE7 - IEBlog". Blogs.msdn.com . 9 de febrero de 2006. Archivado desde el original el 23 de enero de 2010 . Consultado el 24 de febrero de 2017 .
  105. ^ CERT de EE. UU., Nota de vulnerabilidad VU#713878: Microsoft Internet Explorer no valida correctamente la fuente del marco redirigido Archivado el 30 de octubre de 2009 en Wayback Machine.
  106. ^ Fundación Mozilla, Aviso de seguridad de la Fundación Mozilla 2005–41: escalada de privilegios mediante anulaciones de propiedades DOM Archivado el 4 de junio de 2014 en Wayback Machine.
  107. ^ Andersen, Starr (9 de agosto de 2004). "Parte 5: Seguridad de navegación mejorada". Technet . Documentos de Microsoft . Cambios en la funcionalidad del Service Pack 2 de Windows XP . Consultado el 20 de octubre de 2021 .
  108. ^ Para ver un ejemplo de un caballo de Troya JavaScript poco común, consulte Symantec Corporation, JS.Seeker.K Archivado el 13 de septiembre de 2011 en Wayback Machine.
  109. ^ Gruss, Daniel; Mauricio, Clementina; Mangard, Stefan (24 de julio de 2015). "Rowhammer.js: un ataque de falla remoto inducido por software en JavaScript". arXiv : 1507.06955 [cs.CR].
  110. ^ Jean-Pharuns, Alix (30 de julio de 2015). "Rowhammer.js es el truco más ingenioso que he visto jamás". Tarjeta madre . Vicio . Archivado desde el original el 27 de enero de 2018 . Consultado el 26 de enero de 2018 .
  111. ^ Goodin, Dan (4 de agosto de 2015). "Explotación DRAM 'Bitflipping' para atacar PC: simplemente agregue JavaScript". Ars Técnica . Archivado desde el original el 27 de enero de 2018 . Consultado el 26 de enero de 2018 .
  112. ^ Auerbach, David (28 de julio de 2015). "Explotación de seguridad de Rowhammer: por qué un nuevo ataque de seguridad es realmente aterrador". pizarra.com . Archivado desde el original el 30 de julio de 2015 . Consultado el 29 de julio de 2015 .
  113. ^ AnC Archivado el 16 de marzo de 2017 en Wayback Machine VUSec, 2017
  114. ^ El nuevo JavaScript que rompe ASLR está a punto de hacer que los exploits drive-by sean mucho más desagradables. Archivado el 16 de marzo de 2017 en Wayback Machine Ars Technica, 2017.
  115. ^ Ataque de espectro Archivado el 3 de enero de 2018 en Wayback Machine Ataque de espectro
  116. ^ "Benchmark.js". benchmarkjs.com . Archivado desde el original el 19 de diciembre de 2016 . Consultado el 6 de noviembre de 2016 .
  117. ^ JSBEN.CH. "Página de juego de evaluación comparativa de rendimiento JSBEN.CH para JavaScript". jsben.ch . Archivado desde el original el 27 de febrero de 2021 . Consultado el 13 de agosto de 2021 .
  118. ^ "Primera confirmación: eslint/eslint". GitHub . Consultado el 5 de julio de 2019 .
  119. ^ Zakas, Nicholas C. (16 de julio de 2013). "Presentación de ESLint". nczonline.net . Consultado el 26 de febrero de 2018 . JSLint era lo último en tecnología de linting de JavaScript
  120. ^ "El futuro de TypeScript en ESLint". ESLint: linter de JavaScript conectable . Consultado el 24 de abril de 2020 .
  121. ^ "Auditoría de accesibilidad con eslint-plugin-jsx-a11y". web.dev . Desarrolladores de Google. 2019-04-29 . Consultado el 24 de abril de 2020 . El [complemento ELint] puede ayudar a identificar [problemas] en su JSX.
  122. ^ "JSLint desde la línea de comandos". www.hacksparrow.com . Enero de 2013. Archivado desde el original el 27 de febrero de 2018 . Consultado el 26 de febrero de 2018 .
  123. ^ "primer compromiso". GitHub . 2010-11-12 . Consultado el 25 de febrero de 2018 . Copyright 2002 Douglas Crockford. ¡Todos los derechos reservados en todo el mundo y más allá!
  124. ^ Eich, Brendan (3 de abril de 2008). "Popularidad". Archivado desde el original el 3 de julio de 2011 . Consultado el 19 de enero de 2012 .
  125. ^ "Douglas Crockford: la saga JSON". YouTube. 2011-08-28 . Consultado el 21 de febrero de 2022 .
  126. ^ "TypeScript: JavaScript con sintaxis para tipos". Typescriptlang.org . Consultado el 12 de agosto de 2022 .
  127. ^ "Edge Browser cambia WebAssembly a 'Activado' - Revista Visual Studio". Revista Visual Studio . Archivado desde el original el 10 de febrero de 2018 . Consultado el 9 de febrero de 2018 .
  128. ^ "preguntas frecuentes". asm.js. Archivado desde el original el 4 de junio de 2014 . Consultado el 13 de abril de 2014 .
  129. ^ Jesse James Garrett (18 de febrero de 2005). "Ajax: un nuevo enfoque para las aplicaciones web". AdaptivePath.com. Archivado desde el original el 10 de septiembre de 2015 . Consultado el 19 de junio de 2008 .
  130. ^ "Ajax: guías para desarrolladores web". Documentos web de MDN . Archivado desde el original el 28 de febrero de 2018 . Consultado el 27 de febrero de 2018 .
  131. ^ Ullman, Chris (marzo de 2007). Empezando por el Ajax. wrox. ISBN 978-0-470-10675-4. Archivado desde el original el 5 de julio de 2008 . Consultado el 24 de junio de 2008 .

Fuentes

Otras lecturas

enlaces externos

Escuche este artículo ( 48 minutos )
Icono de Wikipedia hablado
Este archivo de audio se creó a partir de una revisión de este artículo con fecha del 20 de agosto de 2013 y no refleja ediciones posteriores. (2013-08-20)