驳《我不是很懂 Node.js 社区的 DRY 文化》
Posted justjavac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了驳《我不是很懂 Node.js 社区的 DRY 文化》相关的知识,希望对你有一定的参考价值。
今天在群里有人讨论方老师的文章《我不是很懂 Node.js 社区的 DRY 文化》,我也看了一遍,槽点太多,不知道如何下笔。
方老师分析了几个依赖最多的 npm 包,每个都只有不到百行代码。
比如 is-odd,每周下载 300 万次,但是只有核心 5 行代码。而且依赖了每周下载 1000 万次的 is-number 库。
得出了一个结论:
原来有这么多 JS 程序员不会判断奇数
只要 markdown 写得漂亮,就能迷倒 JS 程序员
1+'1'
的问题一直在困扰 JS 程序员,我要不要写一个add()
库解决这个问题呢
首先第一条:
原来有这么多 JS 程序员不会判断奇数。
其实不仅仅是 JS 程序员,大部分程序员都不会准确的判断奇数。
你写
const isOdd = x => x % 2 === 1;
这是小学的知识,除以 2,如果除不尽(有余数)那么就是奇数。正因为知识点很简单,所以给人一种随便一个程序员都会判断的错觉。
现在我们假设用户传入的参数一定是数字。
即便如此,这个函数依然不能正确判断奇数。因为 -3%2
的结果是 -1
。
有人说那就这么写:
const isOdd = x => x % 2 !== 0;
随便一个小数就被判断为奇数了。更不用说浮点数中的妖怪 NaN
和 Infinity
了。
那么是不是对 NaN
和 Infinity
直接返回 falst,然后把 -1
的判断也加上去就行了:
const isOdd = x => x % 2 === 1 || x % 2 === -1;
也是图样
9007199254740991 % 2 === 1
9007199254740992 % 2 === 0
9007199254740993 % 2 === 0
9007199254740994 % 2 === 0
9007199254740995 % 2 === 0
// 后面的都是 0
为什么从 9007199254740991
开始呢?因为这个值是 Number.MAX_SAFE_INTEGER
,是 2**53-1
。
那回过头来看看 is-odd 库是怎么实现的呢?
!!(~~i & 1)
~~i
用于把字符串转换为整数,和 1
进行按位与运算判断最后一位是 1
还是 0
。
很遗憾,也有问题。
以上是关于驳《我不是很懂 Node.js 社区的 DRY 文化》的主要内容,如果未能解决你的问题,请参考以下文章