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


Posted in Javascript onJanuary 11, 2021

本文主要介绍了js删除对象中的某一个字段的方法实现,分享给大家,具体如下:

// 以下方法不改变原来对象
   let item = {
    name:'张三',
    age:'18',
    gender:'男'
   };
   console.log(item) // {age: "18",gender: "男",name: "张三"}


   let { age,...params } = item;
   console.log(item) // {age: "18",gender: "男",name: "张三"}
   console.log(typeof params.age) // undefined
   console.log(params) // {gender: "男",name: "张三"}

   // 以下方法会直接改变对象
   let item1 = {
    name:'张三',
    age:'18',
    gender:'男'
   };
   console.log(item1) // {age: "18",gender: "男",name: "张三"}
   delete item1.name;
   console.log(typeof item1.name) // undefined
   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()方法设置为不可设置的属性不能被删除。

下面的代码块给出了一个简单的例子:

var 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

不可配置属性

当一个属性被设置为不可设置,delete操作将不会有任何效果,并且会返回false。在严格模式下会抛出语法错误(SyntaxError)。

var Employee = {};
Object.defineProperty(Employee, 'name', {configurable: false});

console.log(delete Employee.name); // returns false

var, let以及const创建的不可设置的属性不能被delete操作删除。

var nameOther = 'XYZ';

// 通过以下方法获取全局属性:
Object.getOwnPropertyDescriptor(window, 'nameOther');

// 输出: Object {value: "XYZ",
//         writable: true,
//         enumerable: true,
//         configurable: false}

// 因为“nameOther”使用var关键词添加,
// 它被设置为不可设置(non-configurable)
delete nameOther;  // return false

在严格模式下,这样的操作会抛出异常。

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

在严格模式下,如果对一个变量的直接引用、函数的参数或者函数名使用delete操作,将会抛出语法错误(SyntaxError)。因此,为避免严格模式下的语法错误,必须以delete object.property或delete object['property']的形式使用delete运算符。

Object.defineProperty(globalThis, 'variable1', { value: 10, configurable: true, });
Object.defineProperty(globalThis, 'variable2', { value: 10, configurable: false, });

console.log(delete variable1); // true

// SyntaxError in strict mode.
console.log(delete variable2); // false
function func(param) {
 // SyntaxError in strict mode.
 console.log(delete param); // false
}

// SyntaxError in strict mode.
console.log(delete func); // false

任何使用var声明的变量都会被标记为不可设置的。在下面的例子中,salary是不可设置的以及不能被删除的。在非严格模式下,下面的delete操作将会返回false。

function Employee() {
 delete salary;
 var salary;
}

Employee();

让我们来看看相同的代码在严格模式下会有怎样的表现。会抛出一个语法错误( SyntaxError)而不是返回false。
"use strict";

function Employee() {
 delete salary; // SyntaxError
 var salary;
}

// 相似的,任何对任何函数
// 直接使用delete操作将会抛出语法错误。

function DemoFunction() {
 //some code
}

delete DemoFunction; // SyntaxError

示例

// 在全局作用域创建 adminName 属性
adminName = 'xyz';

// 在全局作用域创建 empCount 属性
// 因为我们使用了 var,它会标记为不可配置。同样 let 或 const 也是不可配置的。
var empCount = 43;

EmployeeDetails = {
 name: 'xyz',
 age: 5,
 designation: 'Developer'
};

// adminName 是全局作用域的一个属性。
// 因为它不是用 var 创建的,所在可以删除。
// 因此,它是可配置的。
delete adminName;    // 返回 true

// 相反,empCount 是不可配置的,
// 因为创建它时使用了 var。
delete empCount;    // 返回 false

// delete 可用于删除对象的属性
delete EmployeeDetails.name; // 返回 true

// 甚至属性不存在,它也会返回 "true"
delete EmployeeDetails.salary; // 返回 true

// delete 对内建静态属性不起作用
delete Math.PI; // 返回 false

// EmployeeDetails 是全局作用域的一个属性。
// 因为定义它的时候没有使用 "var",它被标记为可配置。
delete EmployeeDetails;  // 返回 true

function f() {
 var z = 44;

 // delete 对局部变量名不起作用
 delete z;   // 返回 false
}

delete 和原型链

在下面的示例中,我们删除一个对象的自己的属性,而原型链上具有相同名称的属性可用:

function Foo() {
 this.bar = 10;
}

Foo.prototype.bar = 42;

var foo = new Foo();

// 返回 true,因为删除的是 foo 对象的自身属性
delete foo.bar;

// foo.bar 仍然可用,因为它在原型链上可用。
console.log(foo.bar);  //42

// 从原型上删除属性
delete Foo.prototype.bar; //true

// 由于已删除“ bar”属性,因此不能再从Foo继承它。
console.log(foo.bar);  //undefined

删除数组元素

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

当用 delete 操作符删除一个数组元素时,被删除的元素已经不再属于该数组。下面的例子中用 delete 删除了 trees[3]。

var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
  // 这里不会执行
}

如果你想让一个数组元素继续存在但是其值是 undefined,那么可以使用将 undefined 赋值给这个元素而不是使用 delete。下面的例子中,trees[3] 被赋值为 undefined,但该元素仍然存在。

var trees = ["redwood","bay","cedar","oak","maple"];
trees[3] = undefined;
if (3 in trees) {
  // 这里会被执行
}

如果你想通过改变数组的内容来移除一个数组元素,请使用splice() 方法。在下面的例子中,通过使用splice(),将trees[3]从数组中移除。

var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
trees.splice(3,1);
console.log(trees); // ["redwood", "bay", "cedar", "maple"]

到此这篇关于js删除对象中的某一个字段的文章就介绍到这了,更多相关js删除对象中的某一个字段内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js 数组实现一个类似ruby的迭代器
Oct 27 Javascript
通过判断JavaScript的版本实现执行不同的代码
May 11 Javascript
js常用代码段整理
Nov 30 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
javascript中将Object转换为String函数代码 (json str)
Apr 29 Javascript
解析js原生方法创建表格效率测试
Jul 08 Javascript
js获取下拉列表框中的value和text的值示例代码
Jan 11 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
vue自动路由-单页面项目(非build时构建)
Apr 30 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
Vue触发input选取文件点击事件操作
Aug 07 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
jQuery实现购物车全功能
Jan 11 #jQuery
jQuery实现手风琴特效
Jan 11 #jQuery
iview实现动态表单和自定义验证时间段重叠
Jan 10 #Javascript
JavaScript canvas实现文字时钟
Jan 10 #Javascript
JS代码实现页面切换效果
Jan 10 #Javascript
原生JavaScript实现购物车
Jan 10 #Javascript
JavaScript Html实现移动端红包雨功能页面
Jan 10 #Javascript
You might like
php 更新数据库中断的解决方法
2009/06/05 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
vuejs如何配置less
2017/04/25 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python接口自动化测试的实现
2020/08/28 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
英语系毕业生自荐信
2013/10/31 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
商场主管竞聘书
2014/03/31 职场文书
法人代表证明书
2014/09/18 职场文书
职工宿舍管理制度
2015/08/05 职场文书
施工安全责任协议书
2016/03/23 职场文书