• 售前

  • 售后

热门帖子
入门百科

js删除对象中的某一个字段的方法实现

[复制链接]
我们还在一起 显示全部楼层 发表于 2021-10-25 19:00:03 |阅读模式 打印 上一主题 下一主题
本文重要先容了js删除对象中的某一个字段的方法实现,分享给各人,具体如下:
  1. // 以下方法不改变原来对象
  2.    let item = {
  3.     name:'张三',
  4.     age:'18',
  5.     gender:'男'
  6.    };
  7.    console.log(item) // {age: "18",gender: "男",name: "张三"}
  8.    let { age,...params } = item;
  9.    console.log(item) // {age: "18",gender: "男",name: "张三"}
  10.    console.log(typeof params.age) // undefined
  11.    console.log(params) // {gender: "男",name: "张三"}
  12.    // 以下方法会直接改变对象
  13.    let item1 = {
  14.     name:'张三',
  15.     age:'18',
  16.     gender:'男'
  17.    };
  18.    console.log(item1) // {age: "18",gender: "男",name: "张三"}
  19.    delete item1.name;
  20.    console.log(typeof item1.name) // undefined
  21.    console.log(item1) // // {age: "18",gender: "男"}
复制代码
与通常的看法差别,delete操纵符与直接开释内存无关。内存管理 通过断开引用来间接完成的,检察内存管理页可相识详情。

delete 操纵符会从某个对象上移除指定属性。成功删除的时候会返回 true,否则返回 false。

但是,以下情况必要重点思量:

如果你试图删除的属性不存在,那么delete将不会起任何作用,但仍会返回true
如果对象的原型链上有一个与待删除属性同名的属性,那么删除属性之后,对象会使用原型链上的谁人属性(也就是说,delete操纵只会在自身的属性上起作用)
任何使用 var 声明的属性不能从全局作用域或函数的作用域中删除。
如许的话,delete操纵不能删除任安在全局作用域中的函数(无论这个函数是来自于函数声明或函数表达式)
除了在全局作用域中的函数不能被删除,在对象(object)中的函数是能够用delete操纵删除的。
任何用let或const声明的属性不能够从它被声明的作用域中删除。
不可设置的(Non-configurable)属性不能被移除。这意味着像Math, Array, Object内置对象的属性以及使用Object.defineProperty()方法设置为不可设置的属性不能被删除。

下面的代码块给出了一个简单的例子:
  1. var Employee = {
  2. age: 28,
  3. name: 'abc',
  4. designation: 'developer'
  5. }
  6. console.log(delete Employee.name);  // returns true
  7. console.log(delete Employee.age);  // returns true
  8. // 当试着删除一个不存在的属性时
  9. // 同样会返回true
  10. console.log(delete Employee.salary); // returns true
复制代码
不可配置属性


当一个属性被设置为不可设置,delete操纵将不会有任何效果,而且会返回false。在严格模式下会抛出语法错误(SyntaxError)。
  1. var Employee = {};
  2. Object.defineProperty(Employee, 'name', {configurable: false});
  3. console.log(delete Employee.name); // returns false
复制代码
var, let以及const创建的不可设置的属性不能被delete操纵删除。
  1. var nameOther = 'XYZ';
  2. // 通过以下方法获取全局属性:
  3. Object.getOwnPropertyDescriptor(window, 'nameOther');
  4. // 输出: Object {value: "XYZ",
  5. //         writable: true,
  6. //         enumerable: true,
  7. //         configurable: false}
  8. // 因为“nameOther”使用var关键词添加,
  9. // 它被设置为不可设置(non-configurable)
  10. delete nameOther;  // return false
复制代码
在严格模式下,如许的操纵会抛出异常。

严格模式与非严格模式的对比


在严格模式下,如果对一个变量的直接引用、函数的参数大概函数名使用delete操纵,将会抛出语法错误(SyntaxError)。因此,为制止严格模式下的语法错误,必须以delete object.property或delete object['property']的形式使用delete运算符。
  1. Object.defineProperty(globalThis, 'variable1', { value: 10, configurable: true, });
  2. Object.defineProperty(globalThis, 'variable2', { value: 10, configurable: false, });
  3. console.log(delete variable1); // true
  4. // SyntaxError in strict mode.
  5. console.log(delete variable2); // false
复制代码
  1. function func(param) {
  2. // SyntaxError in strict mode.
  3. console.log(delete param); // false
  4. }
  5. // SyntaxError in strict mode.
  6. console.log(delete func); // false
复制代码
任何使用var声明的变量都会被标记为不可设置的。在下面的例子中,salary是不可设置的以及不能被删除的。在非严格模式下,下面的delete操纵将会返回false。
  1. function Employee() {
  2. delete salary;
  3. var salary;
  4. }
  5. Employee();
复制代码
让我们来看看雷同的代码在严格模式下会有怎样的表现。会抛出一个语法错误( SyntaxError)而不是返回false。
"use strict";
  1. function Employee() {
  2. delete salary; // SyntaxError
  3. var salary;
  4. }
  5. // 相似的,任何对任何函数
  6. // 直接使用delete操作将会抛出语法错误。
  7. function DemoFunction() {
  8. //some code
  9. }
  10. delete DemoFunction; // SyntaxError
复制代码
示例

  1. // 在全局作用域创建 adminName 属性
  2. adminName = 'xyz';
  3. // 在全局作用域创建 empCount 属性
  4. // 因为我们使用了 var,它会标记为不可配置。同样 let 或 const 也是不可配置的。
  5. var empCount = 43;
  6. EmployeeDetails = {
  7. name: 'xyz',
  8. age: 5,
  9. designation: 'Developer'
  10. };
  11. // adminName 是全局作用域的一个属性。
  12. // 因为它不是用 var 创建的,所在可以删除。
  13. // 因此,它是可配置的。
  14. delete adminName;    // 返回 true
  15. // 相反,empCount 是不可配置的,
  16. // 因为创建它时使用了 var。
  17. delete empCount;    // 返回 false
  18. // delete 可用于删除对象的属性
  19. delete EmployeeDetails.name; // 返回 true
  20. // 甚至属性不存在,它也会返回 "true"
  21. delete EmployeeDetails.salary; // 返回 true
  22. // delete 对内建静态属性不起作用
  23. delete Math.PI; // 返回 false
  24. // EmployeeDetails 是全局作用域的一个属性。
  25. // 因为定义它的时候没有使用 "var",它被标记为可配置。
  26. delete EmployeeDetails;  // 返回 true
  27. function f() {
  28. var z = 44;
  29. // delete 对局部变量名不起作用
  30. delete z;   // 返回 false
  31. }
复制代码
delete 和原型链


在下面的示例中,我们删除一个对象的自己的属性,而原型链上具有雷同名称的属性可用:
  1. function Foo() {
  2. this.bar = 10;
  3. }
  4. Foo.prototype.bar = 42;
  5. var foo = new Foo();
  6. // 返回 true,因为删除的是 foo 对象的自身属性
  7. delete foo.bar;
  8. // foo.bar 仍然可用,因为它在原型链上可用。
  9. console.log(foo.bar);  //42
  10. // 从原型上删除属性
  11. delete Foo.prototype.bar; //true
  12. // 由于已删除“ bar”属性,因此不能再从Foo继承它。
  13. console.log(foo.bar);  //undefined
复制代码
删除数组元素


当你删除一个数组元素时,数组的长度不受影响。即便你删除了数组的末了一个元素也是如此。

当用 delete 操纵符删除一个数组元素时,被删除的元素已经不再属于该数组。下面的例子中用 delete 删除了 trees[3]。
  1. var trees = ["redwood","bay","cedar","oak","maple"];
  2. delete trees[3];
  3. if (3 in trees) {
  4.   // 这里不会执行
  5. }
复制代码
如果你想让一个数组元素继续存在但是其值是 undefined,那么可以使用将 undefined 赋值给这个元素而不是使用 delete。下面的例子中,trees[3] 被赋值为 undefined,但该元素仍然存在。
  1. var trees = ["redwood","bay","cedar","oak","maple"];
  2. trees[3] = undefined;
  3. if (3 in trees) {
  4.   // 这里会被执行
  5. }
复制代码
如果你想通过改变数组的内容来移除一个数组元素,请使用splice() 方法。在下面的例子中,通过使用splice(),将trees[3]从数组中移除。
  1. var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
  2. trees.splice(3,1);
  3. console.log(trees); // ["redwood", "bay", "cedar", "maple"]
复制代码
到此这篇关于js删除对象中的某一个字段的文章就先容到这了,更多相干js删除对象中的某一个字段内容请搜索草根技术分享从前的文章或继续欣赏下面的相干文章盼望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作