ECMAScript | |
---|---|
clase de idioma | Especificación para lenguajes de programación , lenguaje de programación funcional y lenguaje de programación multiparadigma |
Apareció en | junio de 1997 |
Autor | Brendan Eich y Ecma Internacional |
Desarrollador | Brendan Eich |
extensión de archivo | .es[2] |
Liberar | ECMAScript 2022 [Spec 1] (junio de 2022 ) |
sistema de tipos | pato |
Dialectos | JavaScript , JScript , ActionScript , JScript.NET , QtScript |
sido influenciado | Auto [1] , C , Esquema [1] , Perl [1] , Python , Java [1] , AWK [1] |
influenciado | Objetivo-J |
Sitio web | ecma-international.org _ |
ECMAScript es un lenguaje de programación sin E/S integrable y extensible que se utiliza como base para construir otros lenguajes de secuencias de comandos [3] .
ECMAScript está estandarizado por la organización internacional ECMA en la especificación ECMA-262 . Extensiones de lenguaje: JavaScript , JScript y ActionScript .
El lenguaje se originó a partir de varias tecnologías, las más famosas de las cuales son los lenguajes JavaScript y JScript . El desarrollo de la primera revisión de la especificación comenzó en noviembre de 1996. La especificación fue adoptada en junio de 1997. Enviado a ISO/IEC JTC 1 para la aceptación de seguimiento rápido , sirvió como base para el estándar internacional ISO/IEC 16262 . En junio de 1998, la reunión general de ECMA adoptó la segunda edición de ECMA-262, correspondiente a ISO/IEC 16262. La tercera edición de la especificación difería de la anterior al introducir soporte para expresiones regulares, mejorar el soporte de cadenas, introducir nuevas estructuras de control , un mecanismo de excepción, formateo cuando se ingresa un número y algunos otros cambios[Especificación 2] .
ECMAScript admite cinco tipos de datos primitivos :
El tipo de dato numérico en ECMAScript corresponde al formato de número de coma flotante de 64 bits definido por el estándar IEEE 754-2008 , excepto que los diversos valores Not-a-Number definidos en el estándar [4] se representan en ese idioma por el único valor especial NaN [Especificación 4] .
Los tipos de datos nulos e indefinidos se denominan informalmente tipos "triviales" por David Flanagan , ya que cada uno de ellos define solo un valor [5] .
El idioma también tiene un tipo de datos "compuesto" [5] :
Además de los seis tipos de datos enumerados, ECMAScript admite siete más que se utilizan exclusivamente para almacenar resultados intermedios de expresiones evaluadas:
La popularidad del lenguaje JavaScript y la no trivialidad del procesamiento de datos de diferentes tipos llevaron al despliegue de investigaciones académicas en el campo del análisis de tipos de datos ECMAScript, cuyo objetivo es crear un analizador de código completo que pueda usarse en el desarrollo integrado . ambientes [6] .
Hay quince tipos diferentes de instrucciones en ECMAScript, que se enumeran en la siguiente tabla:
Nombre | nombre original | Breve información | definitivo; [Especificación 8] |
---|---|---|---|
Bloquear | inglés bloquear | {[<instrucciones>]} | − |
Declaración de variables | inglés DeclaraciónDeVariable | var <lista de declaraciones de variables> | + |
Instrucción vacía | inglés VacíoDeclaración | ; | + |
Expresión | inglés ExpresiónDeclaración | [cadena a ∉ {{, función}] instrucción | + |
Condición | inglés SiDeclaración | if (<инструкция>) <выражение>[ else <выражение>] | − |
Ciclo | inglés Declaración de iteración | do <expresión> while (<sentencia>) while (<sentencia>) <expresión> |
+/− [~1] |
Continuación | inglés ContinuarDeclaración | continuar [<identificador>] | + |
Interrumpir | inglés BreakStatement | romper [<identificador>] | + |
Devolver | inglés DevoluciónDeclaración | devolver [<instrucción>] | + |
Combinación | inglés ConDeclaración | with (<sentencia>) <expresión> | − |
Etiqueta | inglés EtiquetadoDeclaración | <identificador>: <expresión> | − |
Elección | inglés SwitchStatement | switch (<sentencia>) case <sentencia>: [<expresiones>][ case <sentencia>: [<expresiones>] ...] [predeterminado: [<expresiones>]] | − |
Lanzar una excepción | inglés TirarDeclaración | lanzar <instrucción> | + |
intentar bloquear | inglés TryStatement | intente <bloque> catch (<identificador>) <bloque> intente <bloque> finalmente <bloque> intente <bloque> catch (<identificador>) <bloque> finalmente <bloque> |
− |
(nuevo [Spec 9] ) Depurador | inglés depurador | depurador | − |
A pesar del punto y coma obligatorio en los casos señalados en la cuarta columna, la especificación declara un mecanismo para autocompletar cadenas con punto y coma , lo que lleva al hecho de que si hay un salto de línea, la instrucción anterior al salto de línea puede equiparse con este signo [ Especificación 8] , que es objeto de críticas [7] .
Instrucciones que cambian de significado cuando se usa una nueva línea dentro de [Especificación 8]Un ejemplo de cómo cambiar el significado de una instrucción
volver { estado : "completo" };Aquí, la línea resaltada contiene una instrucción válida para el idioma y, dado que sigue una nueva línea, se activa el mecanismo de autocompletado de líneas con punto y coma. En lugar de que la función que contiene el código anterior devuelva un objeto con la propiedad como valor status, devolverá undefined.
Aunque la forma literal de un objeto no es un bloque de código, los paréntesis uniformes pueden generar errores. El desarrollo o la adopción de un estándar de codificación adecuado puede reducir la probabilidad de que ocurran . La elección del estilo de sangría juega un papel . En particular, los estilos Allman y Whitesmith , así como el estilo Horstman y el estilo GNU para el código JavaScript, están en desuso en la mayoría de las pautas [8] en contraste con los estilos K&R , 1TBS , BSD KNF .
Error de autocompletarSi la expresión escrita en la línea siguiente puede ser sintácticamente una continuación de la expresión de la línea anterior, el mecanismo de autocompletado de líneas con punto y coma no funciona [9] .
función () [ 'h1' , 'h2' ]. paraCada ( función ( t ) { handleTag ( t ) })En este ejemplo, los corchetes de la segunda línea se interpretan como una referencia a un elemento de matriz devuelto por func(). La coma entre paréntesis se trata como el operador correspondiente que devuelve 'h2'. Así que el código se convierte a lo siguiente:
función ()[ 'h2' ]. forEach ( función ( t ) { handleTag ( t ); });Es costumbre en los estándares de codificación requerir punto y coma incluso si la sintaxis del idioma permite omitirlos [Estándares de codificación 1] [Estándares de codificación 2] [Estándares de codificación 3] [Estándares de codificación 4] [Estándares de codificación 5] .
Bloques y alcanceOtra característica de ECMAScript en relación con otros lenguajes tipo C es que en este lenguaje los bloques no forman un alcance . Las variables declaradas en un bloque se aplican a toda la función que contiene el bloque [10] [11] .
En esta sección de código, la variable se vuelve a declarar en las líneas resaltadas:
función foo ( ) { varsum = 0 ; for ( var i = 0 ; i < 42 ; i += 2 ) { var tmp = i + 2 ; suma += i * tmp ; } para ( var i = 1 ; i < 42 ; i += 2 ) { suma += i * yo ; } alerta ( tmp ); suma devuelta ; _ } foo ();Además, la variable tmp declarada dentro del primero de los bucles (línea 4) es legal para acceder desde fuera del bucle (línea 10) según la sintaxis del lenguaje.
Debido a la naturaleza del alcance y los bloques, se recomienda declarar variables al comienzo de las funciones para mantener la calidad del código fuente [10] [Estándares de codificación 1] [Estándares de codificación 4] .
Declaraciones de variablesLas variables se definen mediante palabras clave var, let, const. Al declarar una variable, se coloca en el ámbito correspondiente en el caso de una varfunción, y en el caso let, constde un bloque de código. Si una variable se declara fuera de las funciones, se coloca en el ámbito global. La creación de una variable ocurre cuando se recibe el control de la función con su declaración. O un programa si la variable es global. Cuando se crea una variable en ECMAScript, adquiere el valor undefined. Si una variable se declara con initialization , la inicialización no ocurre en el momento de crear la variable, sino cuando se ejecuta la línea con la instrucción var[Specification 10] .
Al descomentar la línea seleccionada, la pantalla no mostrará un número , sino undefined :
var a = 42 ; function foo () { alerta ( tipo de a ); // var a = 10; } foo ();Cuando se crea una variable, adquiere la propiedad interna {DontDelete} y no se puede eliminar con el operador delete[Especificación 10] . La excepción son las variables declaradas en contexto eval[12] [Especificación 11] .
Muchas fuentes [13] [14] [15] [16] [17] [18] declaran la posibilidad de declarar implícitamente variables en ECMAScript cuando se asigna a un identificador válido que no es un argumento de función formal sin declarar primero con var. Sin embargo, en la terminología de la especificación del lenguaje, en este caso se crea una propiedad del objeto global, no una variable [12] [Especificación 10] .
Fijar en el estándar de codificación la necesidad de declarar variables antes de que se utilicen [Estándares de codificación 1] [Estándares de codificación 4] (o corregir la necesidad de usar espacios de nombres para todos los objetos globales [Estándares de codificación 2] ) evita errores sutiles, previniendo el peligro de interacción de variables con nombres idénticos en diferentes partes del código [19] .
Las siguientes palabras son palabras clave en el idioma y no se pueden usar como identificadores [Spec 12] :
romper hacer instancia de tipo de caso más nuevo var atrapar finalmente volver vacío continuar para cambiar mientras función de depuración esto con por defecto si tirar eliminar al intentarEn comparación con la tercera edición de la especificación [Especificación 13] , la quinta edición agregó una palabra clave debuggercon la instrucción correspondiente.
Las siguientes palabras se utilizan como palabras clave en las extensiones propuestas y, por lo tanto, están reservadas para la capacidad de adaptar esas extensiones [Especificación 14] :
enumeración de clase se extiende super constante exportación importaciónCuando se usa el modo estricto, las siguientes palabras se tratan como reservadas para uso futuro [Spec 14] :
implementos dejar rendimiento público privado paquete de interfaz estático protegidoPor lo tanto, en comparación con la tercera edición de la especificación del idioma, la cantidad de palabras reservadas para uso futuro ha disminuido significativamente. Anteriormente había 31 [Especificación 15] , y se criticaba la presencia de un gran número de palabras clave y palabras reservadas, la mayoría de las cuales no se utilizan en el idioma [20] .
ECMAScript tiene operadores que usan palabras clave como nombres y operadores que usan signos de puntuación como nombres .
Clasificación de operadoresEn orden descendente de precedencia , los operadores de ECMAScript se pueden dividir en los siguientes grupos:
Los operadores ++, --, -, +, ~, !, delete, typeof, void, ?:, =, *=, /=, +=, -=, <<=, >=, >>>=, &=, ^=, son |=asociativos por la derecha (es decir, son a op b op cequivalentes a a op (b op c)). Los operadores restantes de ECMAScript son asociativos a la izquierda [22] .
Por arity , los operadores de ECMAScript se dividen en los siguientes grupos:
Según la posición del signo de la operación en relación con los operandos, los operadores de ECMAScript se dividen en los siguientes grupos:
Los operadores también se clasifican por el tipo de operandos [25] y por la naturaleza de la acción realizada.
Características de las sentencias ECMAScriptNo hay ningún operador en ECMAScript que le permita comprobar si una propiedad pertenece directamente a un objeto o se hereda. Esta comprobación se lleva a cabo mediante el hasOwnProperty(). Debido a que este método no es un operador, cualquier otra propiedad puede sobrescribirlo [26] .
El operador +es el único operador aritmético en el idioma que está sobrecargado para argumentos de cadena. Si al menos uno de los operandos es una cadena, +actúa como concatenador , de lo contrario, realiza la suma [27] [Especificación 17] .
A diferencia de los lenguajes donde void es un tipo de dato, en ECMAScript es un operador que devuelve un valor undefined[28] .
El operador ==verifica la igualdad de acuerdo con un algoritmo que consta de 10 pasos, lo que implica en algunos casos conversión de tipo [Especificación 18] , que, en última instancia, puede conducir a resultados no obvios [29] .
Un ejemplo de los resultados del trabajo ==(en todos los casos enumerados, el valor del operador ===con los mismos argumentos será false):
alerta ( "NaN" == NaN ); // alerta falsa ( NaN == NaN ); // alerta falsa ( verdadero == 1 ); // alerta verdadera ( verdadera == 42 ); // alerta falsa ( nulo == 0 ); // alerta falsa ( 0 == "" ); // alerta verdadera ( "" == 0 ); // alerta verdadera ( "falsa" == falso ); // alerta falsa ( falso == 0 ); // alerta verdadera ( indefinido == falso ); // alerta falsa ( null == false ); // alerta falsa ( indefinido == nulo ); // alerta verdadera ( " \t\r\n " == 0 ); // verdaderoLas funciones en ECMAScript son objetos [30] [31] . El constructor con el que se crean es Function(). Las funciones, como cualquier otro objeto, se pueden almacenar en variables, objetos y matrices, se pueden pasar como argumentos a otras funciones y las funciones pueden devolverlas. Las funciones, como cualquier otro objeto, pueden tener propiedades. Una característica específica esencial de las funciones es que pueden llamarse [30] .
Definición de funcionesHay dos tipos de funciones en ECMAScript:
Las funciones internas son objetos integrados (ver más abajo ), no necesariamente implementados en ECMAScript [Especificación 19] .
En el texto del programa, una función con nombre en ECMAScript se puede definir de una de las siguientes maneras:
// declaración de función function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definir una función usando una sentencia var sum2 = function ( arg1 , arg2 ) { return arg1 + arg2 ; }; // definir una función usando notación de objeto var sum3 = nueva función ( "arg1" , "arg2" , "return arg1 + arg2;" );Este último método es el menos preferido, ya que de facto se trata de definir una función usando una expresión, pero al mismo tiempo genera una doble interpretación del código (una interpretación adicional ocurre cuando el código se pasa al constructor), que puede afectar negativamente al rendimiento [31] .
Los dos primeros métodos dan un efecto similar pero no idéntico. Para empeorar las cosas, la declaración utilizada al definir una función puede parecerse mucho a la declaración de una función: en primer lugar, la palabra clave functionpuede ir seguida de un identificador [Especificación 20] , en segundo lugar, el punto y coma puede omitirse debido al mecanismo de finalización de cadenas punto y coma. [Especificación 8] . Ejemplo:
// declaración de función function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definir una función usando una expresión var sum2 = function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } barra de funciones () { }; // usa la declaración de la función ( function bar (){}) // usa la instrucción apropiadaLa diferencia más significativa entre definir una función mediante una declaración y definir una función mediante una expresión es que, en el primer caso, la creación de una variable y su asignación como el valor de la función se produce antes de que se ejecute el código al entrar en el contexto de ejecución. . En el segundo caso, la variable recibe el valor del inicializador cuando se ejecuta la instrucción de asignación. Cuando se crea una variable al entrar en un contexto de ejecución, se inicializa con el valor de undefined[Spec 21] [32] (consulte Declaraciones de variables para obtener más detalles ).
Un ejemplo que ilustra la diferencia en el orden de ejecución del código:
alerta ( suma ( 3 , 4 )); // 7: la variable sum ya se ha creado en el momento en que se ejecuta esta línea, y se le ha asignado la función sum ( arg1 , arg2 ) function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } alerta ( suma2 ( 3 , 4 )); // error: la variable sum2 ya se ha creado cuando se ejecuta esta línea, pero se le ha asignado undefined var sum2 = función ( arg1 , arg2 ) { return arg1 + arg2 ; };Las declaraciones de funciones no deben usarse dentro de construcciones condicionales [33] , aunque los navegadores Gecko manejarán esto intuitivamente a través del mecanismo implementado de funciones como instrucciones [34] .
Asignaciones de funcionesDado que las funciones en ECMAScript son objetos, es decir, son de un tipo de datos de referencia , los identificadores de función son variables que almacenan una referencia a la función. Esto se puede ilustrar con el siguiente código:
var suma = función ( arg1 , arg2 ) { return arg1 + arg2 ; }; alerta ( suma ( 3 , 4 )); // 7 var suma2 = suma ; alerta ( suma2 ( 4 , 2 )); // 6 suma = nulo ; alerta ( suma2 ( 42 , 42 )); // 84En la línea resaltada, debe prestar atención a la ausencia del operador de llamada de función ( ()) en el lado derecho de la asignación. Si en lugar de suma se indicara en esta línea sum(), a la variable suma2 no se le asignaría una función, sino el resultado de su llamada. Otra cosa que vale la pena señalar es que después de la asignación, sum2 no apunta a una copia de la función, sino a la misma función a la que apunta sum .
Sobrecarga de funcionesEn ECMAScript , la sobrecarga de funciones no es una propiedad del lenguaje, pero su efecto se proporciona mediante el uso de otros mecanismos.
Un ejemplo que muestra la ausencia de sobrecarga de funciones:
función suma ( arg1 , arg2 ) { return arg1 + arg2 ; } función suma ( arg1 , arg2 , arg3 ) { return arg1 + arg2 + arg3 ; } alerta ( suma ( 3 , 4 )); // Alerta de NaN ( suma ( 3 , 4 , 5 )); // 12Si se declaran varias funciones con el mismo nombre, las declaraciones posteriores sobrescriben las declaraciones anteriores [31] .
Sin embargo, el efecto de la sobrecarga de funciones es alcanzable.
1. Compruebe si no está definido. Para verificar si el argumento real se pasó a la función, puede verificar el argumento formal para la identidad del valor de undefined. Por ejemplo:
function sum ( arg1 , arg2 , arg3 ) { if ( arg3 !== indefinido ) { return arg1 + arg2 + arg3 ; } más { devuelve arg1 + arg2 ; } } alerta ( suma ( 3 , 4 )); // 7 alerta ( suma ( 3 , 4 , 5 )); // 122. Comprobación de tipo. Además, typeof, instanceof, constructorse puede utilizar para averiguar el tipo de argumentos reales y personalizar el comportamiento de la función en función de ellos.
function sum ( arg1 , arg2 , arg3 ) { switch ( typeof arg3 ) { caso "indefinido" : return arg1 + arg2 ; caso "número" : return arg1 + arg2 + arg3 ; predeterminado : devuelve arg1 + arg2 + " (" + arg3 + ")" ; } } alerta ( suma ( 3 , 4 )); // 7 alerta ( suma ( 3 , 4 , 5 )); // 12 alerta ( suma ( 3 , 4 , "!" )); // "7(!)"3. Acceso a datos sobre argumentos. En las funciones de ECMAScript, puede acceder a los datos de los argumentos mediante el objeto arguments[Especificación 22] . En particular, le permite usar la indexación para acceder a argumentos específicos pasados [31] [35] y una propiedad lengthque almacena la cantidad de argumentos realmente pasados, lo que puede ser útil cuando se aplica el paradigma de programación genérico .
función suma () { var res = 0 ; for ( var i = 0 ; i < argumentos . longitud ; i ++ ) { res += argumentos [ i ]; } devuelve res ; } alerta ( suma ( 3 , 4 )); // 7 alerta ( suma ( 3 , 4 , 5 )); // 12 alerta ( suma ( 3 , 4 , 5 , 7 , 9 )); // 28 RecursividadLas funciones de ECMAScript se pueden llamar recursivamente. Cuando define una función usando una declaración sin especificar un identificador después de la palabra clave functiondentro de la función, puede referirse a ella usando la propiedad de destinatario del objeto arguments[Especificación 22] .
Un ejemplo de cálculo factorial recursivo:
var factorial = función ( paso , res ) { res = res || 1 ; if ( paso < 2 ) { return res ; } argumentos de retorno . destinatario ( paso - 1 , paso * res ); }; alerta ( factorial ( 5 )); // 120Actualmente, ECMAScript no implementa la recursión de cola , que se utiliza para optimizar las llamadas recursivas [36] .
Devoluciones de llamadaEn ECMAScript, una función es un objeto de primera clase y se puede pasar como argumento a otra función. Si al mismo tiempo se llama en la función a la que se pasa, entonces se llama función de devolución de llamada (o función de devolución de llamada ). Si la función pasada no tiene nombre, es una función de devolución de llamada anónima ( función de devolución de llamada anónima ) [37] . Las razones principales para usar funciones de devolución de llamada son:
Un ejemplo de una función que devuelve la suma de los resultados de ejecutar la función pasada en los argumentos:
función sumOfResults ( devolución de llamada ) { var resultado = 0 ; for ( var i = 1 ; i < argumentos . longitud ; i ++ ) { resultado += devolución de llamada ( argumentos [ i ]); } devuelve el resultado ; } var cuadrado = función ( x ) { retorno x * x ; }; alerta ( sumOfResults ( cuadrado , 3 , 4 )); // 25 CierresLas funciones en ECMAScript tienen un alcance léxico inherente. Esto significa que el alcance se define en el momento en que se define la función (a diferencia del alcance dinámico, donde el alcance se define en el momento en que se llama a la función) [39] .
Cuando se declara una función, la secuencia de ámbitos de función anidados se almacena como parte del estado de la función. Es decir, durante la ejecución del programa, las funciones que tienen acceso a las variables locales de las funciones circundantes retienen dicho acceso durante la ejecución del programa [39] .
El mecanismo de cierre se puede utilizar para restringir la visibilidad de las variables en una sección independiente del programa para que no haya conflictos de nombres cuando se comparte con otro código. Para ello, el código se coloca en una función anónima, provista de un operador de llamada a función.
( función () { // Sección del programa cuyo acceso a las variables debe estar aislado del exterior. })();En este caso, las funciones definidas en la sección del programa se anidan con respecto a la función anónima añadida, y es posible acceder a las variables locales de la función anónima (que eran globales antes de su introducción). Sin embargo, no se puede acceder a ellos desde fuera de la función anónima: se ignora el resultado de la ejecución de la función.
Los cierres se utilizan no solo para prohibir el acceso a una serie de variables, sino también para modificar dicho acceso. Esto se logra con funciones que devuelven otras funciones. Un ejemplo de una función de generador de números de serie:
var ID único = función () { id de var = 0 ; función de retorno () { id de retorno ++ ; }; }(); var aValue = ID único (); var otro valor = ID único ();Mediante el uso de un cierre , sólo la función que se asignó a la variable uniqueId tiene acceso a la variable id .
Ejemplo de curri :
var multNumber = function ( arg ) { return function ( mul ) { return arg * mul ; }; }; var multiCinco = multiNúmero ( 5 ); alerta ( multFive ( 7 )); //35Un ejemplo de creación de un objeto que le permite acceder a la propiedad exclusivamente utilizando sus métodos [40] :
var miObjeto = función () { var valor = 0 ; return { incremento : función ( inc ) { valor += tipo de inc === 'número' ? aum : 1 ; }, getValue : función ( ) { valor devuelto ; } } }(); alerta ( miObjeto . valor === indefinido ); // alerta verdadera ( myObject . getValue ()); // 0 miObjeto . incrementar ( 9 ) miObjeto . incremento ( 7 ) alerta ( myObject . getValue ()); // dieciséisUsando este truco, puede usar un cierre para emular constantes [41] .
var getConstant = function () { var constantes = { UPPER_BOUND : 100 , LOWER_BOUND : - 100 }; función de retorno ( nombreConstante ) { constantes de retorno [ nombreConstante ]; }; }(); alerta ( getConstant ( "LOWER_BOUND" )); // -100La sintaxis y funcionalidad de las expresiones regulares en ECMAScript fue influenciada por Perl 5 [Spec 23] y permite dos tipos de sintaxis: literal y de objeto .
var literalWay = /patrón/banderas; var objectWay = new RegExp ( patrón , banderas );En el primer caso, la plantilla ( pattern) y las banderas ( flags) se especifican explícitamente, sin signos sintácticos redundantes adicionales: las barras sirven como separadores . En el segundo caso, la plantilla y las banderas deben ser variables que contengan valores de cadena, o directamente valores de cadena. Se prefiere la notación literal porque no requiere el escape doble [ ~ 2] de metacaracteres de expresión regular, a diferencia de la forma de objeto [42] .
Los siguientes símbolos se pueden usar como banderas en ECMAScript:
Bandera | Descripción |
---|---|
g | g modo global: el patrón se aplica a todas las coincidencias en la cadena, la expresión regular no se detiene después de encontrar la primera coincidencia del patrón |
i | y mayúsculas y minúsculas - ignorando : al hacer coincidir, se ignoran las mayúsculas y minúsculas de los caracteres del patrón y las cadenas |
m | modo multilínea : una línea que contiene caracteres de nueva línea se trata como varias líneas separadas por caracteres de avance de línea; regex funciona en todas las líneas |
Cada expresión regular es un objeto con las siguientes propiedades:
Propiedad | Tipo de | Descripción |
---|---|---|
global | lógico | muestra si la bandera está configuradag |
ignoreCase | lógico | muestra si la bandera está configuradai |
multiline | lógico | muestra si la bandera está configuradam |
lastIndex | numérico | coincide con el número de posición en la cadena donde se encontró la coincidencia de patrón como resultado de la aplicación anterior de la expresión regular, o 0 si la expresión regular no se aplicó previamente |
source | cuerda | cadena que coincide con el patrón de expresión regular |
Además, se definen los siguientes métodos para expresiones regulares:
Método | tipo de devolución | Descripción |
---|---|---|
exec(handledString) | objeto (matriz) onull | forma una matriz de subcadenas que coinciden con el patrón especificado , teniendo en cuenta las banderas establecidas . nullsi ninguna subcadena coincide con el patrón |
test(handledString) | lógico | truesi hay una cadena que coincida con el patrón y de falselo contrario |
Los objetos ECMAScript son colecciones desordenadas de propiedades , cada una de las cuales tiene uno o más atributos que determinan cómo se puede usar la propiedad; por ejemplo, si el valor del atributo ReadOnly se establece en true , entonces cualquier intento de ejecutar el código ECMAScript para cambiar el el valor de esa propiedad fallará. Las propiedades son contenedores que encapsulan otros objetos, valores de tipos primitivos y métodos [Especificación 24] .
Nombre | Descripción |
---|---|
solo lectura | La propiedad es una propiedad de solo lectura. Un intento de cambiar el valor de esta propiedad, realizado en el programa, será inútil. En algunos casos, el valor de una propiedad con el conjunto de atributos ReadOnly cambia debido a las acciones del entorno de extensión del idioma, por lo que ReadOnly no debe entenderse como inmutable. |
DontEnum | Propiedad no enumerada por buclefor-in |
No eliminar | Se ignorarán los intentos de eliminar esta propiedad. |
Interno | La propiedad es interna. No tiene nombre y no se puede acceder con accesores . El acceso a estas propiedades está determinado por la implementación del lenguaje. |
Los objetos ECMAScript se dividen en objetos básicos (nativos) y de extensión (host). Por base entendemos cualquier objeto que sea independiente del entorno relacionado con la extensión del lenguaje. Algunos de los objetos básicos están integrados : existen desde el principio de la ejecución del programa. Se pueden crear otros cuando el programa se está ejecutando. Los objetos de extensión los proporciona la extensión ECMAScript y, para ECMAScript, esto significa que forman parte del modelo de objetos del documento o del modelo de objetos del navegador [Especificación 3] .
SintaxisLas formas de objetos y literales se pueden usar para especificar objetos. La forma de objeto de especificar un objeto tiene una sintaxis similar a Java, pero, a diferencia de ella, los paréntesis en ECMAScript se requieren para usarse solo cuando se pasan argumentos a un constructor [43] . Las siguientes entradas son sintácticamente equivalentes:
varobj1 = nuevo Objeto ( ); var obj2 = nuevo objeto ; var obj3 = {};Sin embargo, no se recomienda la segunda opción [43] . Douglas Crockford recomienda evitar también la primera opción, prefiriendo la forma literal, que considera una gran ventaja del lenguaje [44] .
La especificación del lenguaje opera con el concepto de propiedad de un objeto , llamando a un método una función utilizada como propiedad de un objeto [Especificación 3] .
Cada objeto en el lenguaje tiene las siguientes propiedades:
Nombre | Breve descripción |
---|---|
constructor | La función utilizada para crear el objeto (en los ejemplos anteriores es Object()) |
tiene propiedad propia (nombre de propiedad) | Indica si la propiedad dada existe en el objeto (no en su prototipo ) |
esPrototipoDe(objeto) | Determina si un objeto está en la cadena de prototipo del objeto de argumento |
propiedadEsEnumerable(nombreDePropiedad) | Indica si la propiedad con el nombre dado es enumerable en el ciclofor-in |
Encadenar() | Devuelve la representación de cadena del objeto. |
valor de() | Devuelve este valor . Si el objeto es el resultado de una llamada al constructor de un objeto de extensión , el valor valueOf()depende de la implementación [Spec 26] . A menudo, el valor de retorno es un valor de tipo primitivo correspondiente a un objeto. Como regla general, el resultado de este método es el mismo que el resultado de toString(). Los objetos creados con un constructor Date() son un excelente ejemplo donde los resultados de toString()y valueOf()no coinciden [43] . |
Se accede a las propiedades del objeto mediante la notación de puntos y corchetes :
var obj = nuevo objeto (); alerta ( obj . constructor === obj [ "constructor" ]); // verdadero: use la notación de puntos y corchetes para acceder a la propiedad var foo = obj [ "toString" ]; // usando notación de paréntesis para almacenar la función en una variable var result = obj [ "toString" ](); // guardando el resultado de la llamada a la función en una alerta variable ( foo ()); // mostrando el resultado de llamar a la función almacenada en la alerta de pantalla ( resultado ); varboo = obj ._ _ a la cadena ; // similar a la notación de puntos var res = obj . a la cadena (); alerta ( abucheo ()); alerta ( res );Las nuevas propiedades se pueden establecer dinámicamente.
varcountry = nuevo Objeto ( ); país [ "nombre" ] = "Rusia" ; // usa la notación de paréntesis country . añoFundación = 862 ; // usa la notación de puntos var país2 = { "nombre" : "Rusia" , "año de fundación" : 862 }; // usa la forma literalLa creación de objetos de la manera descrita en la sección anterior puede resultar poco práctica debido a la necesidad de duplicar el código [45] . Si el programa manipula una gran cantidad de objetos del mismo tipo, el desarrollador tiene la oportunidad de elegir una de las técnicas utilizadas en el lenguaje [45] :
fábrica de objetos una función que crea un objeto y lo devuelve como su valor, constructor una función que usa la palabra clave thispara formar las propiedades del objeto que crea usando el operador new, enfoque prototipo usar la propiedad prototypede una función para mostrar las propiedades generales de los objetos, enfoque mixto constructor-prototipo usar un constructor para establecer propiedades de objetos que no son métodos y un enfoque de prototipo para establecer métodos, método de prototipo dinámico concluir el código relacionado con la función de crear objetos basados en el enfoque mixto constructor-prototipo en una sola función, asegurando que las propiedades del prototipo se asignen una vez, método constructor parásito usar newcon la función de fábrica de objetos.No hay clases en el lenguaje , pero se pueden emular usando constructores. Un ejemplo de emulación de clases en ECMAScript:
function MyClass () { this . miValor1 = 1 ; esto _ miValor2 = 2 ; } mi clase prototipo _ myMethod = función () { devuelve esto . miValor1 * este . miValor2 ; } var mc = new MiClase (); mc _ miValor1 = mc . miValor2 * 2 ; var i = mc . miMetodo ();Para cada uno de los componentes del objeto, se puede considerar la herencia. Cuando se hereda la interfaz de un padre sin que el hijo use la funcionalidad del antepasado, se habla de herencia de la interfaz. Al heredar el estado, el objeto hijo hereda la estructura de datos del objeto antepasado. Al heredar funcionalidad, estamos hablando de herencia junto con la interfaz y el código de métodos. Por regla general, esto implica la necesidad de organizar la herencia de estado, lo que hace razonable combinar la herencia de estado y la herencia de funcionalidad en la herencia de implementación [46] .
Con respecto a ECMAScript, solo la herencia de interfaz no se aplica, ya que las funciones en el lenguaje no tienen firmas [45] .
Las posibilidades que ofrece el lenguaje para la organización de la herencia pueden juzgarse, por ejemplo, por la lista que da Stoyan Stefanov [47] de doce formas diferentes de organizar la herencia.
La adopción de ES6 ha eliminado muchas clases de problemas de JavaScript [48] [49] [50] [51] .
ECMAScript | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dialectos | |||||||||||||
Motores ( comparación ) |
| ||||||||||||
Marcos , bibliotecas |
| ||||||||||||
Gente | |||||||||||||
Otro |
|
Internacionales Ecma | Normas|
---|---|
ISO | Normas|
---|---|
| |
1 a 9999 |
|
10000 a 19999 |
|
20000+ | |
Ver también: Lista de artículos cuyos títulos comienzan con "ISO" |