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)
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) })()
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) })()
▍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()
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()
▍ 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()
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()
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)()
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)
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) </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 => { </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 burbujeanteLo 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(() => {
,
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
, , , .
'three' + 1
(-)
const two = 4 - 2
(/)
.
20 / 5
0, .
Infinity
( ) -
Infinity
( ).
1 / 0
(%)
%
, .
20 % 5
0
NaN
(Not a Number — ).
1 % 0
(*)
1 * 2
(**)
, .
1 ** 2
▍
(++)
++
1
. .
—
1
, .
let x = 0 ++x
— , .
let x = 0 x++
(--)
--
++
,
1
, .
let x = 0 x--
(-)
.
let x = 2 -x
(+)
, , . — .
let x = 2 +x
▍
JavaScript, (
=
), , . , ,
+=
.
let x = 2 x += 3 x
: « , , , , ». , .
let x = 2 x = x + 3 x
:
▍
. , .
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
.
Math.abs()
—Math.ceil()
— , ,Math.cos()
— ,Math.floor()
— , ,Math.max()
—Math.min()
—Math.random()
— [0, 1) ( 1)Math.round()
—Math.sqrt()
—
▍
JavaScript , .
, . , , , .
.
<
— «»>
— «».<=
— « ».>=
— « ».
, .
1 === true
, ,
1
true
.
1
true
,
1
true
.
, , . Node.js. , :
PDF- Node.js.
Resumen
, this, , , . , ES6.
Estimados lectores! , JavaScript?
