想学源码却无从下手,从历史上可能最简单的不到十行的源码开始

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

【初心】

学习源码不是为了面试,想提高代码思维,提升编码水平,开拓写代码的思路,想通过源码学习更能很好的理解原理方面的知识。

【omit.js 的使用】

omit库是一种用于JavaScript对象的简化和转换的工具库。它涉及的功能包括筛选对象的键、重新路由对象的键以及将键中的值删除。

  1. omit方法主要用于快速过滤对象或数组中的某些键
js 复制代码
// 在使用omit库之前,我们需要通过npm安装它:
npm install omit.js  或
npm i --save omit.js

【omit.js 源码解读】

js 复制代码
// eslint-disable-next-line prefer-object-spread
function omit(obj, fields) {
  // omit 可以接收两个参数,第一个参数obj:目标对象,第二个参数fields,是个数组:目标对象中将要被删除的属性 key 组成的数组
  // Object.assign() 主要用于对象的合并,浅拷贝方法
  // Object.assign({}, obj) 第一个参数是目标对象,第二个参数是源对象,将源对象合并到目标对象上。如果不改变原来对象身上的属性,用一个空对象作为目标对象
  const shallowCopy = Object.assign({}, obj);
  // for循环遍历第二个参数 fields,删除参数中的 key 值
  for (let i = 0; i < fields.length; i += 1) {
    const key = fields[i];
    delete shallowCopy[key];
  }
  return shallowCopy;
}

export default omit;

【omit.js 测试源码】

简单示例:

js 复制代码
const omit = require('omit.js');

const obj = {
  name: 'Tom',
  age: 18,
  sex: 'male'
};

const newObj = omit(obj, ['age', 'sex']); // 使用omit过滤掉逗号分隔的键名字符串keys或键名数组
console.log(newObj); //{ name: 'Tom' }
js 复制代码

【omit库提供了两个主要方法:omit和renameKeys】

  1. 拓展:renameKeys方法:该方法用于重新路由对象中的键。
js 复制代码
const {renameKeys} = require('omit.js');

const obj = {
  name: 'John',
  age: 20,
  gender: 'male'
};

const newKeys = {
  name: 'Name',
  age: 'Age'
};
// renameKeys(obj: Object, keyMap: Object): Object
const newObj = renameKeys(obj, newKeys); // renameKeys两个参数:对象。
console.log(newObj); //{ Name: 'John', Age: 20, gender: 'male' }

【总结】

1、omit源码中主要理解了

a. 定义一个浅拷贝对象 const shallowCopy = Object.assign({}, obj);

b. 遍历第二个参数,删除参数一中的 key

2、测试用例中用了断言,有点盲区,于是查阅资料了解:

单源测试中 assert.deepEqual() 和 assert.notEqual() 两个方法,这两个方法NodeJs里

a. assert.deepEqual(): 深度相等: 基本类型的话对比值是否相等,引用类型则是对比引用类型内的属性值是否相等,并不是对比索引

b. assert.notEqual(): 浅层不相等: 期望是结果不相等,基本类型对比值是否相等,引用类型则是对比索引是否相等

3、对源码看不懂的担心减少了,增加了信心

4、学了Object.assign()的使用,顺便写了CSDN方便以后自己复盘这个方法 Object.assign()的使用

相关推荐
RobinXYuan15 小时前
【LevelDB 源码阅读】06 | WAL:日志的物理格式
源码阅读·leveldb
嘎嘎风2 天前
MiniMind 学习笔记之 21 训练细节:数据、分词器、断点续训
gpt·源码阅读
RobinXYuan2 天前
【Kafka 源码手记】01 从消息队列到 Event Streaming
kafka·源码阅读
RobinXYuan3 天前
【LevelDB 源码阅读】05 | WriteBatch:原子写的载体
源码阅读·leveldb
云浪6 天前
Go源码分析:搞懂 Go 是如何实现堆的
后端·go·源码阅读
Android打工仔8 天前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读
嘎嘎风8 天前
MiniMind 学习笔记之 04 注意力之外:位置、记忆、省显存、省时间、深加工
架构·源码阅读
嘎嘎风8 天前
MiniMind 学习笔记之 07 模型怎么学会猜词(旋钮是怎么被拧动的)
算法·源码阅读
嘎嘎风9 天前
MiniMind 学习笔记之 05 从 768 维到下一个 token
github·源码阅读
RobinXYuan12 天前
【LevelDB 源码阅读】03 | 打开一个数据库:DBImpl::Open 与恢复
源码阅读·leveldb