<!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>
js_delete.html
最新推荐文章于 2021-06-20 15:01:09 发布