驳《我不是很懂 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

很遗憾,也有问题。

猜你喜欢

转载自blog.csdn.net/vca54lu0kv27w8zzbd/article/details/80015608
dry
今日推荐