<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js_delete</title>
</head>
<body>
<script>
/*参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete
知识点:
1.delete 操作符用于删除对象的某个属性。
* 语法:
* delete object.property
delete object['property']
* 参数:
object,对象的名称,或计算结果为对象的表达式。
property,要删除的属性。
* 返回值:
对于所有情况都是 true,除非属性是一个(自己)不可配置的属性,
这种情况下,非严格模式返回 false。
异常:
在严格模式下,如果属性是一个(自己)不可配置的属性,
会抛出 Global_objects/SyntaxError。
* 描述:
与通常的看法不同,delete 操作符与直接释放内存无关。
内存管理通过断开引用来间接完成的,查看内存管理页可了解详情。
delete 操作符会从某个对象上移除指定属性。
* 成功删除的时候回返回 true,否则返回 false。
* 但是,以下情况需要重点考虑:
如果你试图删除的属性不存在,那么delete将不会起任何作用,但仍会返回true
如果对象的原型链上有一个与待删除属性同名的属性,
那么删除属性之后,对象会使用原型链上的那个属性
(也就是说,delete操作只会在自身的属性上起作用)。
任何使用 var 声明的属性不能(从全局作用域或函数的作用域中)删除。
这样的话,delete操作不能删除任何在全局作用域中的函数
(无论这个函数是来自于函数声明或函数表达式)。
在对象(object)中的函数是能够用delete操作删除的。
任何用let或const声明的属性不能够(从它被声明的作用域中)删除。
不可设置的(Non-configurable)属性不能被移除。
这意味着像 Math, Array, Object内置对象的属性以及
使用 Object.defineProperty()方法设置为不可设置的属性不能被删除。
* */
// 1.更改对象的属性名。
let o = {"y": 39.065345, "x": 117.045389, "z": 183.37};
console.log("o:", o);
// o: {y: 39.065345, x: 117.045389, z: 183.37}
o.longitude = o.x, o.latitude = o.y, o.height = o.z;
delete o.x, delete o.y, delete o.z;
console.log("o:", o);
// o: {longitude: 117.045389, latitude: 39.065345, height: 183.37}
// 2.
console.log("\n2.");
let Employee = {
age: 28,
name: 'abc',
designation: 'developer'
};
console.log(delete Employee.name); // returns true
console.log(delete Employee.age); // returns true
// 当试着删除一个不存在的属性时, 同样会返回true
console.log(delete Employee.salary); // returns true
console.log("Employee:", Employee);
// 3.不可配置属性
// 当一个属性被设置为不可设置,delete操作将不会有任何效果,
// 并且会返回false。在严格模式下会抛出语法错误(SyntaxError)。
console.log("\n3.");
Employee = {};
Object.defineProperty(Employee, 'name', {configurable: false});
console.log(delete Employee.name); // returns false
console.log("Employee:", Employee);
// 4.var, let以及const创建的属性,不可设置,不能被delete操作删除。
console.log("\n4.");
let nameOther = 'XYZ';
// 通过以下方法获取全局属性:
console.log(Object.getOwnPropertyDescriptor(window, 'nameOther'));
// var 声明时:{value: "XYZ", writable: true, enumerable: true, configurable: false}
// let 声明时:undefined
// 因为“nameOther”使用var关键词添加,它默认被设置为不可设置(non-configurable)
console.log(delete nameOther); // false
// // 5.
// function f() {
// console.log(delete salary); // false
// var salary;
// }
//
// // "use strict";
// f();
//
// // 6.
// // 在全局作用域创建 adminName 属性
// adminName = 'xyz';
// // 在全局作用域创建 empCount 属性
// var empCount = 43;
// EmployeeDetails = {
// name: 'xyz',
// age: 5,
// designation: 'Developer'
// };
// // adminName 是全局作用域的一个属性。
// // 因为它不是用 var 创建的,所在可以删除。
// // 因此,它是可配置的。
// console.log("6.");
// console.log(delete adminName); // true
// // 相反,empCount 是不可配置的,因为创建它时使用了 var。
// console.log(delete empCount); // false
// // delete 可用于删除对象的属性
// console.log(delete EmployeeDetails.name); // true
// // 甚至属性不存在,它也会返回 "true"
// console.log(delete EmployeeDetails.salary); // true
// // delete 对内建静态属性不起作用
// console.log(delete Math.PI); // false
// // EmployeeDetails 是全局作用域的一个属性。
// // 因为定义它的时候没有使用 "var",它被标记为可配置。
// console.log(delete EmployeeDetails); // true
//
// // 7.delete 和原型链
// // 在下面的示例中,我们删除一个对象的自己的属性,
// // 而原型链上具有相同名称的属性可用:
// function Foo() {
// this.bar = 10;
// }
//
// Foo.prototype.bar = 42;
// var foo = new Foo();
// console.log("7.");
// console.log(foo.bar); // 10
// // 返回 true,因为删除的是 foo 对象的自身属性
// console.log(delete foo.bar); // true
// // foo.bar 仍然可用,因为它在原型链上可用。
// console.log(foo.bar); // 42
// // 从原型上删除属性
// console.log(delete Foo.prototype.bar); // true
// // 输出 "undefined",因为不能继承这个属性了
// console.log(foo.bar); // undefined
//
// // 8.删除数组元素
// // 当你删除一个数组元素时,数组的长度不受影响。
// // 即便你删除了数组的最后一个元素也是如此。
// // 当用 delete 操作符删除一个数组元素时,被删除的元素已经不再属于该数组。
// // 下面的例子中用 delete 删除了 trees[3]。
// let trees = ["a", "b", "c", "d", "e"];
// console.log("8.");
// console.log("tress:", trees);
// // tress: (5) ["a", "b", "c", "d", "e"]
// console.log(delete trees[3]); // true
// console.log("tress:", trees);
// // tress: (5) ["a", "b", "c", empty, "e"]
// if (3 in trees) {
// // 这里不会执行
// console.log("3 in trees");
// }
// // 如果你想让一个数组元素继续存在但是其值是 undefined,
// // 那么可以将 undefined 赋值给这个元素, 而不是使用 delete。
// // 下面的例子中,trees[3] 被赋值为 undefined,但该元素仍然存在。
// trees = ["a", "b", "c", "d", "e"];
// trees[3] = undefined;
// if (3 in trees) {
// // 这里会执行
// console.log("trees[3]:", trees[3]);
// // trees[3]: undefined
// }
//
// // 移除一个数组元素,并改变数组的长度,
// // 请使用splice方法。
// // 通过使用splice,将trees[3]从数组中移除。
// trees = ["a", "b", "c", "d", "e"];
// trees.splice(3, 1);
// console.log("trees:", trees);
// // trees: (4) ["a", "b", "c", "e"]
</script>
</body>
</html>
|