关于javascript中的~

《javascript权威指南》里是这么说的:
位运算符"~"是一元运算符,位于一个整型参数之前,它将操作数的所有位取反。根据javascript中所带符号的整数的表示方法,对一个值使用"~",运算符相当于改变它的符号并减1。例如~0x0F = 0xFFFFFFF0或-16。

这是两个~符号:

~~5===5;      //true
~~4.5===4.5   //false
~~-5===-5     //true

是不是可以推断出~~n===n,n为未知数字


当为一个~符号:

~5===-6;      //true
~4.5===-4.5   //false
~4.5===-3     //true
~-5===-5      //false
~-5===4       //true
~-4.5===3       //true

是不是可以推断出~n===-parseInt(n)-1,n为未知数字

阅读 4.5k
3 个回答

在 JS 里面,所有位操作符里面都先执行 ToInt32,但是parseInt 并不会执行这一步。

function toInt32(n) { return n>>0;}
function toUint32(v) { return v>>>0; }

var maxInt32 = (toUint32(-1)+1)/2-1;

var num = maxInt32 + 53.5;

console.log(num);  // 2147483700.5
console.log(toInt32(num)); // -2147483596
console.log(~num); // 2147483595
console.log(-parseInt(num)-1); //-2147483701

ES5.1 对~ 的描述(parseInt就不贴了太长,自己可以在下面的链接里找):

The production UnaryExpression : ~ UnaryExpression is evaluated as follows:

  1. Let expr be the result of evaluating UnaryExpression.

  2. Let oldValue be ToInt32(GetValue(expr)).

  3. Return the result of applying bitwise complement to oldValue. The result is a signed 32-bit integer.

http://www.ecma-international...

其实并不需要推断……
你自己都写明了:位运算符"~"是一元运算符,位于一个整型参数之前

js的所有数字其实都是按照64位浮点数储存的,当需要进行位运算时,会将其临时转换为整数,所以你会认为是parseInt(n)

另,根据有符号整数负数补码的定义可知,-x==~x+1

就是这样~

~ 是按位非,在 JS 中常常连用,以简化 parseInt,就像这样 ~~something

~ 在运算的时候会把操作数转换为整型来运算,所以 ~4.5 实际是 ~4

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题