什么是「;“双层瓷砖”;JavaScript中的(~~)运算符?

什么是「;“双层瓷砖”;JavaScript中的(~~)运算符?,javascript,Javascript,我在一些代码中看到了这一点,但我不知道它是做什么的: var jdn = function(y, m, d) { var tmp = (m <= 2 ? -1 : 0); return ~~((1461 * (y + 4800 + tmp)) / 4) + ~~((367 * (m - 2 - 12 * tmp)) / 12) - ~~((3 * ((y + 4900 + tmp) / 100)) / 4) + d - 2

我在一些代码中看到了这一点,但我不知道它是做什么的:

var jdn = function(y, m, d) {
  var tmp = (m <= 2 ? -1 : 0);
  return ~~((1461 * (y + 4800 + tmp)) / 4) + 
         ~~((367 * (m - 2 - 12 * tmp)) / 12) - 
         ~~((3 * ((y + 4900 + tmp) / 100)) / 4) + 
         d - 2483620;
};
var jdn=函数(y,m,d){

var tmp=(m表示
~
是双精度而非位运算符

它被用作正数的一部分。对于负数,它不会返回与
Math.floor()

有关详细信息,请参阅:


它隐藏了代码的意图

它是两个单波浪形运算符,因此它会执行两次按位补码(按位非)。这些运算会相互抵消,因此唯一剩下的效果是在应用第一个运算符之前进行的转换,即将值转换为整数

有些人使用它作为
Math.floor
的更快的替代方案,但速度差异并没有那么显著,在大多数情况下,它只是一种微观优化。除非你有一段真正需要优化的代码,否则你应该使用描述其功能的代码,而不是使用非操作副作用的代码

更新2011-08: 随着浏览器中JavaScript引擎的优化,操作符和函数的性能会发生变化。在当前的浏览器中,使用
~
而不是
Math.floor
在某些浏览器中会更快一些,在某些浏览器中根本不会更快。如果您确实需要额外的性能,则需要编写不同的代码nt为每个浏览器优化了代码


请参见:

差别非常简单:

长版本

如果您想要更好的可读性,请使用
Math.floor
。但是如果您想要最小化它,请使用tilde
~

互联网上有很多资料说
数学。floor
速度更快,但有时
~
。我不建议你考虑速度,因为在运行代码时不会注意到速度。可能在测试等中,但没有人能在这里看到差异。更快的方法是使用
~
来实现更快的加载输入法

短版


~
更短/占用更少的空间。
Math.floor
提高了可读性。有时tilde更快,有时
Math.floor
更快,但不明显。

@ghoppe:值得注意的是,它与
.floor()不同
因为它实际上只是删除小数点右边的任何内容。这在与负数比较时会有所不同。而且,它总是返回一个数字,并且永远不会给你
NaN
。如果它不能转换为一个数字,你会得到
0
@ghoppe:是的,这两个not操作实际上比单楼层方法。当我在我的计算机上用Firefox测试它时,它们的运行时间约为0.2微秒,而不是0.5微秒。这意味着在它被发现之前,你需要大量使用它。在类似OP中的函数中,它只是一种微优化,只会使代码更难理解。我使用这种技术遇到了一个整数溢出问题数字非常大的hnique(在base-62编码过程中,导航计时API中的数字除以62的结果)。例如,在Firefox、Chrome和IE中,~~(2419354838.709677)==-1875612458,而Math.floor(2419354838.709677)==2419354838.不要使用~~!在IE10中,它比执行其他按位操作慢8倍!最好使用零右移(>>0),它是最快的,看起来更类似于有符号到无符号的转换(>>>0)。类似于Math.trunc(),但不是Math.floor()
=>
-5
~~(-5.5)
=>
-5
。因此,与
Math.floor
@zzzzBov不同,我更新了帖子,澄清了
~
Math.floor()
对于负数.Math.floor(-5.5)不同,将给出-6。Bcos Math.floor将返回小于或等于给定数字的最大整数。Math.floor(-5.00000001)也将给出-6.+1表示“它隐藏了代码的意图”,我浪费了10分钟去了解
~
做了什么。无论如何,我也不得不承认它已经在我的内心深处根深蒂固,它已经诱惑我用
~
来代替
数学。地板
永远在我现在的新代码中。:))注意,像JSPerf这样的微测试(必须)将测试代码运行足够多的时间,以便实时运行时优化(如V8)发挥作用。该测试表明(如果使用非常频繁)
Math.floor()
可以与Chrome上的
~
一样快,但速度并不总是一样的。现在很难说一段代码是否“更快”而不是另一个(考虑不同的浏览器和调用场景)。究竟为什么Chrome 22比Chrome 8慢这么多???@MattSach:只有在同一台计算机上测试,或者如果有足够多的人测试过,这些数字才具有可比性。Chrome有如此多的版本,以至于很少有几个人在每个版本中测试过代码。请记住Math.floor()存在是有原因的。请不要使用~~因为它比Math.floor快2微秒,如果您不知道它可能会导致溢出或其他意外结果。对。这主要是一种风格选择,如在将变量强制转换为布尔值时,在Boolean(foo),(foo?true:false)或!!foo之间进行选择。Math.trunc(),不是Math.floor(),你现在可能已经知道了,但它返回了从千年到给定日期之间的天数。当我在codewars上看到它时,google发现它不支持tildes。谢谢你,Duck Duck Go!简单地说,它将“9”转换为数字9。它一定比Math.floor()快即使使用IE8,如果您在控制台中执行以下操作:typeof ~~'9'//numberno have comments是一回事,但我知道
~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.floor(5.5))
~~(-5.5) // => -5 (NOT the same as Math.floor(-5.5), which would give -6 )