一段诡异的执行结果

下面的是看了一些前辈写的代码后,自己改了一下,发现出来的结果难以想像,望那位高手能解解一下。
var arr=[];
var Test=function(){
var num_arr=["1","2","3","4"];
for(var i=0;i<num_arr.length;i++){
var o={
id:i
,fun:~ function(){ return i ;}()
};
arr.push(o);
}
return arr;
}();

for(var j=0;j<arr.length;j++)
{
alert("result="+arr[j].fun);

}

要下班放假了,给分吧

你不但问了个问题,还顺带出了个谜语。
给点提示

[code="java"]var arr=[]; //定义一个数组
var Test=function(){ //定义一个变量Test,它的值是等号后边函数的执行结果
var num_arr=["1","2","3","4"]; //一个数组
for(var i=0;i<num_arr.length;i++){
var o={ //定义一个对象o
id:i
,fun:~ function(){ return i ;}() //~这个操作符不知道干嘛的,这部操作,把函数的操作结果付给fun属性。
};
arr.push(o); //将o放入arr数组
}
return arr; //返回arr,Test值为arr数组
}();

for(var j=0;j<arr.length;j++)
{
alert("result="+arr[j].fun); //弹出属性

}[/code]

使用ie8 debug看下就清楚了,楼主要自己多动手,不要偷懒噢 :D

哪里不一样 8)

请问下~这个符号在js中是干嘛用的,如果去掉这个符号,结果是0,1,2,3

w3school上面也没说明这个“~”的用法 :?

~ 为取反,

操作符 用法 描述

按位与 a & b 如果两个操作数对应位都是 1 的话则在该位返回 1。

按位或 a | b 如果两个操作数对应位都是 0 的话则在该位返回 0。

按位异或 a ^ b 如果两个操作数对应位只有一个 1 的话则在该位返回 1。

求反 ~ a 反转操作数的每一位。

左移 a << b 将 a 的二进制形式左移 b 位。右面的空位补零。

算术右移 a >> b 将 a 的二进制形式右移 b 位。忽略被移出的位。

逻辑右移 a >>> b 将 a 的二进制形式右移 b 位。忽略被移出的位,左侧补入 0。

~按位取反

给分吧 :D

int类型

如: 5取反为-6
计算机是按照补码的方式输出(打印):

int 是4个字节

5 : 00000000 00000000 00000000 00000101

5取反: 11111111 11111111 11111111 11111010

取反后再换成补码输出:

(10000000 00000000 00000000 00000110)B = -6