it-swarm.com.de

Warum ist Löschen im strengen Javascript5-Modus nicht erlaubt?

Ich bin ziemlich neu in Javascript, aber ich bin verliebt in die gefährlich schnelle und lockere Ausdruckskraft. Dabei ist mir aufgefallen, dass Sie scheinbar keine Objekte löschen können, wenn Sie im Modus "streng" arbeiten. Ich bin kein großer Fan des Löschens von Dingen (da der Bereich theoretisch sowieso dafür sorgen sollte), aber ich frage mich, was die Motivation war, dieses Feature zu entfernen?

47
sircodesalot

Die delete -Anweisung ist im strikten Modus weiterhin zulässig, einige bestimmte Verwendungen sind jedoch fehlerhaft. Dies ist nur für Objekteigenschaften zulässig, nicht für einfache Namen, und nur für Objekteigenschaften, die gelöscht werden können.

Somit

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

ist in Ordnung, aber

delete Object.prototype;

ist nicht und ist auch nicht

delete a;

(Letzteres ist tatsächlich ein Syntaxfehler, während der Versuch, eine nicht löschbare Eigenschaft zu löschen, ein Laufzeitfehler ist.)

71
Pointy

[löschen] Im Detail mit Beispiel erklärt

// 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