theme: cyanosis
我正在参与掘金会员专属活动-源码共读第一期,点击参与
源码分析
源码地址:https://github.com/benjycui/omit.js/blob/master/src/index.jsfunction omit(obj, fields) {
// eslint-disable-next-line prefer-object-spread
const shallowCopy = Object.assign({}, obj);
for (let i = 0; i < fields.length; i += 1) {
const key = fields[i];
delete shallowCopy[key];
}
return shallowCopy;
}
export default omit;
从源代码上可以看出 omit.js, 功能也是很简单。接收2个参数,然后使用循环遍历要删除的字段,在对象中将其删除掉。然后就能返回处理后的对象。关注到其中2个知识点:
- 浅复制
- 删除字段
深浅复制
以前一直以为深复制和浅复制的区别是针对对象的复制,浅复制是对对象的引用地址的复制,深复制是对对象的值和引用地址的复制。 在JS 中基础数据类型 string 、number、boolean、null、undefined 赋值是对值的传递。对象是存储在内存中,赋值时是传递的对象的地址,这样如果修改对象属性的值就导致原对象的值也发生改变。 对于基础数据类型没有深复制和浅复制,而引用类型就会有深复制和浅复制。浅复制和深复制都是对对象的值和引用地址的复制,但是深复制不会对原对象有影响。所以我的理解深复制应该是产生新的引用地址。“=” 赋值
像基础的赋值 “=” ,赋值的就是对象的引用。
Object.assign 赋值
Object.assign 是 ES6 语言的新特性。可以对对象复制,但复制的是对象的的引用而不是对象的值本身。Object.assign(target, ...source)

其他复制方法
深复制常用的几个方法:- _.cloneDeep()
- JQuery 中提供 extend 方法
let obj1={name:'tome'}
$.extend(true, {}, obj1)
- 使用 JSON.stringify() 方法但是其对 undefined、symbol 和函数 会被忽略,所以谨慎使用。
对象删除字段
delete 用于删除对象的某个属性。因对象是引用类型存储在内存中,如果被删除后,再次访问其属性就会返回 undefined 结果。但需要注意:- 只删除对象本身上的属性,若对象原型链存在同名的属性,对象就会使用原型链上的属性
- let 和 const 声明的属性是不能在它被声明的作用域中删除
- 删除一个不存在的属性也不会报错
感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
暂无评论内容