Modo estricto de JavaScript

El modo estricto es una función de ES5 y es una forma de hacer que JavaScript se comporte de una mejor manera. Y de una manera diferente, ya que habilitar el modo estricto cambia la semántica del lenguaje JavaScript. Es realmente importante conocer las principales diferencias entre el código JavaScript en modo estricto y el JavaScript normal, que a menudo se conoce como modo descuidado.

El modo estricto es unES5función, y es una forma de hacer que JavaScript se comporte en unamejor manera.

Y en undiferente modo, ya que habilitar el modo estricto cambia la semántica del lenguaje JavaScript.

Es muy importante conocer las principales diferencias entre el código JavaScript en modo estricto y el JavaScript "normal", que a menudo se denominamodo descuidado.

El modo estricto elimina principalmente la funcionalidad que era posible en ES3 y en desuso desde ES5 (pero no se eliminó debido a los requisitos de compatibilidad con versiones anteriores)

Cómo habilitar el modo estricto

El modo estricto es opcional. Al igual que con todos los cambios importantes en JavaScript, no podemos cambiar cómo se comporta el lenguaje de forma predeterminada, porque eso rompería miles de millones de JavaScript, y JavaScript se esfuerza mucho para asegurarse de que el código JavaScript de 1996 todavía funcione en la actualidad. Es la clave de su éxito.

Entonces tenemos el'use strict'directiva que necesitamos usar para habilitar el modo estricto.

Puedes ponerlo al principio de un archivo, para aplicarlo a todo el código contenido en el archivo:

'use strict'

const name = ‘Flavio’ const hello = () => ‘hey’

//…

También puede habilitar el modo estricto para una función individual, poniendo'use strict'al comienzo del cuerpo de la función:

function hello() {
  'use strict'

return ‘hey’ }

Esto es útil cuando se opera con código heredado, donde no tiene tiempo para probar o la confianza para habilitar el modo estricto en todo el archivo.

Qué cambia en el modo estricto

Variables globales accidentales

Si asigna un valor a una variable no declarada, JavaScript crea de forma predeterminada esa variable en el objeto global:

;(function() {
  variable = 'hey'
})()(() => {
  name = 'Flavio'
})()

variable //‘hey’ name //‘Flavio’

Al activar el modo estricto, se genera un error si intenta hacer lo que hicimos anteriormente:

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

Variable not defined

Errores de asignación

JavaScript falla silenciosamente algunos errores de conversión.

En el modo estricto, esos errores silenciosos ahora plantean problemas:

const undefined = 1(() => {
  'use strict'
  undefined = 1
})()

Lo mismo se aplica a Infinity, NaN,eval,argumentsy más.

En JavaScript, puede definir una propiedad de un objeto para que no se pueda escribir, usando

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

En modo estricto, no puede anular este valor, mientras que en modo descuidado eso es posible:

Lo mismo funciona para getters:

const car = {
  get color() {
    return 'blue'
  }
}
car.color = 'red'(
  //ok

  () => {
    'use strict'
    car.color = 'yellow' //TypeError: Cannot set property color of #<Object> which has only a getter
  }
)()

El modo descuidado permite extender un objeto no extensible:

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

  () => {
    'use strict'
    car.owner = 'Flavio' //TypeError: Cannot add property owner, object is not extensible
  }
)()

(verObject.preventExtensions())

Además, el modo descuidado permite establecer propiedades en valores primitivos, sin fallar, pero también sin hacer nada en absoluto:

true.false = ''(
  //''
  1
).name =
  'xxx' //'xxx'
var test = 'test' //undefined
test.testing = true //true
test.testing //undefined

El modo estricto falla en todos esos casos:

;(() => {
  'use strict'
  true.false = ''(
    //TypeError: Cannot create property 'false' on boolean 'true'
    1
  ).name =
    'xxx' //TypeError: Cannot create property 'name' on number '1'
  'test'.testing = true //TypeError: Cannot create property 'testing' on string 'test'
})()

Errores de eliminación

En modo descuidado, si intenta eliminar una propiedad que no puede eliminar, JavaScript devuelve falso, mientras que en modo estricto, genera un TypeError:

delete Object.prototype(
  //false

  () => {
    'use strict'
    delete Object.prototype //TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
  }
)()

Argumentos de función con el mismo nombre

En funciones normales, puede tener nombres de parámetros duplicados:

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

(function(a, a, b) { ‘use strict’ console.log(a, b) })(1, 2, 3) //Uncaught SyntaxError: Duplicate parameter name not allowed in this context

Tenga en cuenta que las funciones de flecha siempre generan unSyntaxErroren este caso:

((a, a, b) => {
  console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context

Sintaxis octal

La sintaxis octal en modo estricto está deshabilitada. De forma predeterminada, anteponer un0a un número compatible con el formato numérico octal hace que (a veces de manera confusa) se interprete como un número octal:

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

(() => {
  'use strict'
  console.log(010)
})()
//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

Aún puede habilitar números octales en modo estricto usando el0oXXsintaxis:

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

Remotowith

El modo estricto desactiva elwithpalabra clave, para eliminar algunos casos extremos y permitir una mayor optimización a nivel del compilador.


Más tutoriales de js: