最近我正在研究一些存储库,我的注意力被此代码吸引了:
const nowInSeconds = ~~(Date.now() / 1000)
在那儿做什么?
我必须谷歌搜索,当然最终进入了Stack Overflow
tilde是bitwise NOT operator
它的行为:
~N -> -(N+1)
几个示例
~-2 --> 1
~2 --> -3
为什么我在正常情况下需要这样的东西?
是的..我知道您可以编写巧妙的骇客来转换虚假的值,或者确定使用索引时是否找到了某物(〜-1为0,因此是为false)...但是我们甚至在谈论什么? p>
您可以使用它,将任何浮点数编号转换为整数,而无需执行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);
您可能是真的。但是对不起,不,这不是同一回事。
这些使用位运算符的微观化是在大多数时间不必要的技巧,可以在代码评论中看起来更智能。
欢迎来到邪教
只是想象一下这个假设的对话:
哦,你真的不知道双舞吗?来吧!这是一个的位操作(以低调的神秘强调语气发音 - 欢迎来到邪教!),它比Math.floor.floor 。
太快了 我:哦..真的吗?多少快?
最多快30%!!!
我:哇,但是,我们从毫秒中获得了多少钱?
您可以将100000的操作从44毫秒降低到28s! 我:除了在我们的应用程序中会发现20毫秒的事实外,我们没有运行100.000个操作!我们只是在启动时运行数学。离开这儿!
我并不是说它没有用。在某些情况下,它肯定是 。
但是至于任何优化,我们应该在需要时进行它们,并且它们是有道理的。
否则,keep it simple和偏爱可读性。
关于该主题的其他一些有用的资源: