驳《我不是很懂 Node.js 社区的 DRY 文化》

Posted justjavac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了驳《我不是很懂 Node.js 社区的 DRY 文化》相关的知识,希望对你有一定的参考价值。

今天在群里有人讨论方老师的文章《我不是很懂 Node.js 社区的 DRY 文化》,我也看了一遍,槽点太多,不知道如何下笔。

方老师分析了几个依赖最多的 npm 包,每个都只有不到百行代码。

比如 is-odd,每周下载 300 万次,但是只有核心 5 行代码。而且依赖了每周下载 1000 万次的 is-number 库。

得出了一个结论:

  1. 原来有这么多 JS 程序员不会判断奇数

  2. 只要 markdown 写得漂亮,就能迷倒 JS 程序员

  3. 1+'1' 的问题一直在困扰 JS 程序员,我要不要写一个 add() 库解决这个问题呢

首先第一条:

原来有这么多 JS 程序员不会判断奇数。

其实不仅仅是 JS 程序员,大部分程序员都不会准确的判断奇数。

你写

 
   
   
 
  1. const isOdd = x => x % 2 === 1;

这是小学的知识,除以 2,如果除不尽(有余数)那么就是奇数。正因为知识点很简单,所以给人一种随便一个程序员都会判断的错觉。

现在我们假设用户传入的参数一定是数字。

即便如此,这个函数依然不能正确判断奇数。因为 -3%2 的结果是 -1

有人说那就这么写:

 
   
   
 
  1. const isOdd = x => x % 2 !== 0;

随便一个小数就被判断为奇数了。更不用说浮点数中的妖怪 NaN 和 Infinity 了。

那么是不是对 NaN 和 Infinity 直接返回 falst,然后把 -1 的判断也加上去就行了:

 
   
   
 
  1. const isOdd = x => x % 2 === 1 || x % 2 === -1;

也是图样

 
   
   
 
  1. 9007199254740991 % 2 === 1

  2. 9007199254740992 % 2 === 0

  3. 9007199254740993 % 2 === 0

  4. 9007199254740994 % 2 === 0

  5. 9007199254740995 % 2 === 0

  6. // 后面的都是 0

为什么从 9007199254740991 开始呢?因为这个值是 Number.MAX_SAFE_INTEGER,是 2**53-1

那回过头来看看 is-odd 库是怎么实现的呢?

 
   
   
 
  1. !!(~~i & 1)

~~i 用于把字符串转换为整数,和 1 进行按位与运算判断最后一位是 1 还是 0

很遗憾,也有问题。

以上是关于驳《我不是很懂 Node.js 社区的 DRY 文化》的主要内容,如果未能解决你的问题,请参考以下文章

React Hooks 使用误区,驳官方文档

《Node.js设计模式(第2版)》试读 & 送书活动

技术2015年需要了解的前端框架和语言

原作者出局,Faker.js已被社区控制

为什么我从Python转战到Node.js

React Hooks 使用误区,驳官方文档