巧妙的编码技巧(我们不需要)
#javascript #重构 #rant #techlead

最近我正在研究一些存储库,我的注意力被此代码吸引了:

const nowInSeconds = ~~(Date.now() / 1000)

在那儿做什么?

tilde

我必须谷歌搜索,当然最终进入了Stack Overflow

tilde是bitwise NOT operator

它的行为:

~N -> -(N+1)

几个示例

~-2 --> 1
~2 --> -3

为什么我在正常情况下需要这样的东西?

是的..我知道您可以编写巧妙的骇客来转换虚假的值,或者确定使用索引时是否找到了某物(〜-1为0,因此是为false)...但是我们甚至在谈论什么?

您可以使用它,将任何浮点数编号转换为整数,而无需执行Math.floor()带来的性能过高。此外,当您关心代码的缩小时,最终会使用2个字符(2个Tildes)而不是12。(from JS bitwise operators in practice)

我们是否应该真正使用~~(a/b)来避免编写Math.floor(a/b)你在开玩笑吗?

老实说,当在普通应用中使用时,以每秒不运行数千次操作的简单方法,它只是隐藏了意图和阻碍可读性
您可能会说这只是一个习惯问题,我也可能会抱怨传播操作员 - 与对象相比。分配:

const mergedOptions = {...optionsDefault, ...options};

const mergedOptions  = Object.assign({}, optionsDefault, options);

您可能是真的。但是对不起,不,这不是同一回事。

这些使用位运算符的微观化是在大多数时间不必要的技巧,可以在代码评论中看起来更智能

tell me again

欢迎来到邪教

只是想象一下这个假设的对话:

哦,你真的不知道双舞吗?来吧!这是一个的位操作(以低调的神秘强调语气发音 - 欢迎来到邪教!),它比Math.floor.floor 。
太快了 我:哦..真的吗?多少快?
最多快30%!!!
我:哇,但是,我们从毫秒中获得了多少钱?
您可以将100000的操作从44毫秒降低到28s! 我:除了在我们的应用程序中会发现20毫秒的事实外,我们没有运行100.000个操作!我们只是在启动时运行数学。离开这儿!

我并不是说它没有用。在某些情况下,它肯定是
但是至于任何优化,我们应该在需要时进行它们,并且它们是有道理的。

Premature optimisation

否则,keep it simple和偏爱可读性。

关于该主题的其他一些有用的资源: