源码阅读02-omit.js


theme: cyanosis

我正在参与掘金会员专属活动-源码共读第一期,点击参与

源码分析

源码地址:https://github.com/benjycui/omit.js/blob/master/src/index.js
function 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 赋值是对值的传递。对象是存储在内存中,赋值时是传递的对象的地址,这样如果修改对象属性的值就导致原对象的值也发生改变。 对于基础数据类型没有深复制和浅复制,而引用类型就会有深复制和浅复制。浅复制和深复制都是对对象的值和引用地址的复制,但是深复制不会对原对象有影响。所以我的理解深复制应该是产生新的引用地址。

“=” 赋值

像基础的赋值 “=” ,赋值的就是对象的引用。
源码阅读02-omit.js 插图1

Object.assign 赋值

Object.assign 是 ES6 语言的新特性。可以对对象复制,但复制的是对象的的引用而不是对象的值本身。
Object.assign(target, ...source)
源码阅读02-omit.js 插图2
深复制,就是完全复制对象的属性和值,到那时它们对应的地址是不同的。这样就不会发生修改某个属性值影响另一个对象的属性值。

其他复制方法

深复制常用的几个方法:
  • _.cloneDeep()
  • JQuery 中提供 extend 方法
let obj1={name:'tome'}
$.extend(true, {}, obj1)
  • 使用 JSON.stringify() 方法但是其对 undefined、symbol 和函数 会被忽略,所以谨慎使用。
所以深复制是更深层次的复制,并在内存中产生新空间存储,所以指向的地址和原来的对象指向地址不同。这样两个对象互相不影响。浅复制还是指向同一个地址内存,所以修改一个值就会影响原来的对象。

对象删除字段

delete 用于删除对象的某个属性。因对象是引用类型存储在内存中,如果被删除后,再次访问其属性就会返回 undefined 结果。但需要注意:
  • 只删除对象本身上的属性,若对象原型链存在同名的属性,对象就会使用原型链上的属性
  • let 和 const 声明的属性是不能在它被声明的作用域中删除
  • 删除一个不存在的属性也不会报错
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容