web-dev-qa-db-ja.com

Javascript5 strictモードで削除が許可されないのはなぜですか?

私はJavaScriptを初めて使用しますが、危険なほど高速で表現力に欠けるのが大好きです。とはいえ、「use strict」モードで操作しているときは、オブジェクトを削除できないことに気付いたようです。私は物事を削除することを大したファンではありません(理論的には、スコープはとにかくそれを処理する必要があるからです)が、この機能を削除する動機は何だったのでしょうか?

47
sircodesalot

deleteステートメントはストリクトモードでも引き続き使用できますが、特定の用途には誤りがあります。単純な名前ではなく、オブジェクトプロパティに対してのみ許可され、削除可能なオブジェクトプロパティに対してのみ許可されます。

かくして

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

大丈夫ですが、

delete Object.prototype;

でもなく、どちらでもない

delete a;

(後者は実際には構文レベルのエラーですが、削除できないプロパティを削除しようとすると、ランタイムエラーになります。)

71
Pointy

[削除]例で詳細に説明

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