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 相关文章推荐
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
Nov 12 Javascript
无刷新上传文件并返回自定义值
Jun 11 Javascript
js实现不重复导入的方法
Mar 02 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
Jul 12 Javascript
详解angular2封装material2对话框组件
Mar 03 Javascript
详解webpack异步加载业务模块
Jun 23 Javascript
JS点击动态添加标签、删除指定标签的代码
Apr 18 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
js计算最大公约数和最小公倍数代码实例
Sep 11 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
Apr 24 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
jQuery 解析xml文件
2009/08/09 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
python super()函数的基本使用
2020/09/10 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
金榜题名主持词
2015/07/02 职场文书
运动会开幕式致辞
2015/07/29 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js