【5天打卡】学习Lodash的第五天——总结篇

news/2025/2/12 7:58:46/

Lodash 含有 Array, Collection, Date, Function, Lang, Math, Number, Object, String 等多个功能模块,总共几百个功能函数。官方文档上以字典顺序排序,不容易总结记忆。通过这5天的学习,我们对这一框架进行总结。主要从lodash的使用优势和迷人细节来辩证看待这一框架。lodash函数的实现非常严谨、高效、兼容性强,以及具有一定的前瞻性。但考虑与ES6部分重合,也不一定要用它完全替代。

目录

 lodash优势:

1.lodash在具体使用时按需引入,避免引入不必要的代码:

2.lodash提供的api具有ES6没有的功能,可以省去很多复杂逻辑,优雅而便捷;

3.lodash 的所有操作都是 null-safe 的,而 ES6 完全不考虑

4.lodash 的操作(例如 forEach)都是对对象数组都可用的,而 ES6 原生方法往往只对数组有效。

5.Lodash 还提供了几乎所有浏览器的兼容,很多浏览器对ES6-12的兼容还没完全,所以先使用lodash替代。

6.lodash对于server 端、框架或是工具库开发而言,如果无法预测代码会跑在什么环境,有 lodash 能少考虑很多兼容的问题少做很多测试。

7.lodash很多方法都提供了 path 以及一些很方便的参数,可以大幅度减少代码量.

8.lodash很多immutable,生成新的数据,不影响老数据。是而 JS 原生的 Array 方法,有一些是 mutable 的,有一些是 immutable 的,导致很多坑。

Lodash的迷人细节:

1.length = start > end ? 0 : ((end - start) >>> 0)

2.arr instanceof Array

3._.eq(value, other)

4._.isNaN

5. (-0).toString() === '0'?苦恼!

6. JS 的世界里,谁不能转化为数字?

7. _.repeat 的优化手段


所以我们一起来学习Lodash,今天打卡第五天,加油!

 lodash优势:

1.lodash在具体使用时按需引入,避免引入不必要的代码:

// 方式1:引入整个lodash对象
import _ from "lodash";// 方式2:按模块引入import map from 'lodash/fp/map';// 方式3:按名称引入特定的函数
import { cloneDeep } from "lodash"; 

2.lodash提供的api具有ES6没有的功能,可以省去很多复杂逻辑,优雅而便捷;

const obj={a: {b: {c: {one: 'blue', two: 'red'}}}}
let tmp = obj && obj.a && obj.a.b && obj.a.b.c
tmp && Object.keys(tmp).map(key => tmp[key])  // / ["blue", "red"]
// lodash 优雅简化
const obj={a: {b: {c: {one: 'blue', two: 'red'}}}}
_.map(_.get(obj, 'a.b.c'), (item, key)=> item)   // ["blue", "red"]

3.lodash 的所有操作都是 null-safe 的,而 ES6 完全不考虑

4.lodash 的操作(例如 forEach)都是对对象数组都可用的,而 ES6 原生方法往往只对数组有效。

5.Lodash 还提供了几乎所有浏览器的兼容,很多浏览器对ES6-12的兼容还没完全,所以先使用lodash替代。

6.lodash对于server 端、框架或是工具库开发而言,如果无法预测代码会跑在什么环境,有 lodash 能少考虑很多兼容的问题少做很多测试。

7.lodash很多方法都提供了 path 以及一些很方便的参数,可以大幅度减少代码量.

8.lodash很多immutable,生成新的数据,不影响老数据。是而 JS 原生的 Array 方法,有一些是 mutable 的,有一些是 immutable 的,导致很多坑。

Lodash的迷人细节:

1.length = start > end ? 0 : ((end - start) >>> 0)

在有用到 Array.length 的场景,可用 >>> 0 做参数防护,在 JS 中,Array.length 是一个 32 位无符号整型数字,而通过无符号位移运算 >>> 0,就是为了确保我们得到的正确的 length 值,它总是能得到一个 32-bit unsigned ints 。

2.arr instanceof Array

我们会用 instanceof 去判断实例与类之间的关系,但是这种关系可靠吗?

arr instanceof Array 为 true 肯定 arr 就是一个数组,但是为 false 是不是就表示 arr 肯定不是数组呢?

不能!在有多个 frame 的时候就不能...

let xArray = window.frames[0].Array; // origin from iframe's window
let arr = new xArray(1, 2, 3);arr instanceof Array; // falseArray.isArray(arr); // true

也就是,你以为的并不都是你以为的 ... 虽然我们平时不常会有多个 frame 间这种级别的类的混用,但是以防万一...

通常,在需要判断是否是数组时,可以使用 Array.isArray 或者它的 Polyfill:

if (!Array.isArray) {Array.isArray = function(arg) {return Object.prototype.toString.call(arg) === '[object Array]';};
} 

3._.eq(value, other)

判断 value 和 other 是否(强)相等,在 ECMA 规范中对于相等其实是有明确的定义的,其中 NaN === NaN,但是在 JS 中,NaN 是不与任何值相等的,包括自身,而 Lodash 弥补了这部分的不足,那怎么判断 NaN === NaN 呢?

function eq(value, other) {return value === other || (value !== value && other !== other)
}

我们知道 NaN 是唯一个不与自身相等的值,因此可以通过这个特性分别得到 value 和 other 是否是 NaN,如果是,则两者相等,返回 true.

4._.isNaN

如何判断是否是 NaN ?

通过 isNaN 全局方法?

isNaN('x')       // trueisNaN(NaN)       // trueisNaN(0)         // false

全局方法 isNaN 是有坑的,它的 NaN 定义估计真的是 not a number, 而不是值得 NaN 这个s数值,也就是除了 NaN, 对于 不能转化为数字 的情况都会返回 true ... 糟心!其实这个问题已经在 ES6 中被改善啦,Number.isNaN分分钟教isNaN 做人,Number.isNaN 只会对 NaN 返回 true, 其他情况都是 false...

5. (-0).toString() === '0'?苦恼!

-0 的 toString 竟然没有保留 - ,坑爹嘛不是...

但是,_.toString(-0) === '-0' ,如何做的?

// 一系列的前置检查和转化后...
const INFINITY = 1 / 0; // 手动 INFINITY
const res = `${value}`;if (res === '0' && 1 / value === -INFINITY) {return '-0';
} else {return res;
}

6. JS 的世界里,谁不能转化为数字?

数字、数字字符串肯定是可以的...

对象?或者非数字的字符串?它们也能得到 NaN

Symbol !

Number('xx')          // NaNNumber(new Object())  // NaNNumber(Symbol())
// --> Uncaught TypeError: Cannot convert a Symbol value to a number

另外,Symbol 可以显示的转化为 String 和 Boolean, 但是,不能进行任何隐式转换,也就是不能对 Sybmol 进行运算,比如:

const symbol = Symbol();1 + symbol       // TypeError'1' + symbol     // TypeError// 可显示转化为 布尔 和 字符串
Boolean(symbol)  // trueString(symbol)   // "Symbol()"

7. _.repeat 的优化手段

_.repeat([str = ''], [times = 1])

指定 string 重复 n 次输出,可以很简单的通过循环实现:

const repeat = (str = '', times = 1) => {let res = str;while (--times) {res += str;}return res;
}repeat('6', 3); // 666

Easy ? 好像不是特别完美吧,设想 repeat('6', 4) 按照上述实现需要循环 4 次,但是其实是可以通过两次操作就把最终结果拼接出来的,就相当于 repeat(repeat('6', 2), 2) ,所以这块是有优化空间的,来看优化后的算法:

const repeat = (str = '', times = 1) => {let result = '';if (!str || times < 1) {return result;}do {if (times % 2) {result += str;}times = Math.floor(times / 2);if (times) {str += str;}} while (times)return result;
}

性能对比:repeat('hello world', 100000) 测试的 benchmark:

远远超出 ...

总结:Lodash这个库真香,但是还是要辩证看待,需要了解它的安全漏洞,安全避开,还要了解它部分修改原数据的api,然后注意按需引入。

以上就是今天的学习,欢迎关注我,大家一起进步!

欢迎点赞,评论,谢谢!~

参考学习:

Lodash 源码中的那些迷人的细节 - 知乎


http://www.ppmy.cn/news/53231.html

相关文章

计网—TCP重传、滑动窗口

一、TCP如何保证可靠传输 确认和重传&#xff1a;接收方收到报文就会确认&#xff0c;发送方发送一段时间后没有收到确认就会重传。序号机制&#xff08;序号、确认号&#xff09;&#xff1a;确保了数据是按序、完整到达。数据校验&#xff1a;TCP报文头有校验和&#xff0c;用…

Parker机电产品(运动控制/伺服电机/直线电机)在FPD行业应用

Parker新控制器-PAC PAC集高级逻辑控制&#xff0c;多轴运动&#xff0c;信号处理和webpublished可视化功能。 采用工业主流的EtherCAT运动控制协议&#xff0c;I/O扩展和第三方设备链接&#xff0c;结合应用开发软件PARKERAutomation Manager &#xff0c; PAC能为OEM需要的…

探究CSS3-11中的新特性:自定义字体的应用

随着互联网的发展&#xff0c;网页设计已经成为了一个非常重要的领域。而在网页设计中&#xff0c;字体的使用是至关重要的&#xff0c;因为字体的样式和风格决定了网页的整体风格和用户体验。如果网页中的字体不符合用户的审美习惯&#xff0c;就很容易引起用户的反感&#xf…

Centos 7 防火墙 firewalld 相关基础命令

目录 1. 安装 firewalld 防火墙2. firewalld 基本命令3. firewall-cmd 基本命令 【注】在 Centos7 下默认的防火墙变成了 firewalld&#xff0c;而不再是之前的 iptables&#xff0c;如果买阿里云或者腾讯云的服务器的话一般是没有防火墙的需要自己进行安装。 【注】其实 fire…

如何在已创建的SpringBoot项目基础上添加依赖

假设此时已经创建了一个SpringBoot项目&#xff0c;在使用的时候发现缺少 lombok 依赖&#xff0c;此时如何在不创建新项目的基础上添加该依赖&#xff1f;有两种方式&#xff1a; 通过Maven中央仓库导入依赖使用插件EditStarters导入依赖 1&#xff0c;通过Maven中央仓库导入依…

【移动端网页布局】流式布局案例 ① ( 视口标签设置 | CSS 样式文件设置 | 布局宽度设置 | 设置最大宽度 | 设置最小宽度 )

文章目录 一、视口标签设置二、CSS 样式文件设置三、布局宽度设置1、设置布局宽度2、设置布局最大宽度3、设置布局最小宽度4、查看网页最大最小宽度5、布局宽度设置 四、代码示例1、主界面标签2、CSS 布局设置 一、视口标签设置 参考 【移动端网页布局】移动端网页布局基础概念…

【基础】Kafka -- 日志存储

Kafka -- 日志存储 日志文件目录日志索引偏移量索引时间戳索引 日志清理日志删除基于时间基于日志大小基于日志起始偏移量 日志压缩 日志文件目录 Kafka 中的消息以主题为单位进行基本归类&#xff0c;而每个主题又可以划分为一个或者多个分区。在不考虑多副本的情况下&#x…

如何通过筛选高质量爬虫IP提升爬虫效率?

前言 对于做数据抓取的技术员来说&#xff0c;如何稳定高效的爬取数据ip库池起到决定性作用&#xff0c;对于爬虫ip池的维护&#xff0c;可以从以下几个方面入手&#xff1a; 目录 一、验证爬虫ip的可用性二、更新爬虫ip池三、维护爬虫ip的质量四、监控爬虫ip的使用情况 一、验…