我今天在查看在线游戏物理库时遇到了 ~~ 运算符。我知道单个 ~ 是按位 NOT,这会使 ~~ 成为 NOT 的 NOT,这会返回相同的值,不是吗?
原文由 Shane Tomlinson 发布,翻译遵循 CC BY-SA 4.0 许可协议
我今天在查看在线游戏物理库时遇到了 ~~ 运算符。我知道单个 ~ 是按位 NOT,这会使 ~~ 成为 NOT 的 NOT,这会返回相同的值,不是吗?
原文由 Shane Tomlinson 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一个 ~ 运算符将操作数强制为整数(可能在将值强制为字符串或布尔值之后),然后反转最低 31 位。官方的 ECMAScript 数字都是浮点数,但有些数字在 SpiderMonkey 引擎中实现为 31 位整数。
您可以使用它将 1 元素数组转换为整数。浮点数根据 C 规则转换,即。小数部分的截断。
第二个 ~ 运算符然后将位反转,因此您知道您将得到一个整数。这与在条件语句中将值强制转换为布尔值不同,因为空对象 {} 的计算结果为 true,而 ~~{} 的计算结果为 false。
js>~~"yes"
0
js>~~3
3
js>~~"yes"
0
js>~~false
0
js>~~""
0
js>~~true
1
js>~~"3"
3
js>~~{}
0
js>~~{a:2}
0
js>~~[2]
2
js>~~[2,3]
0
js>~~{toString: function() {return 4}}
4
js>~~NaN
0
js>~~[4.5]
4
js>~~5.6
5
js>~~-5.6
-5
原文由 Shanti 发布,翻译遵循 CC BY-SA 2.5 许可协议
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
它会删除小数点后的所有内容,因为按位运算符会将其操作数隐式转换为带符号的 32 位整数。无论操作数是(浮点)数字还是字符串,这都有效,结果是数字。
换句话说,它产生:
仅当 x 在 -(2 31 ) 和 2 31 - 1 之间时。否则,将发生溢出并且数字将“回绕”。
这可能被认为对将函数的字符串参数转换为数字很有用,但是由于溢出的可能性以及与非整数一起使用是不正确的,我不会以这种方式使用它,除了“代码高尔夫”( 即 以牺牲可读性和健壮性为代价,毫无意义地从程序的源代码中删除字节)。我会使用
+x
或Number(x)
代替。这是 NOT 中的 NOT
例如,数字 -43.2 是:
作为带符号(二进制补码)的 32 位二进制数。 (JavaScript 忽略小数点后的内容。)反转位给出:
再次反转给出:
这与
Math.floor(-43.2)
的不同之处在于负数向零四舍五入,而不是远离它。 (等于 -44 的 floor 函数总是向下舍入到下一个较小的整数,无论该数字是正数还是负数。)