简体   繁体   中英

Why is delete not allowed in Javascript5 strict mode?

I'm fairly new to javascript. I noticed that apparently when operating in "use strict" mode, you can't delete objects. I'm not a huge fan of deleting things (since, in theory, scope should take care of that anyway), but I wonder what was the motivation behind removing this feature?

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.

Thus

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

is fine, but

delete Object.prototype;

is not, and neither is

delete a;

(The latter is actually a syntax-level error, while an attempt to delete an undeletable property is a runtime error.)

[delete] Explained in detail with example

 // 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();

Reference: Delete_in_strict_mode

Normal variables in JavaScript can't be deleted using the delete operator. The delete operator can only delete properties on an object .

Unlike what common belief suggests, the delete operator has nothing to do with directly freeing memory. Memory management is done indirectly via breaking references , see the memory management page and the delete operator page for more details.

This error only happens in strict mode code. In non-strict code, the operation just returns false.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM