web-dev-qa-db-fra.com

Pourquoi la suppression n'est-elle pas autorisée en mode strict Javascript5?

Je suis assez nouveau pour javascript, mais je suis amoureux de son expressivité dangereusement rapide et lâche. Cela dit, j'ai remarqué que, apparemment, lorsque vous travaillez en mode "utilisation stricte", vous ne pouvez pas supprimer d'objets. Je ne suis pas un grand fan de supprimer des choses (car, en théorie, la portée devrait de toute façon s'en occuper), mais je me demande quelle était la motivation derrière la suppression de cette fonctionnalité?

47
sircodesalot

L'instruction delete est toujours autorisée en mode strict, mais certaines utilisations particulières de celle-ci sont erronées. Il n'est autorisé que pour les propriétés d'objet, pas pour les noms simples, et uniquement pour les propriétés d'objet qui peuvent être supprimées.

Ainsi

var a = {x: 0};
delete a.x;

est bien, mais

delete Object.prototype;

n'est pas, et n'est pas non plus

delete a;

(Ce dernier est en fait une erreur de niveau syntaxique, tandis qu'une tentative de suppression d'une propriété non supprimable est une erreur d'exécution.)

71
Pointy

[supprimer] Expliqué en détail avec un exemple

// The delete statement is still allowed in strict mode, but some particular uses of it are erroneous. It's only allowed for object properties, not simple names, and only for object properties that can be deleted.

// "use strict";

// creates the property adminName on the global scope
adminName = "xyz";

// creates the property empCount on the global scope
// Since we are using var, this is marked as non-configurable. The same is true of let and const.
var empCount = 43;

EmployeeDetails = {
  name: "xyz",
  age: 5,
  designation: "Developer"
};

// adminName is a property of the global scope.
// It can be deleted since it is created without var.
// Therefore, it is configurable.
console.log("delete adminName =", delete adminName); // returns true

// On the contrary, empCount is not configurable,
// since var was used.
console.log("delete empCount =", delete empCount); // returns false

// delete can be used to remove properties from objects
console.log("delete EmployeeDetails.name =", delete EmployeeDetails.name); // returns true

// Even when the property does not exists, it returns "true"
console.log("delete EmployeeDetails.salary =", delete EmployeeDetails.salary); // returns true

// delete does not affect built-in static properties
console.log("delete Math.PI =", delete Math.PI); // returns false

// EmployeeDetails is a property of the global scope.
// Since it defined without "var", it is marked configurable
console.log("delete EmployeeDetails =", delete EmployeeDetails); // returns true

x = 1;
var y = 2;

function f() {
  var z = 44;

  console.log("delete x =", delete x); // returns true
  console.log("delete y =", delete y); // returns false
  // delete doesn't affect local variable names
  console.log("delete z =", delete z); // returns false
}

f.call();
3
Amit Shah