Guía de JavaScript parte 7: modo estricto, esta palabra clave, eventos, módulos, matemáticas

Hoy, en la séptima parte de la traducción del manual de JavaScript, hablaremos sobre la ejecución de código en modo estricto, sobre las características de esta palabra clave, sobre eventos, sobre módulos y sobre cálculos matemáticos. Aquí cubriremos los temas de trabajo con temporizadores y programación asincrónica.

Parte 1: primer programa, características del lenguaje, estándares
Parte 2: estilo de código y estructura del programa
Parte 3: variables, tipos de datos, expresiones, objetos.
Parte 4: características
Parte 5: matrices y bucles
Parte 6: excepciones, punto y coma, literales comodín
Parte 7: modo estricto, esta palabra clave, eventos, módulos, cálculos matemáticos
Parte 8: Descripción general de las características de ES6
Parte 9: Descripción general de los estándares ES7, ES8 y ES9



Modo estricto


El modo estricto apareció en el estándar ES5. En este modo, la semántica del cambio de idioma, tiene como objetivo mejorar el comportamiento de JavaScript, lo que lleva al hecho de que el código en este modo se comporta de manera diferente a lo normal. De hecho, estamos hablando del hecho de que en este modo se eliminan los defectos, las ambigüedades del lenguaje, las características obsoletas que se almacenan en él por razones de compatibilidad.

▍Habilitar el modo estricto


Para usar el modo estricto en algún código, debe habilitarse explícitamente. Es decir, no estamos hablando del hecho de que este modo se usa por defecto. Tal enfoque interrumpiría el trabajo de innumerables programas existentes basados ​​en los mecanismos del lenguaje que han estado presentes desde el principio, desde 1996. De hecho, los esfuerzos significativos de aquellos que desarrollan estándares JavaScript están dirigidos precisamente a garantizar la compatibilidad, de modo que el código escrito basado en versiones antiguas de estándares pueda ejecutarse en los motores JS actuales. Este enfoque puede considerarse una de las claves del éxito de JavaScript como lenguaje para el desarrollo web.

Para habilitar el modo estricto, se utiliza una directiva especial que se ve así.

'use strict' 

La directiva escrita en forma de "use strict" y la misma directiva después de la cual un punto y coma ( 'use strict'; y "use strict"; ) producen el mismo efecto. Esta directiva (así como así, junto con las comillas), para que todo el código en un determinado archivo se ejecute en modo estricto, se coloca al comienzo de este archivo.

 'use strict' const name = 'Flavio' const hello = () => 'hey' //... 

El modo estricto se puede habilitar en el nivel de una función separada. Para hacer esto, la directiva correspondiente debe colocarse al comienzo del código del cuerpo de la función.

 function hello() { 'use strict' return 'hey' } 

Esto puede resultar útil si es necesario utilizar el modo estricto en la base de código existente y, al mismo tiempo, su inclusión a nivel de archivo no es práctica debido a la falta de tiempo para realizar pruebas exhaustivas del código para todo este archivo.

Cabe señalar que si el modo estricto está activado, no puede desactivarlo durante la ejecución del programa.

Considere algunas características del modo estricto.

▍ Combatir la inicialización aleatoria de variables globales


Ya hemos dicho que si accidentalmente asigna un cierto valor a una variable no declarada, incluso si lo hace en el código de función, dicha variable se convertirá en global por defecto (perteneciente al objeto global). Esto puede llevar a sorpresas.

Por ejemplo, el siguiente código crea una variable así.

 ;(function() { variable = 'hey' })() 

La variable estará disponible en el ámbito global después de la ejecución de IIFE.

Si el modo estricto está habilitado en el nivel de esta función, el mismo código causará un error.

 ;(function() { 'use strict' variable = 'hey' })() 

▍ Errores que ocurren durante las operaciones de asignación


JavaScript, en modo normal, no informa ningún error que ocurra durante las operaciones de asignación.

Por ejemplo, en JS hay un valor indefinido , que es uno de los valores primitivos del lenguaje y está representado por la propiedad de un objeto global undefined . En JS regular, tal comando es bastante posible.

 undefined = 1 

Parece escribir una unidad en una determinada variable con el nombre undefined , pero de hecho es un intento de escribir un nuevo valor en una propiedad de un objeto global, que, por cierto, de acuerdo con el estándar, no se puede sobrescribir. En el modo normal, aunque tal comando es posible, no conducirá a nada, es decir, el valor undefined no cambiará y no aparecerá un mensaje de error. En modo estricto, esto causará un error. Para ver este mensaje de error y al mismo tiempo asegurarse de que el valor undefined no se anule en modo normal, intente ejecutar el siguiente código en un navegador o en Node.js.

 undefined = 1 console.log('This is '+undefined) ;(() => { 'use strict' undefined = 1 })() 

El mismo comportamiento del sistema también es característico cuando se trabaja con entidades como los NaN Infinity y NaN , así como con otras similares. El modo estricto le permite evitar todo esto.

En JavaScript, puede establecer propiedades de objetos utilizando el método Object.defineProperty () . En particular, con este método puede establecer propiedades que no se pueden cambiar.

 const car = {} Object.defineProperty(car, 'color', {  value: 'blue',  writable: false }) console.log(car.color) car.color = 'yellow' console.log(car.color) 

Tenga en cuenta el atributo de writable: false utilizado al establecer la propiedad de color .

El código anterior, ejecutado en el modo habitual, no dará lugar a un cambio en la propiedad del objeto de color , ni a una salida de error. Un intento de cambiar esta propiedad en modo estricto dará como resultado un error.

 ;(() => { 'use strict' car.color = 'red' })() 

Lo mismo ocurre con los captadores. Este código se ejecutará, aunque fue en vano.

 const car = { get color() {   return 'blue' } } console.log(car.color) car.color = 'red' console.log(car.color) 

Y un intento de hacer lo mismo en modo estricto causará un error al informar un intento de establecer la propiedad de un objeto que solo tiene un captador.

 ;(() => { 'use strict' car.color = 'yellow' } )() 

JavaScript tiene un método Object.preventExtensions () que hace que un objeto no sea extensible, es decir, uno al que no se pueden agregar nuevas propiedades. Cuando se trabaja con dichos objetos en el modo habitual, se manifiestan las mismas características del lenguaje que examinamos anteriormente.

 const car = { color: 'blue' } Object.preventExtensions(car) console.log(car.model) car.model = 'Fiesta' console.log(car.model) 

Aquí, ambos intentos de derivar una propiedad del objeto model darán como resultado que aparezca undefined valor undefined en la consola. No había tal propiedad en el objeto; un intento de crearla después de que el objeto se hizo no expandible no condujo a nada. La misma acción en modo estricto da como resultado un mensaje de error.

 ;(() => { 'use strict' car.owner = 'Flavio' } )() 

En la misma categoría de acciones que no conducen a ningún cambio, posiblemente esperado por el programador, pero que tampoco causan errores, las operaciones caen en el curso de las cuales se intenta asignar ciertas propiedades a valores primitivos. Por ejemplo, dicho código, en modo normal, no causará un error, pero no producirá ningún resultado.

 let one = 1 one.prop = 2 console.log(one.prop) 

Lo mismo en modo estricto dará como resultado un mensaje de error que indica que la propiedad prop no se puede crear en el número 1 . De manera similar, el sistema se comporta cuando trabaja con otros tipos de datos primitivos.

▍ Errores de eliminación de entidad


En el modo normal, si intenta eliminar, utilizando el operador de eliminación , una propiedad de objeto que no se puede eliminar, delete simplemente devolverá false y todo fallará en silencio.

 delete Object.prototype 

En modo estricto, se generará un error aquí.

Arguments Argumentos de función con el mismo nombre


Las funciones pueden tener parámetros con el mismo nombre, esto no causa errores (aunque esto parece un error de quien creó dicha función).

 ;(function(a, a, b) { console.log(a, b) })(1, 2, 3) //2 3 

Este código normalmente muestra 2 3 en la consola. En modo estricto, esto causará un error.

Por cierto, si durante la declaración de la función de flecha sus parámetros tendrán el mismo nombre, esto, en modo normal, conducirá a la salida de un mensaje de error.

▍ Valores octales


En JavaScript normal, puede usar valores octales agregando 0 al principio.

 ;(() => { console.log(010) })() //8 

Aquí, la representación decimal del número octal 10 , es decir 8 entrará en la consola. Este 0 antes del número se puede poner al azar. En modo estricto, no puede trabajar con números octales especificados en este formato. Pero si necesita usar el modo estricto y trabajar con números octales, puede escribirlos en formato 0oXX . El siguiente código también generará 8 .

 ;(() => { 'use strict' console.log(0o10) })() //8 

▍Operador con


La declaración with , que puede generar confusión, no está permitida en modo estricto.
Cambiar el comportamiento del código en modo estricto no se limita a los que discutimos anteriormente. En particular, en este modo, la palabra clave this se comporta de manera diferente, que ya hemos encontrado y de la que hablaremos con más detalle ahora.

Características de esta palabra clave


La this , o el contexto de ejecución, le permite describir el entorno en el que se ejecuta el código JS. Su significado depende del lugar de su uso y de si el modo estricto está habilitado o no.

▍ Palabra clave esto en modo estricto


En modo estricto, el valor pasado a la función no se convierte al objeto. Esta conversión no solo requiere recursos, sino que también da acceso a las funciones al objeto global si se llaman con this conjunto a undefined o null . Este comportamiento significa que la función puede obtener acceso no autorizado al objeto global. En modo estricto, la conversión de this pasada a la función no se realiza. Para ver la diferencia entre el comportamiento de this en funciones en diferentes modos, intente este código usando la directiva 'use strict' y sin ella.

 ;(function() { console.log(this) })() 

▍La palabra clave en métodos de objeto


Un método es una función a la que se hace referencia en una propiedad de objeto. La this en dicha función se refiere a este objeto. Esta declaración puede ilustrarse con el siguiente ejemplo.

 const car = { maker: 'Ford', model: 'Fiesta', drive() {   console.log(`Driving a ${this.maker} ${this.model} car!`) } } car.drive() //Driving a Ford Fiesta car! 

En este caso, utilizamos la función habitual (y no la flecha, esto es importante), la palabra clave utilizada en la que se vincula automáticamente al objeto que contiene esta función.

Tenga en cuenta que el método anterior de declarar un método de objeto es similar a esto:

 const car = { maker: 'Ford', model: 'Fiesta', drive: function() {   console.log(`Driving a ${this.maker} ${this.model} car!`) } } 

El mismo comportamiento de this en un método de objeto también se puede observar utilizando la siguiente construcción.

 const car = { maker: 'Ford', model: 'Fiesta' } car.drive = function() { console.log(`Driving a ${this.maker} ${this.model} car!`) } car.drive() //Driving a Ford Fiesta car! 

▍ Palabra clave esto y funciones de flecha


Intentemos reescribir el ejemplo anterior usando, como método de objeto, una función de flecha.

 const car = { maker: 'Ford', model: 'Fiesta', drive: () => {   console.log(`Driving a ${this.maker} ${this.model} car!`) } } car.drive() //Driving a undefined undefined car! 

Como puede ver, aquí, en lugar de los nombres del fabricante de automóviles y su modelo, se muestran valores undefined . El hecho es que, como ya dijimos, this en la función de flecha contiene un enlace al contexto que incluye la función.

Esta flecha no puede vincularse a una función de flecha, pero puede

▍Encuadernando esto


JavaScript tiene un concepto como this enlace. Puedes hacer esto de muchas maneras. Por ejemplo, al declarar una función, puede vincular su palabra clave a un objeto utilizando el método bind() .

 const car = { maker: 'Ford', model: 'Fiesta' } const drive = function() { console.log(`Driving a ${this.maker} ${this.model} car!`) }.bind(car) drive() //Driving a Ford Fiesta car! 

Usando el mismo método, puede vincular otro objeto al método de un objeto, como this .

 const car = { maker: 'Ford', model: 'Fiesta', drive() {   console.log(`Driving a ${this.maker} ${this.model} car!`) } } const anotherCar = { maker: 'Audi', model: 'A4' } car.drive.bind(anotherCar)() //Driving a Audi A4 car! 

Este enlace también se puede organizar en la etapa de llamar a la función utilizando los métodos call() y apply() .

 const car = { maker: 'Ford', model: 'Fiesta' } const drive = function(kmh) { console.log(`Driving a ${this.maker} ${this.model} car at ${kmh} km/h!`) } drive.call(car, 100) //Driving a Ford Fiesta car at 100 km/h! drive.apply(car, [100]) //Driving a Ford Fiesta car at 100 km/h! 

this vinculado a lo que se pasa a estos métodos como primer argumento. La diferencia entre estos métodos es que apply() , como segundo argumento, toma una matriz con los argumentos pasados ​​a la función, y call() toma una lista de argumentos.

▍Acerca de este enlace en los controladores de eventos del navegador


En las devoluciones de llamada de eventos, this apunta al elemento HTML con el que ocurrió el evento. Para vincularse a una devolución de llamada, como this , algo más, puede usar el método bind() . Aquí hay un ejemplo para ilustrar esto.

 <!DOCTYPE html> <html> <body>   <button id="el">Element (this)</button>   <button id="win">Window (this</button>   <script>     const el = document.getElementById("el")     el.addEventListener('click', function () {         alert(this) //object HTMLButtonElement     })     const win = document.getElementById("win")     win.addEventListener('click', function () {         alert(this) //object Window     }.bind(this))   </script> </body> </html> 

Eventos


JavaScript en el navegador utiliza un modelo de programación basado en eventos. Estas u otras acciones son realizadas por el código en respuesta a eventos. En esta sección, hablaremos sobre los eventos y cómo manejarlos.

Un evento puede ser, por ejemplo, completar la carga del DOM, recibir datos realizados como resultado de una solicitud asincrónica, hacer clic en un elemento de la página, desplazarse por una página e ingresar un cierto carácter desde el teclado. De hecho, hay muchos eventos que, cuando se procesan, el código JS de la página le permite resolver una amplia gama de tareas relacionadas con la interacción de la aplicación con los usuarios, con los elementos de la página, con el entorno en el que funciona el código.

▍ Manejadores de eventos


Puede responder a eventos utilizando controladores de eventos, que son funciones que se llaman cuando ocurren los eventos.
Si es necesario, para procesar el mismo evento, puede registrar varios controladores que se llamarán si se produce este evento. Los controladores de eventos se pueden registrar de varias maneras. Considere tres de estos métodos.

▍ Controladores de eventos incorporados


Hoy en día, los controladores de eventos integrados rara vez se usan debido a sus limitaciones. Anteriormente, se usaban mucho más a menudo. Para establecer dicho controlador de eventos, su código se agrega al marcado HTML del elemento como un atributo especial. En el siguiente ejemplo, un controlador tan simple para el evento onclick que ocurre cuando se hace clic en un botón se asigna a un botón etiquetado como Button 1 .

 <!DOCTYPE html> <html> <body>   <button onclick="alert('Button 1!')">Button 1</button>   <button onclick="doSomething()">Button 2</button>   <script>       function doSomething(){           const str = 'Button 2!'           console.log(str)           alert(str)       }       </script> </body> </html> 

El código HTML para el Button 2 utiliza un enfoque similar, pero indica una función cuyo código se ejecuta en respuesta a un clic en el botón. Este código envía la cadena dada a la consola y muestra una ventana con el mismo texto.

▍ Asignación de un controlador a una propiedad de elemento HTML


Este método de asignación de controladores de eventos es adecuado para los casos en que un determinado evento de un elemento solo debe tener un controlador. Consiste en asignar la función a la propiedad correspondiente del elemento.

Por ejemplo, el objeto de window tiene un onload carga, que se llama después de cargar el código HTML de la página y todos los recursos adicionales que necesita, por ejemplo, estilos e imágenes. Si asigna un controlador a este evento, cuando lo llame, puede estar seguro de que el navegador ha cargado todos los contenidos de la página, con los que ahora puede trabajar mediante programación, sin temor a que algunos elementos de la página aún no se hayan cargado.

 window.onload = () => {   alert('Hi!') //   } 

Este enfoque se usa a menudo al procesar solicitudes XHR. Por lo tanto, al configurar una solicitud, puede especificar un controlador para su evento onreadystatechange , que se llamará cuando su propiedad readyState cambie de estado. Aquí hay un ejemplo del uso de este enfoque para cargar datos JSON desde una API pública.

 <!DOCTYPE html> <html> <body>   <button onclick="loadData()">Start</button>   <script>       function loadData (){           const xhr = new XMLHttpRequest()           const method = 'GET'           const url = 'https://jsonplaceholder.typicode.com/todos/1'           xhr.open(method, url, true)           xhr.onreadystatechange = function () {               if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {                   console.log(xhr.responseText)               }           }           xhr.send()      }       </script> </body> </html> 

Para verificar si un controlador está asignado a un evento determinado, puede hacer esto.

 if (window.onload){} 

▍Uso del método addEventListener ()


El método addEventListener() , que ya hemos visto, es un mecanismo moderno para asignar controladores de eventos. Le permite registrar múltiples controladores para un solo evento.

 window.addEventListener('load', () => { //  }) 

Tenga en cuenta que el navegador IE8 (y sus versiones anteriores) no admite el método addEventListener() . Utiliza un método attachEvent() similar. Esto debe tenerse en cuenta si su programa debe admitir navegadores obsoletos.

▍Acerca de asignar controladores de eventos a varios elementos


Puede conectar controladores de eventos al objeto de window para manejar eventos "globales", como presionar botones en el teclado. Al mismo tiempo, los controladores de eventos se asignan a elementos HTML individuales, que responden a lo que les sucede a estos elementos, por ejemplo, haciendo clic en ellos con el mouse. Por lo tanto, el método addEventListener() se usa tanto con el objeto de window como con elementos ordinarios.

▍ Objeto de evento


Como primer parámetro, el controlador de eventos puede tomar un objeto de evento: Event . El conjunto de propiedades de este objeto depende del evento que describe. Aquí, por ejemplo, hay un código que demuestra el manejo de los eventos de pulsación de teclas del teclado usando el evento keydown de un objeto de keydown .

 <!DOCTYPE html> <html> <body>   <script>       window.addEventListener('keydown', event => {           //              console.log(event.type, event.key)       })       window.addEventListener('mousedown', event => {           //             //0 -  , 2 -            console.log(event.type, event.button, event.clientX, event.clientY)       })   </script> </body> </html> 

Como puede ver, aquí, para mostrar información sobre la tecla presionada en la consola, se utiliza la propiedad del objeto key . La propiedad type también se usa aquí, indicando el tipo de evento. En este ejemplo, en realidad estamos trabajando con un objeto KeyboardEvent , que se utiliza para describir eventos relacionados con el teclado. Este objeto es el descendiente del objeto Evento . Los objetos diseñados para manejar una variedad de eventos amplían las capacidades de un objeto de evento estándar.

En el mismo ejemplo, el objeto MouseEvent se usa para procesar eventos del mouse. En el mousedown eventos de mousedown , imprimimos en la consola el tipo de evento, el número de button (propiedad del button ) y las coordenadas del puntero en el momento del clic ( clientY clientX y clientY ).

El objeto DragEvent se usa para manejar eventos que ocurren al arrastrar elementos de la página.

Entre las propiedades del objeto Event disponible en otros objetos de evento, podemos mencionar la propiedad de type ya mencionada y la propiedad de target , que apunta al elemento DOM en el que ocurrió el evento. Un objeto de Event tiene métodos. Por ejemplo, el método createEvent() permite crear nuevos eventos.

▍ Superficies de eventos


Considere el siguiente ejemplo.

 <!DOCTYPE html> <html>   <head>       <style>           #container {               height: 100px;               width: 200px;               background-color: blue;           }           #child {               height: 50px;               width: 100px;               background-color: green;           }       </style>   </head>   <body>   <div id="container">       <div id="child">       </div>   </div>   <script>       const contDiv = document.getElementById('container')       contDiv.addEventListener('click', event => {           console.log('container')       })       const chDiv = document.getElementById('child')       chDiv.addEventListener('click', event => {           console.log('child')       })       window.addEventListener('click', event => {           console.log('window')       })       </script> </body> </html> 

Si abre la página con este código en el navegador, abra la consola y haga clic con el mouse primero en el área libre de la página, luego en el rectángulo azul y luego en verde, lo siguiente entrará en la consola:

 window container window child container window 


Evento burbujeante

Lo que se puede observar aquí se llama evento burbujeante. A saber, el evento que ocurre en el elemento hijo se extiende al elemento padre. Este proceso continúa hasta que el evento alcanza el elemento "superior". Si los elementos a través de los cuales pasa el evento emergente tienen definidos los controladores correspondientes, se llamarán de acuerdo con el orden de la distribución del evento.

El stopPropagation() eventos se puede detener utilizando el método stopPropagation() del objeto de stopPropagation() . Por ejemplo, si es necesario que, después de hacer clic en el elemento child , el evento correspondiente no se propague más, necesitamos reescribir el código en el que le asignamos el controlador de eventos de click siguiente manera.

 chDiv.addEventListener('click', event => {   console.log('child')   event.stopPropagation() }) 

, , — , — container , — child , .

 window container window child 


, .

load


load window . , , HTML- body .


click . dblclick — . click dblclick , click , — dblclick . mousedown , mousemove , mouseup , . , mousemove , , , . , - , . .


keydown . , . — keyup .

scroll


scroll window . , , , window.scrollY .

, , mousemove , .


mousemove scroll . - . . «» (throttling), Lodash . , , , , . .

 let cached = null window.addEventListener('mousemove', event => {   if (!cached) {       setTimeout(() => {           //     cached           console.log(cached.clientX, cached.clientY)           cached = null           }, 100)   }   cached = event }) 

, mousemove , 100 .

ES-


ES6 , ES-. , , -, , Node.js, .

, . , , . , , .

Node.js CommonJS. , ES-, , . , , ES-, , , , . , caniuse.com , 2018 ES- 80%.

ES- Node.js.

▍ ES-


Node.js ES- .

 import package from 'module-name' 

CommonJS- .

 const package = require('module-name') 

, JavaScript-, - . Esto se hace usando la palabra clave export . , , , , uppercase.js . .

 export default str => str.toUpperCase() 

, . .
( , ) .

HTML- , <script> type="module" .

 <script type="module" src="index.js"></script> 

, (defer) . , , uppercase.js , , , . -. , -. , VSCode, Live Server ( — ritwickdey.liveserver).

 <!DOCTYPE html> <html> <head> </head> <body>   <script type="module">     import toUpperCase from './uppercase.js'     console.log(toUpperCase('hello'))   </script> </body> </html> 

HELLO .

URL.

 import toUpperCase from 'https://flavio-es-modules-example.glitch.me/uppercase.js' 

, , ./ / .


, .

 export default str => str.toUpperCase() 

.

 const a = 1 const b = 2 const c = 3 export { a, b, c } 

module.js , , , .

 <html> <head> </head> <body>   <script type="module">     import * as m from './module.js'     console.log(ma, mb, mc)   </script> </body> </html> 

1 2 3 .

, , .

 import { a } from './module.js' import { a, b } from './module.js' 

, , .

 console.log(a) 

:

 import { a, b as two } from './module.js' 

, , , , . module.js .

 const a = 1 const b = 2 const c = 3 export { a, b, c } export default () => console.log('hi') 

.

 import sayHi, { a } from './module.js' console.log(a) sayHi() 

.

▍CORS


CORS . , CORS, ( Access-Control-Allow-Origin: * ).

▍ nomodule


, , , script , nomodule . , , .

 <script type="module" src="module.js"></script> <script nomodule src="fallback.js"></script> 

▍ ES6 WebPack


ES6 — , , ECMAScript. , , , , . , WebPack, , , .

▍ CommonJS


, Node.js CommonJS. , . CommonJS npm.

CommonJS-, , . , up-node.js .

 exports.uppercase = str => str.toUpperCase() 

, .

 const up = require('./up-node.js') console.log(up.uppercase('hello')) 

HELLO .

, npm, , .

 const package = require('module-name') 

CommonJS , . .

CommonJS- .

 exports.a = 1 exports.b = 2 exports.c = 3 

, .

 const { a, b, c } = require('./up-node.js') 


, JavaScript — . Math , . , , JS- .


(+)


+ . :

 const three = 1 + 2 //3 const four = three + 1 //4 

, , , .

 'three' + 1 // three1 

(-)


 const two = 4 - 2 //2 

(/)


.

 20 / 5 //4 20 / 7 //2.857142857142857 

0, . Infinity ( ) - Infinity ( ).

 1 / 0 //Infinity -1 / 0 //-Infinity 

(%)


% , .

 20 % 5 //0 20 % 7 //6 

0 NaN (Not a Number — ).

 1 % 0 //NaN -1 % 0 //NaN 

(*)


 1 * 2 //2 -1 * 2 //-2 

(**)


, .

 1 ** 2 //1 2 ** 1 //2 2 ** 2 //4 2 ** 8 //256 8 ** 2 //64 


(++)


++ 1 . .

1 , .

 let x = 0 ++x //1 x //1 

— , .

 let x = 0 x++ //0 x //1 

(--)


-- ++ , 1 , .

 let x = 0 x-- //0 x //-1 --x //-2 

(-)


.

 let x = 2 -x //-2 x //2 

(+)


, , . — .

 let x = 2 +x //2 x = '2' +x //2 x = '2a' +x //NaN 


JavaScript, ( = ), , . , , += .

 let x = 2 x += 3 x //5 

: « , , , , ». , .

 let x = 2 x = x + 3 x //5 

:

  • -=
  • *=
  • /=
  • %=
  • **=


. , .

 const a = 1 * 2 + 5 / 2 % 2 

2.5 . , . , .

  • - + ++ -- — ,
  • / % — , ,
  • + -
  • = += -= *= /= %= **=

, , . , .

 const a = 1 * 2 + 5 / 2 % 2 const a = 2 + 2.5 % 2 const a = 2 + 0.5 const a = 2.5 

. .

 const a = 1 * (2 + 5) / 2 % 2 

1.5 .

▍ Math


Math , . . , .

, , Math.E — , e, Math.PI — , π.

 Math.E // 2.718281828459045 Math.PI //3.141592653589793 

.

  • Math.abs()
  • Math.ceil() — , ,
  • Math.cos() — ,
  • Math.floor() — , ,
  • Math.max()
  • Math.min()
  • Math.random() — [0, 1) ( 1)
  • Math.round()
  • Math.sqrt()


JavaScript , .

  • == — . .
  • != — .

, . , , , .

  • ===
  • !==

.

  • < — «»
  • > — «».
  • <= — « ».
  • >= — « ».

, .

 1 === true //false 1 == true //true 

, , 1 true . 1 true , 1 true .


, , . Node.js. , :


PDF- Node.js.

Resumen


, this, , , . , ES6.

Estimados lectores! , JavaScript?

Source: https://habr.com/ru/post/es431072/


All Articles