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

news2024/11/26 12:24:39

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; // false

Array.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')       // true

isNaN(NaN)       // true

isNaN(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')          // NaN

Number(new Object())  // NaN

Number(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)  // true

String(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.coloradmin.cn/o/471603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电磁波、射频通信基础知识科普,超通俗解释!

一、电磁波 电磁波是能量的一种&#xff0c;凡是高于绝对零度的物体&#xff0c;都会释出电磁波。电与磁可说是一体两面&#xff0c;电流会产生磁场&#xff0c;变动的磁场则会产生电流。变化的电场和变化的磁场构成了一个不可分离的统一的场。 在低频的电振荡中&#xff0c;…

XCTF-Web2

Web_php_include <?php show_source(__FILE__); echo $_GET[hello]; $page$_GET[page]; while (strstr($page, "php://")) {$pagestr_replace("php://", "", $page); } include($page); ?>strstr() 查找字符串首次出现的位置&#xff0…

集合-ArrayList学习

1、特点&#xff1a; ArrayList 实现是一个动态数组&#xff0c;初始时是一个空数组。ArrayList 默认初始长度为0&#xff0c;在插入第一个元素的时候扩容为10&#xff0c;然后当数组存满的时候&#xff0c;数组会再次扩容&#xff0c;此时就扩容到原来的1.5倍。ArrayList 是线…

打造一个基于低代码的无代码平台,愿满足非专业人士的需求

一、开源项目简介 摸鱼低代码平台希望打造一个基于低代码的无代码平台。即能给程序员使用&#xff0c;也能满足非专业人士的需求。 后端基于Spring Cloud Alibaba注册中心、配置中心采用nacos当前版本完成oauth2统一认证接入持续进行功能完善 二、开源协议 使用Apache-2.0开…

人机交互到艺术设计及玫瑰花绘制实例

Python库之图形用户界面 Riverbank Computing | Introduction Welcome to wxPython! | wxPython Overview — PyGObject Python库之游戏开发 https://www.pygame.org/news Panda3D | Open Source Framework for 3D Rendering & Games python.cocos2d.org Python库之…

MATLAB科研数据可视化

互联网的飞速发展伴随着海量信息的产生&#xff0c;而海量信息的背后对应的则是海量数据。如何从这些海量数据中获取有价值的信息来供人们学习和工作使用&#xff0c;这就不得不用到大数据挖掘和分析技术。数据可视化分析作为大数据技术的核心一环&#xff0c;其重要性不言而喻…

scss、css样式中使用变量的方法;Vue动态改变css等样式文件中的变量

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.遇到一些样式 设置的值都是重复的不想重复写&#xff0c;想和js一样定义一个常量&#xff0c;然后直接引用这个常量。 2.想要在js中动态设置样式中的值&#xff0c;在 css、scss等样式表中直接使用。 二、原因及解…

nacos实战

spring cloud是一系列框架的有序集合&#xff0c;是分布式系统构建工具 服务领域模型 不同的组&#xff08;group&#xff09;之间不能调用&#xff0c;只能进行组内调用 namespace》group/service》cluster》instance 没有nacos的时候 微服务调用&#xff0c;可以直接使用Re…

React18开发总结(完善中)

遇到这样一个问题&#xff0c;初始化时用户登陆后需要获取到用户信息&#xff0c;但是发现获取用户信息这个接口触发了2次&#xff0c;这是不应该的&#xff0c;于是我查阅了一下资料&#xff0c;把自己的笔记记录下来。 还有就是使用mobx遇到的控制台警告问题&#xff0c;也一…

Python 中如何实现自动导入缺失的库?

在编写 Python 项目的时候&#xff0c;我们经常会遇到导入模块失败的错误&#xff1a; ImportError: No module named xxx或者ModuleNotFoundError: No module named xxx 导入失败&#xff0c;通常分为两种&#xff1a;一种是导入自己写的模块&#xff08;即以 .py 为后缀的文件…

你不想成长,生活总会逼着你成长,阿里P8架构师分享十年学习生涯

成为阿里P8&#xff0c;并不是一件容易的事情&#xff0c;我花了将近十年的时间&#xff0c;才达到了这样的目标。这十年间来&#xff0c;说辛苦也是真辛苦&#xff0c;但这些辛苦是让我感觉到满足的&#xff0c;毕竟这样的成功并不是人人都能够得来的。 为了成为阿里P8的这十…

Linux(ubuntu) 挂载磁盘

前言 很多博客写了一些格式化磁盘&#xff0c;分区等等&#xff0c;这和挂载磁盘的概念是混淆的。分区是为了安装系统&#xff0c;我们挂载磁盘肯定是已经安装好Ubuntu 系统了&#xff0c;分区干什么&#xff0c;误人子弟啊。 另外格式化磁盘并不是挂载磁盘必须的选项&#x…

55.网页设计规则#3_图片和插图

使用好的图片 图片类型 不同类型的图像&#xff1a;产品照片、故事性照片、插图、图案&#xff1b;使用图片来支持你网站的信息和故事。所以只使用相关的图片倾向于使用原始图片。如果不可能&#xff0c;请使用原始外观的图片&#xff08;而不是一般的图片&#xff01;&#…

Numpy方法总简单说明作用

NumPy的大部分代码都是用C语言写的&#xff0c;其底层算法在设计时就有着优异的性能&#xff0c;这使得NumPy比纯Python代码高效得多 NumPy&#xff08;Numerical Python&#xff09;是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵&#xff0c;比Python…

JAVAWeb10-Web 开发会话技术-Session-02

1. session 有什么用 ● 思考两个问题—抛砖引玉 不同的用户登录网站后&#xff0c;不管该用户浏览该网站的哪个页面&#xff0c;都可显示登录人的名字&#xff0c;还可以随时去查看自己的购物车中的商品, 是如何实现的?也就是说&#xff0c;一个用户在浏览网站不同页面时&a…

如何高效的学习接口自动化测试?从零开始学习接口自动化测试:选择合适的学习资源和编程语言

目录 引言&#xff1a; 一、学习前的准备 二、选择合适的学习资源 三、实践中学习 四、总结 引言&#xff1a; 在日常的软件开发过程中&#xff0c;接口自动化测试是一个非常重要的环节。接口自动化测试可以帮助我们快速准确地检测出软件中的缺陷&#xff0c;提高软件的质…

更简单的存取Bean方式-@Bean方法注解

1.Bean方法存储 类注解是添加在某个类上的,那么方法注解是添加在某个方法前的 public class UserBeans {Beanpublic User user1(){User user new User();user.setUid(001);user.setUname("zhangsan");user.setAge(19);user.setPassword("123123");retur…

Git/Github操作手册

Git 是目前最流行的版本管理工具&#xff0c;也是程序员的必备技能之一。 这里主要介绍一下git/github远程仓库的使用及相关配置&#xff1a; 一、SSH Keys SSH Keys是什么呢&#xff1f;简单来说相当于一把钥匙&#xff08;在机器中即电脑中进行配置&#xff09;&#xff0…

【Java数据结构】——第九节.向上建堆和向下建堆的区别

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目…

算法训练 | Day41动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…