Página protegida con cambios pendientes
Escuche este articulo
De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

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 .

Historia [ editar ]

Creación en Netscape [ editar ]

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, a veces dando la impresión de que es un derivado de 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 [ editar ]

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 surgimiento de JScript [ editar ]

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 [ editar ]

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 documento técnico 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 una página completa. 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 [ editar ]

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]

Marca comercial [ editar ]

"JavaScript" es una marca comercial de Oracle Corporation en los Estados Unidos. [31] Se utiliza bajo licencia para tecnología inventada e implementada por Netscape Communications y otras partes. [32]

Uso del sitio web del lado del cliente [ editar ]

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 programado [ editar ]

  • 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 [ editar ]

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[ editar ]

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]

Funciones [ editar ]

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 [ editar ]

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]

Mecanografiado débilmente [ editar ]

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ámico [ editar ]

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) [ editar ]

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 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 ArrayoObject, 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 [ editar ]

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 [ editar ]

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.

Varios [ editar ]

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 <script> ). Esta no es una característica del lenguaje per se, 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 de la funcióny variables locales . 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 de la cola. Esto se denomina bucle de eventos y se describe como "ejecutar hasta el final" porque cada mensaje se procesa por completo antes de que se considere 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 la base de datos devuelva información. [59]
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 . Las funciones variables también se pueden crear utilizando el bindmétodo.
Literales de matriz y objeto
Como muchos lenguajes de programación, las matrices y los objetos ( matrices asociativas en otros lenguajes) pueden crearse cada uno con una sintaxis sucinta de acceso directo. De hecho, estos literales forman la base del formato de datos JSON .
Expresiones regulares
JavaScript también admite expresiones regulares de una manera similar a Perl , que proporciona una sintaxis concisa y poderosa para la manipulación de texto que es más sofisticada que las funciones de cadena integradas. [60]
Promesas
JavaScript también admite promesas, que son una forma de manejar operaciones asincrónicas. Hay un objeto Promise incorporado que da acceso a muchas funcionalidades para manejar las promesas y define cómo deben manejarse. Permite asociar controladores con el valor eventual de éxito o la razón del fracaso de una acción asincrónica. Esto permite que los métodos asincrónicos devuelvan valores como los métodos síncronos: en lugar de devolver inmediatamente el valor final, el método asincrónico devuelve una promesa de proporcionar el valor en algún momento en el futuro. Recientemente, se introdujeron métodos de combinación en la especificación de JavaScript, lo que permite a los desarrolladores combinar múltiples promesas de JavaScript y realizar operaciones sobre la base de diferentes escenarios. Los métodos introducidos son: Promise.race, Promise.all, Promise.allSettled y Promise.any.

Extensiones específicas del proveedor [ editar ]

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

  • catchcláusulas condicionales (como Java)
  • comprensión de matrices y expresiones generadoras (como Python)
  • Expresiones de función concisas ( function(args) expr; esta sintaxis experimental es anterior a las funciones de flecha)
  • ECMAScript para XML (E4X), una extensión que agrega soporte XML nativo a ECMAScript (no compatible con Firefox desde la versión 21 [61] )

Sintaxis [ editar ]

Ejemplos simples [ editar ]

Las variables en JavaScript se pueden definir utilizando las palabras clave var, [62] let[63] o const[64] .

// Declara una variable de ámbito de función llamada `x`, y le asigna implícitamente el // valor especial` undefined`. Las variables sin valor se // definen automáticamente como indefinidas. var  x ;// Las variables se pueden establecer manualmente en `undefined` como var  x2  =  undefined ;// Declara una variable de ámbito de bloque llamada `y`, y la establece implícitamente en //` undefined`. La palabra clave `let` se introdujo en ECMAScript 2015. let  y ;// Declara una variable no reasignable de ámbito de bloque llamada `z`, y la establece en // una cadena literal. La palabra clave `const` también se introdujo en ECMAScript 2015, // y debe asignarse explícitamente a.// La palabra clave `const` significa constante, por lo que la variable no se puede reasignar // ya que el valor es` constante`. const  z  =  "¡este valor no se puede reasignar!" ;// Declara una variable llamada `myNumber` y le asigna un número literal (el valor //` 2`). let  myNumber  =  2 ;// Reasigna `myNumber`, configurándolo como una cadena literal (el valor` "foo" `). // JavaScript es un lenguaje escrito dinámicamente, por lo que esto es legal. myNumber  =  "foo" ;

Tenga en cuenta los comentarios en el ejemplo anterior, todos los cuales fueron precedidos por dos barras diagonales .

No hay una funcionalidad de entrada / salida incorporada en JavaScript; el entorno de tiempo de ejecución lo proporciona. La especificación ECMAScript en la edición 5.1 menciona: [65]

de hecho, no existen disposiciones en esta especificación para la entrada de datos externos o la salida de resultados calculados.

Sin embargo, la mayoría de los entornos de ejecución tienen un consoleobjeto [66] que se puede utilizar para imprimir la salida. Aquí hay un programa minimalista de Hello World en JavaScript:

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

Una función recursiva simple :

función  factorial ( n )  {  if  ( n  ===  0 )  return  1 ;  // ¡0! = 1 return  n  *  factorial ( n  -  1 ); }factorial ( 3 );  // devuelve 6

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

función  contador ()  {  dejar  contar  =  0 ;  función de retorno ()  {  recuento de retorno  ++ ; }; } dejar  cierre  =  contador (); cierre ();  // devuelve 1 cierre ();  // devuelve 2 cierre ();  // 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 de naturaleza anónima; se necesita una variable para hacer referencia a ellos para poder invocarlos después de su creación.

Ejemplo de función de flecha:

// Las funciones de flecha nos permiten omitir la palabra clave `function`. // 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 // Así que aquí está (input1 + input2) const  short_example  =  ( input1 ,  input2 )  =>  input1  +  input2 ;long_example ( 2 ,  3 );  // Imprime "¡Hola, mundo!" y devuelve 5 short_example ( 2 ,  5 );  // Devuelve 7// Si una función de flecha solo tiene un parámetro, se pueden eliminar los paréntesis. const  no_parentheses  =  input  =>  input  +  2 ;sin_paréntesis ( 3 );  // Devuelve 5

En JavaScript, los objetos se crean de la misma forma que las funciones; esto se conoce como un objeto de función .

Ejemplo de objeto:

función  Ball ( r )  {  esto . radio  =  r ;  // el argumento "r" es local al objeto ball  this . área  =  Matemáticas . PI  *  ( r  **  2 );  // los paréntesis no hacen más que aclarar  // los objetos pueden contener funciones ("método")  this . show  =  function ()  {  drawCircle ( este . radio );  // hace referencia a otra función (que dibuja un círculo)  }; }let  myBall  =  new  Ball ( 5 );  // crea una nueva instancia del objeto bola con radio 5 myBall . radio ++ ;  // Las propiedades del objeto normalmente se pueden modificar desde el exterior de myBall . mostrar ();  // usando la función heredada "mostrar"

Demostración de función variádica ( argumentses una variable especial ): [67]

función  suma ()  {  sea  x  =  0 ; for  ( sea  i  =  0 ;  i  <  argumentos . longitud ;  ++ i )  x  + =  argumentos [ i ]; return  x ; }suma ( 1 ,  2 );  // devuelve 3 sum ( 1 ,  2 ,  3 );  // devuelve 6

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

let  counter  =  ( function ()  {  let  i  =  0 ;  // propiedad privada return  {  // métodos públicos  get :  function ()  {  alert ( i );  },  establecer :  función ( valor )  {  i  =  valor ;  },  incremento :  función ()  {  alerta ( ++ i );  }  }; }) ();  // módulocontador . obtener ();  // muestra 0 contador . conjunto ( 6 ); contador . incremento ();  // muestra el contador 7 . incremento ();  // muestra 8

Exportación e importación de módulos en JavaScript [68]

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  name  =  'Alice' ; exportar  let  age  =  23 ;// Exportar funciones nombradas export  function  add ( num1 ,  num2 )  {  return  num1  +  num2 ; }// Exportar clase exportar  clase  Multiplication  {  constructor ( num1 ,  num2 )  {  this . num1  =  num1 ;  esto . num2  =  num2 ;  } add ()  {  devuelve la  suma ( este . num1 ,  este . num2 );  } }

Ejemplo de importación:

// Importar una propiedad import  {  add  }  from  './mymodule.js' ;consola . log ( agregar ( 1 ,  2 ));  // 3// Importar varias propiedades import  {  name ,  age  }  from  './mymodule.js' ; consola . log ( nombre ,  edad ); //> "Alice", 23// Importar todas las propiedades de una importación de  módulo *  desde  la consola './module.js' . log ( nombre ,  edad ); //> "Alice", 23 consola . log ( agregar ( 1 , 2 )); //> 3

Ejemplo más avanzado [ editar ]

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

/ * Encuentra el mínimo común múltiplo (LCM) de dos números * / function  LCMCalculator ( x ,  y )  {  // función constructora  let  checkInt  =  function ( x )  {  // función interna  if  ( x  %  1  ! ==  0 )  throw  new  TypeError ( x  +  "no es un número entero" );  // var a = mouseX return  x ;  };  esto . a  =  checkInt ( x )  // punto y coma ^^^^ son opcionales, una nueva línea es suficiente para  esto . b  =  checkInt ( y ); } // El prototipo de instancias de objeto creado por un constructor es // la propiedad "prototype" de ese constructor. Calculadora LCM . prototype  =  {  //  constructor literal de objeto :  LCMCalculator ,  // al reasignar un prototipo, establezca la propiedad del constructor apropiadamente  gcd :  function ()  { // 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; b = a; a = t;  [ a ,  b ]  =  [ b ,  a ];  // intercambio usando asignación de desestructuración (ES6)  } while  ( b  ! ==  0 )  {  t  =  b ;  b  =  a  %  b ;  a  =  t ;  } // Solo es necesario calcular el GCD una vez, así que "redefina" 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 posteriormente.)  // Además, 'gcd' === "gcd", esto ['gcd'] === esto.gcd  esto [ 'gcd' ]  =  función ()  {  volver  a ;  }; return  a ;  }, // Los nombres de las propiedades del objeto 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 | esto. lcm |.  // no usar | this.a * this.b | para evitar problemas de precisión de FP  deje que  lcm  =  this . a  /  this . gcd ()  *  this . b ;  // Solo es necesario calcular el mcm una vez, así que "redefine" este método.  esto . lcm  =  function ()  {  return  lcm ;  }; return  lcm ;  }, toString :  function ()  {  return  "LCMCalculator: a ="  +  this . a  +  ", b ="  +  esto . b ;  } };// Definir función de salida genérica; esta implementación solo funciona para la función de los  navegadores web output ( x )  {  document . cuerpo . appendChild ( documento . createTextNode ( x ));  documento . cuerpo . appendChild ( documento . createElement ( 'br' )); }// Nota: map () y forEach () de Array se definen en JavaScript 1.6. // Se utilizan aquí para demostrar la naturaleza funcional inherente de JavaScript. [  [ 25 ,  55 ],  [ 21 ,  56 ],  [ 22 ,  58 ],  [ 28 ,  56 ] ]. map ( función ( par )  {  // literal de matriz + función de mapeo  return  new  LCMCalculator ( par [ 0 ],  par [ 1 ]); }).sort (( a ,  b )  =>  a . lcm ()  -  b . lcm ())  // ordena con esta función comparativa; => es una forma abreviada de una función, llamada "función de flecha"  . forEach ( printResult );function  printResult ( obj )  {  salida ( obj  +  ", gcd ="  +  obj . gcd ()  +  ", lcm ="  +  obj . lcm ()); }

La siguiente salida debería mostrarse en la ventana del navegador.

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

Seguridad [ editar ]

JavaScript y DOM brindan la posibilidad de que los autores malintencionados entreguen scripts para que se ejecuten en una computadora cliente a través de la Web. Los autores de navegadores minimizan este riesgo mediante dos restricciones. Primero, los scripts se ejecutan en una caja de arena en la que solo pueden realizar acciones relacionadas con la Web, no tareas de programación de propósito general como crear archivos. En segundo lugar, las secuencias de comandos están restringidas por la política del mismo origen : las secuencias de comandos 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 el código creado por terceros (como anuncios). [69] [70] Caja es otro proyecto para la incrustación segura y el aislamiento de JavaScript y HTML de terceros.

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

Vulnerabilidades entre sitios [ editar ]

Un problema de seguridad común relacionado con JavaScript es la secuencia 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 en este ejemplo puede acceder a la aplicación bancaria con los privilegios de la víctima, potencialmente revelando información secreta o transfiriendo dinero sin la autorización de la víctima. Una solución a las vulnerabilidades XSS es utilizar el escape HTML siempre que se muestren datos que no sean 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. Solo el diseño correcto de las aplicaciones web en el lado del servidor puede evitar completamente XSS.

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

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 un sitio de destino (como transferir dinero en un banco). Cuando los sitios de destino dependen únicamente de las 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 inició. En general, la solución para CSRF es requerir un valor de autenticación en un campo de formulario oculto, y no solo en las cookies, para autenticar cualquier solicitud que pueda tener efectos duraderos. Verificar el encabezado HTTP Referrer también puede ayudar.

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:

  • requiriendo un token de autenticación en los parámetros POST y GET para cualquier respuesta que devuelva información privada.

Confianza fuera de lugar en el cliente [ editar ]

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 en absoluto) porque un adversario determinado podría extraer cualquier secreto incrustado en el código. Algunas implicaciones son:

  • Los autores de sitios web no pueden ocultar perfectamente cómo funciona su JavaScript porque el código fuente sin formato debe enviarse al cliente. El código puede ofuscarse , pero la ofuscación puede modificarse mediante ingeniería inversa.
  • La validación de formularios JavaScript solo brinda comodidad a los usuarios, no seguridad. Si un sitio verifica que el usuario aceptó sus términos de servicio, o filtra caracteres no válidos de campos que solo deben contener números, debe hacerlo en el servidor, no solo en el cliente.
  • Los scripts se pueden deshabilitar de forma selectiva, por lo que no se puede confiar en JavaScript para evitar operaciones como hacer clic con el botón derecho en una imagen para guardarla. [72]
  • Se considera una muy mala práctica incrustar información confidencial, como contraseñas, en JavaScript porque puede ser extraída por un atacante. [73]

Confianza fuera de lugar en los desarrolladores [ editar ]

Los sistemas de gestión de paquetes como npm y Bower son populares entre los desarrolladores de JavaScript. Dichos sistemas permiten a un desarrollador administrar fácilmente las dependencias de su programa en las bibliotecas de programas de otros desarrolladores. Los desarrolladores confían en que los encargados 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 confiables pueden tener nuevas versiones que provoquen la aparición de errores o vulnerabilidades en todos los programas que dependen de las bibliotecas. A la inversa, una biblioteca puede quedar sin parches con vulnerabilidades conocidas en la naturaleza. En un estudio realizado con 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. [74]"El retraso medio entre la versión de biblioteca más antigua 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 todavía están en uso activo cesó hace años". [74] Otra posibilidad es que el responsable de la biblioteca pueda eliminarla por completo. Esto ocurrió en marzo de 2016 cuando Azer Koçulu eliminó su repositorio de npm . Esto provocó la rotura de decenas de miles de programas y sitios web que dependían de sus bibliotecas. [75] [76]

Errores de codificación del navegador y del complemento [ editar ]

JavaScript proporciona una interfaz para una amplia gama de capacidades del navegador, algunas de las cuales pueden tener fallas, como desbordamientos de 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, una vulnerabilidad de saturación del búfer puede permitir que un atacante obtenga acceso a la API del sistema operativo con privilegios de superusuario.

Estos defectos han afectado a los principales navegadores, incluidos Firefox, [77] Internet Explorer, [78] y Safari. [79]

Los complementos, como los reproductores de video, Adobe Flash y la amplia gama de controles ActiveX habilitados por defecto en Microsoft Internet Explorer, también pueden tener fallas explotables a través de JavaScript (tales fallas se han aprovechado en el pasado). [80] [81]

En Windows Vista, Microsoft ha intentado contener los riesgos de errores, como desbordamientos de búfer, ejecutando el proceso de Internet Explorer con privilegios limitados. [82] De manera similar, Google Chrome limita sus procesadores de páginas a su propia "caja de arena".

Errores de implementación de la zona de pruebas [ editar ]

Los navegadores web pueden ejecutar JavaScript fuera de la zona de pruebas, 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 de Internet Explorer [83] y Firefox. [84] En Windows XP Service Pack 2, Microsoft degradó los privilegios de JScript en Internet Explorer. [85]

Microsoft Windows permite que los archivos de origen JavaScript en el disco duro de una computadora se inicien como programas de uso general que no sean de 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. [86] [ verificación fallida ]

Vulnerabilidades de hardware [ editar ]

En 2015, investigadores de seguridad describieron en un documento una implementación de prueba de concepto basada en JavaScript de un ataque de martillo de hilera . [87] [88] [89] [90]

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. [91] [92]

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

Herramientas de desarrollo [ editar ]

Han evolucionado herramientas importantes con el lenguaje.

  • Todos los principales navegadores web tienen herramientas de desarrollo web integradas, incluido un depurador de JavaScript .
  • Las herramientas de análisis de programas estáticos , como ESLint y JSLint , escanean el código JavaScript para verificar su conformidad con un conjunto de estándares y pautas.
  • Algunos navegadores tienen perfiladores integrados . También se han creado bibliotecas de creación de perfiles independientes, como benchmark.js y jsbench. [94] [95]
  • Muchos editores de texto admiten el resaltado de sintaxis para el código JavaScript.

Tecnologías relacionadas [ editar ]

Java [ editar ]

Un error común es que JavaScript es similar o está estrechamente relacionado con Java . Es cierto que ambos tienen una sintaxis similar a C (siendo el lenguaje C su lenguaje ancestro común más inmediato). También suelen estar en un espacio aislado (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 se reservaron en JavaScript original, la biblioteca estándar de JavaScript sigue las convenciones de nomenclatura de Java, y JavaScript Mathy los Dateobjetos se basan en clases de Java 1.0, [96] pero las similitudes terminan ahí.

Tanto Java como 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 un código de bytes compilado, mientras que JavaScript se carga como código fuente legible por humanos. Los objetos de Java están basados ​​en clases , mientras que los de JavaScript están basados ​​en prototipos . Finalmente, Java no soportó la programación funcional hasta Java 8, mientras que JavaScript lo ha hecho desde el principio, siendo influenciado por Scheme .

JSON [ editar ]

JSON , o JavaScript Object Notation, es un formato de intercambio de datos de uso general que se define como un subconjunto de la sintaxis literal de objetos de JavaScript.

WebAssembly [ editar ]

Desde 2017, los navegadores web han admitido WebAssembly , un formato binario que permite que un motor JavaScript ejecute partes críticas para el rendimiento de los scripts de páginas web cerca de la velocidad nativa. [97] El código de WebAssembly se ejecuta en el mismo entorno de pruebas que el código JavaScript normal.

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

Transpiladores [ editar ]

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

Referencias [ editar ]

  1. ^ a b Comunicado de prensa que anuncia JavaScript , "Netscape y Sun anuncian JavaScript", PR Newswire, 4 de diciembre de 1995
  2. ^ "Estándar ECMA-262" . Ecma International. 17 de junio de 2020.
  3. ^ "nodejs / node-eps" . GitHub .
  4. ↑ a b Seibel, Peter (16 de septiembre de 2009). Codificadores en acción: reflexiones sobre el oficio de la programación . ISBN 9781430219484. Consultado el 25 de diciembre de 2018 . Eich: La preocupación inmediata de Netscape era que debía parecerse a Java.
  5. ^ a b c d e "Capítulo 4. Cómo se creó JavaScript" . speakjs.com .
  6. ^ "Brendan Eich: una introducción a JavaScript, JSConf 2010" . pag. 22m . Consultado el 25 de noviembre de 2019 . Eich: "función", ocho letras, me influyó AWK.
  7. ^ 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 . CS1 maint: parámetro desalentado ( enlace )
  8. ^ "JavaScript" . Collins English Dictionary - Edición digital completa e íntegra de 2012 . William Collins Sons & Co. 2012 . Consultado el 21 de agosto de 2015 .
  9. ^ "Especificación de idioma ECMAScript® 2020" .
  10. ^ Flanagan, David. JavaScript - La guía definitiva (6 ed.). pag. 1. JavaScript es parte de la tríada de tecnologías que todos los desarrolladores web deben aprender: HTML para especificar el contenido de las páginas web, CSS para especificar la presentación de las páginas web y JavaScript para especificar el comportamiento de las páginas web.
  11. ^ a b "Estadísticas de uso de JavaScript como lenguaje de programación del lado del cliente en sitios web" . w3techs.com . Consultado el 9 de abril de 2021 .
  12. ^ a b c d "Estadísticas de uso de bibliotecas JavaScript para sitios web" . w3techs.com . Consultado el 9 de abril de 2021 .
  13. ^ "Cambiadores de juego de Bloomberg: Marc Andreessen" . Bloomberg. 17 de marzo de 2011 . Consultado el 7 de diciembre de 2011 .
  14. ^ Enzer, Larry (31 de agosto de 2018). "La evolución de los navegadores web" . Desarrolladores web de Monmouth . Consultado el 31 de agosto de 2018 .
  15. ^ "TechVision: innovadores de la red: Brendan Eich y JavaScript" . Archivado desde el original el 8 de febrero de 2008.
  16. ^ Fin JS (17 de junio de 2016), Brendan Eich - CEO de Brave , consultado el 7 de febrero de 2018
  17. ↑ a b 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 .
  18. ^ "Microsoft Internet Explorer 3.0 Beta ahora disponible" . microsoft.com . Microsoft. 29 de mayo de 1996 . Consultado el 16 de julio de 2016 .
  19. ^ McCracken, Harry (16 de septiembre de 2010). "El regreso no deseado de" Mejor visto con Internet Explorer " " . technologizer.com . Consultado el 16 de julio de 2016 .
  20. ^ "Mozilla Firefox Internet Browser Market Share gana al 7,4%" . Revista del motor de búsqueda. 24 de noviembre de 2004 . Consultado el 7 de diciembre de 2011 .
  21. ^ Weber, Tim (9 de mayo de 2005). "El asalto al gigante del software Microsoft" . BBC News . Archivado desde el original el 25 de septiembre de 2017.
  22. ^ "Prueba de comparación de navegadores grandes: Internet Explorer frente a Firefox, Opera, Safari y Chrome" . Hardware de juegos de PC . Computec Media AG . Consultado el 28 de junio de 2010 .
  23. ^ "Pruebas de velocidad de Lifehacker: Safari 4, Chrome 2" . Lifehacker . Consultado el 28 de junio de 2010 .
  24. ^ "TraceMonkey: JavaScript Lightspeed, Blog de Brendan Eich" . Consultado el 22 de julio de 2020 .
  25. ^ "Mozilla pregunta: '¿Ya somos rápidos? ' " . Cableado . Consultado el 18 de enero de 2019 .
  26. ^ "ECMAScript 6: nuevas funciones: descripción general y comparación" . es6-features.org . Consultado el 19 de marzo de 2018 .
  27. ↑ a b Branscombe, Mary (4 de mayo de 2016). "JavaScript Standard se traslada al programa de lanzamiento anual; aquí hay novedades para ES16" . La nueva pila . Consultado el 15 de enero de 2021 .
  28. ^ "El proceso TC39" . tc39.es . Ecma International . Consultado el 15 de enero de 2021 .
  29. ^ "Propuestas de ECMAScript" . TC39 . Consultado el 15 de enero de 2021 .
  30. ^ a b Ashkenas, Jeremy . "Lista de lenguajes que se compilan en JS" . Consultado el 6 de febrero de 2020 .
  31. ^ "Número de serie de marca comercial de Estados Unidos 75026640" . USPTO.
  32. ^ "Marcas comerciales de Sun" . Sun Microsystems. Archivado desde el original el 28 de mayo de 2010 . Consultado el 8 de noviembre de 2007 .
  33. ^ "Vanilla JS" . vanilla-js.com . Consultado el 17 de junio de 2020 .
  34. ^ Netscape Communications Corporation (11 de diciembre de 1998). "Guía de JavaScript del lado del servidor" . oracle.com . Corporación de comunicaciones de Netscape . Consultado el 16 de julio de 2016 .
  35. ^ Clinick, Andrew (14 de julio de 2000). "Introducción a JScript .NET" . Red de desarrolladores de Microsoft . Microsoft . Consultado el 10 de abril de 2018 . [D] esde la introducción en 1996 de JScript versión 1.0 ... hemos visto un aumento constante en el uso de JScript en el servidor, particularmente en Active Server Pages (ASP)
  36. ↑ a b Mahemoff, Michael (17 de diciembre de 2009). "JavaScript del lado del servidor, de vuelta con una venganza" . readwrite.com . Consultado el 16 de julio de 2016 .
  37. ^ "JavaScript para Acrobat" . Consultado el 18 de agosto de 2009 .
  38. ^ "Respondiendo a la pregunta:" ¿Cómo desarrollo una aplicación para GNOME? " " .
  39. ^ "Tessel 2 ... Aproveche todas las bibliotecas de Node.JS para crear dispositivos útiles en minutos con Tessel" .
  40. ^ "Introducción a GPIO de Node.js Raspberry Pi" .
  41. ^ "Espruino - JavaScript para microcontroladores" .
  42. ^ 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.
  43. ^ a b c d "Rasgos de JavaScript en una imagen de Internet" . La comunidad DEV . Consultado el 28 de octubre de 2019 .
  44. ^ "Wat" . www.destroyallsoftware.com . Consultado el 28 de octubre de 2019 .
  45. ^ "Tipos de datos de JavaScript y estructuras de datos - JavaScript | MDN" . Developer.mozilla.org . 16 de febrero de 2017 . Consultado el 24 de febrero de 2017 .
  46. ^ Flanagan , 2006 , págs. 176-178.
  47. ^ Crockford, Douglas. "Herencia prototípica en JavaScript" . Consultado el 20 de agosto de 2013 .
  48. ^ "Herencia y cadena de prototipos" . Red de desarrolladores de Mozilla . Mozilla . Consultado el 6 de abril de 2013 .
  49. ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. pag. 83. ISBN 978-0-321-81218-6.
  50. ^ Haverbeke, Marijn (2011). JavaScript elocuente . Sin prensa de almidón. págs. 95–97. ISBN 978-1-59327-282-1.
  51. ^ Katz, Yehuda. "Comprensión de" prototipos "en JavaScript" . Consultado el 6 de abril de 2013 .
  52. ^ Herman, David (2013). JavaScript eficaz . Addison-Wesley. págs. 125-127. ISBN 978-0-321-81218-6.
  53. ^ "Propiedades del objeto de función" . Es5.github.com . Consultado el 26 de mayo de 2013 .
  54. ^ Flanagan , 2006 , p. 141.
  55. ^ Los muchos talentos de JavaScript para generalizar enfoques de programación orientada a roles como Traits y Mixins , Peterseliger.blogpsot.de, 11 de abril de 2014.
  56. ^ Rasgos de JavaScript , 2010.
  57. ^ "Inicio | CocktailJS" . Cocktailjs.github.io . Consultado el 24 de febrero de 2017 .
  58. ^ Angus Croll, Una nueva mirada a JavaScript Mixins , publicado el 31 de mayo de 2011.
  59. ^ "Modelo de concurrencia y bucle de eventos" . Red de desarrolladores de Mozilla . Consultado el 28 de agosto de 2015 .
  60. ^ Haverbeke, Marijn (2011). JavaScript elocuente . Sin prensa de almidón. págs. 139-149. ISBN 978-1-59327-282-1.
  61. ^ "E4X - Archivo de contenido obsoleto | MDN" . Red de desarrolladores de Mozilla . Fundación Mozilla. 14 de febrero de 2014 . Consultado el 13 de julio de 2014 .
  62. ^ "var - JavaScript - MDN" . La red de desarrolladores de Mozilla . Consultado el 22 de diciembre de 2012 .
  63. ^ "dejar" . Documentos web de MDN . Mozilla . Consultado el 27 de junio de 2018 .
  64. ^ "const" . Documentos web de MDN . Mozilla . Consultado el 27 de junio de 2018 .
  65. ^ "Especificación del lenguaje ECMAScript - ECMA-262 Edition 5.1" . Ecma International . Consultado el 22 de diciembre de 2012 .
  66. ^ "consola" . Red de desarrolladores de Mozilla . Mozilla . Consultado el 6 de abril de 2013 .
  67. ^ "argumentos" . Red de desarrolladores de Mozilla . Mozilla . Consultado el 6 de abril de 2013 .
  68. ^ "Módulos de importación y exportación en javascript" . Learnersbucket.com . Consultado el 23 de abril de 2019 .
  69. ^ "Hacer que JavaScript sea seguro para la publicidad" . ADsafe . Consultado el 26 de mayo de 2013 .
  70. ^ "Secuencia de comandos ECMA segura (SES)" . Consultado el 26 de mayo de 2013 .
  71. ^ "Vulnerabilidad de secuencias de comandos entre sitios de Mozilla notificada y corregida - Talkback de MozillaZine" . Mozillazine.org . Consultado el 24 de febrero de 2017 .
  72. ^ "¿Haz clic derecho en" protección "? Olvídate" . 17 de junio de 2008. ISSN 1797-1993 . Archivado desde el original el 9 de agosto de 2011 . Consultado el 17 de junio de 2008 .  Cite journal requiere |journal=( ayuda )
  73. ^ Rehorik, enero. "Por qué nunca debería poner datos confidenciales en su JavaScript" . Blog de ServiceObjects . ServiceObjects . Consultado el 3 de junio de 2019 .
  74. ^ a b Lauinger, Tobías; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (21 de diciembre de 2016). "No dependerás de mí: análisis del uso de bibliotecas JavaScript obsoletas en la web" (PDF) . Actas 2017 Simposio sobre seguridad de redes y sistemas distribuidos . 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 . Consultado el 22 de febrero de 2017 .
  75. ^ Collins, Keith (27 de marzo de 2016). "Cómo un programador rompió Internet al eliminar un pequeño fragmento de código" . Cuarzo .
  76. ^ SC Magazine UK, 11 líneas de código eliminado del desarrollador 'rompe Internet' Archivado el 23 de febrero de 2017 en Wayback Machine
  77. ^ Mozilla Corporation, desbordamiento de búfer en crypto.signText ()
  78. ^ 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.
  79. ^ SecurityTracker.com, Apple Safari JavaScript Buffer Overflow permite a los usuarios remotos ejecutar código arbitrario y el error de redirección HTTP permite a los usuarios remotos acceder a archivos
  80. ^ SecurityFocus, vulnerabilidad de desbordamiento del búfer de control ActiveX de Microsoft WebViewFolderIcon
  81. ^ Fusion Authority, Desbordamiento de búfer de Macromedia Flash ActiveX Archivado el 13 de agosto de 2011 en Wayback Machine
  82. ^ "Modo protegido en Vista IE7 - IEBlog" . Blogs.msdn.com . 9 de febrero de 2006 . Consultado el 24 de febrero de 2017 .
  83. ^ CERT de EE. UU., Nota de vulnerabilidad VU # 713878: Microsoft Internet Explorer no valida correctamente la fuente del marco redirigido
  84. ^ Fundación Mozilla, Aviso de seguridad de la Fundación Mozilla 2005–41: Escalada de privilegios a través de anulaciones de propiedad DOM
  85. ^ Microsoft Corporation, Cambios en la funcionalidad en Microsoft Windows XP Service Pack 2: Parte 5: Seguridad de navegación mejorada
  86. ^ Para ver un ejemplo de un caballo de Troya JavaScript poco común, consulte Symantec Corporation, JS.Seeker.K
  87. ^ Gruss, Daniel; Maurice, Clémentine; Mangard, Stefan (24 de julio de 2015). "Rowhammer.js: un ataque de error inducido por software remoto en JavaScript". arXiv : 1507.06955 [ cs.CR ].
  88. ^ Jean-Pharuns, Alix (30 de julio de 2015). "Rowhammer.js es el truco más ingenioso que he visto" . Placa base . Vice .
  89. ^ Goodin, Dan (4 de agosto de 2015). "Explotación de DRAM 'Bitflipping' para atacar PC: simplemente agregue JavaScript" . Ars Technica .
  90. ^ Auerbach, David (28 de julio de 2015). "Explotación de seguridad de Rowhammer: por qué un nuevo ataque de seguridad es realmente aterrador" . slate.com . Consultado el 29 de julio de 2015 .
  91. ^ AnC VUSec, 2017
  92. ^ El nuevo JavaScript que revienta ASLR está a punto de hacer que las vulnerabilidades de seguridad sean mucho más desagradables Ars Technica, 2017
  93. ^ Ataque de espectro Ataque de espectro
  94. ^ "Benchmark.js" . benchmarkjs.com .
  95. ^ JSBEN.CH. "JSBEN.CH Performance Benchmarking Playground para JavaScript" . jsben.ch .
  96. ^ Eich, Brendan (3 de abril de 2008). "Popularidad" . Consultado el 19 de enero de 2012 .
  97. ^ "Edge Browser cambia WebAssembly a 'On' - Revista Visual Studio" . Revista Visual Studio .
  98. ^ "preguntas frecuentes" . asm.js . Consultado el 13 de abril de 2014 .

Lectura adicional [ editar ]

  • JavaScript elocuente ; 3ª Ed; Marijn Haverbeke; Sin prensa de almidón; 472 páginas; 2018; ISBN 978-1593279509 . (descargar) 
  • Principios de JavaScript orientado a objetos ; 1ª Ed; Nicholas Zakas; Sin prensa de almidón; 120 páginas; 2014; ISBN 978-1593275402 . 

Enlaces externos [ editar ]

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 20 de agosto de 2013 y no refleja ediciones posteriores. ( 20-08-2013 )
  • JavaScript en Curlie
  • Douglas Crockford 's conferencias de video en JavaScript