可能重复:
What is the “double tilde” (~~) operator in JavaScript?
D3教程提供了一个产生随机序列的函数:
var t = 1297110663, // start time (seconds since epoch)
v = 70, // start value (subscribers)
data = d3.range(33).map(next); // starting dataset
function next() {
return {
time: ++t,
value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))
};
}
注意:〜(tilda tilda):
value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5)))
从javascript终端玩游戏,我看到:
~~1
1
~~-1
-1
~~-1.3
-1
parseInt(5)
5
parseInt(-5)
-5
parseInt(-5.3)
-5
parseInt(5.3)
5
既然~~和parseInt似乎是等价的,那么使用parseInt的理由是什么?
答案 0 :(得分:29)
它们并不等同。
parseInt()
将字符串转换为数字,读取并忽略第一个非整数字符,还可能执行基本转换(例如将字符串解释为八进制或十六进制)。
console.log(
parseInt(011) +'\n'+ // 9
parseInt('011') +'\n'+ // 11
parseInt('42 cats') +'\n'+ // 42
parseInt('0xcafebabe') +'\n'+ // 3405691582
parseInt('deadbeef',16) +'\n'+ // 3735928559
parseInt('deadbeef',36) +'\n' // 1049836114599
);
var x = ~~y;
是一个'技巧' - 类似于var x = y << 0;
- (ab)使用unary bitwise NOT operator强制结果在有符号的32位整数范围内,丢弃任何非整数部分。
console.log(
parseInt(011) +'\n'+// 9
parseInt('011') +'\n'+// 11
parseInt('42 cats') +'\n'+// 42
parseInt('0xcafebabe') +'\n'+// 3405691582
parseInt('deadbeef',16) +'\n'+// 3735928559
parseInt('deadbeef',36) +'\n' // 1049836114599
);
经常使用~~x
,因为:
如cafebabe
测试中所见,数字高于2 31 - 1(2,147,483,647)或低于 - 2 31
由于有符号的32位整数的限制,(-2,147,483,648)将“环绕”。
答案 1 :(得分:8)
parseInt
不限于签名的32位数字。
// Top range for a bitwise operator provides a valid result
~~((Math.pow(2,32)/2)-1); // 2147483647
// Beyond the top range provides undesired result
~~(Math.pow(2,32)/2); // -2147483648
此外,使用parseInt
,您可以指定基数。
答案 2 :(得分:2)
~~"red" === 0
isNaN(parseInt("red"))
parseInt也可以处理超过32位的数字
答案 3 :(得分:1)
简单:它更易读,更方便。
按位NOT运算符是为某些其他用途而设计的,但可能会被误用于截断浮点值。在您的示例中,Math.floor
也是可能的。
此外,在许多情况下,它们的行为并不相似。 parseInt
不限于32位,它可以解析以不同位置表示法表示的数字,并且还可以使用NaN
处理非数字值。