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 相关文章推荐
Javascript中的变量使用说明
May 18 Javascript
js编写trim()函数及正则表达式的运用
Oct 24 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
Aug 06 Javascript
让JavaScript和其它资源并发下载的方法
Oct 16 Javascript
javascript获取系统当前时间的方法
Nov 19 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
基于JS实现的随机数字抽签实例
Dec 08 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
Dec 30 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
JS实现选项卡效果的代码实例
May 20 Javascript
JS forEach跳出循环2种实现方法
Jun 24 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 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中多维数组的foreach遍历示例
2014/06/13 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
JS动画效果代码3
2008/04/03 Javascript
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Python bytes string相互转换过程解析
2020/03/05 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
财务支持类个人的自我评价
2014/02/14 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
会计岗位职责
2015/02/03 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
简爱读书笔记
2015/06/26 职场文书
安全生产奖惩制度
2015/08/06 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js