为什么javascript中按位或未定义的on会产生一个很大的负数,并被用作非零结果?

为什么javascript中按位或未定义的on会产生一个很大的负数,并被用作非零结果?,javascript,numbers,integer,bit-manipulation,nan,Javascript,Numbers,Integer,Bit Manipulation,Nan,按位OR(单管|)为未定义的属性(一旦变为NaN)生成奇怪的输出。正如所暗示的,ToInt32在未定义的情况下内部调用,生成NaN。但是,如果NaN | smallNumber产生一个小数字,为什么NaN | largeNumber会产生一个大负数 在操作中,(请参阅控制台输出): 代码如下: var foo = {}; foo.date = 1412146800000; //some epoch timestamp as an integer console.log( 'result: '

按位OR(单管|)为未定义的属性(一旦变为NaN)生成奇怪的输出。正如所暗示的,ToInt32在未定义的情况下内部调用,生成NaN。但是,如果NaN | smallNumber产生一个小数字,为什么NaN | largeNumber会产生一个大负数

在操作中,(请参阅控制台输出):

代码如下:

var foo = {};
foo.date = 1412146800000; //some epoch timestamp as an integer
console.log( 'result: ' + foo.notDefinedThingy | foo.date ); // outputs -897440384 
console.log( 'to int 32: ' + parseInt(undefined) ); //outputs NaN
console.log( 'to int 32: ' + parseInt(undefined) | foo.date ); //outputs -897440384
console.log( 'Small number ' + parseInt(undefined) | 5 ); // outputs 5

由于操作数被转换为32位有符号整数,并且右操作数已超出正整数的边界,因此它会执行正常操作,即将32位有符号整数的数字转换为可能的最小值,然后继续计数。
NaN
被视为
0

var highest=Math.pow(2,32)/2-1;//2147483647
var highest_plus_one=highest+1;//2147483648
var highest_plus_two=highest+2;//2147483649
var highest_plus_three=highest+3;//2147483650
var all=[
0 |最高,//将是预期的数字
0 |最高的_加上_1,//将是范围内的最低数字
0 |最高的_加上_2,//将是最低的数字加上1
0 |最高的加上三//将是最低的数字加上2
];
document.querySelector(“pre”).textContent=all.map(函数(n,i){
返回“最高+”+i+“=”+n;
}).加入(“\n”)

这会产生相同的结果:

(1412146800000).toString(2); //"10100100011001010100000100010010110000000"
"10100100011001010100000100010010110000000".substr("10100100011001010100000100010010110000000".length-32); //"11001010100000100010010110000000"
parseInt("11001010100000100010010110000000",2); //3397526912
a[0]=3397526912;
console.log(a[0]); //-897440384
在这里,我只是在Int32中强制使用相同的值。 该值需要41位,因此会被截断,只使用最低有效位32位,其中最高有效位为“1”,因此表示负数


因为你已经超过了一个正的32位有符号整数的边界,所以它做了一件正常的事情,那就是把一个32位有符号整数的数字降到最低,然后继续计数。
NaN
仅被视为
0
.worksforme。这应该是一个答案,这样我就可以给它打分了。
(1412146800000).toString(2); //"10100100011001010100000100010010110000000"
"10100100011001010100000100010010110000000".substr("10100100011001010100000100010010110000000".length-32); //"11001010100000100010010110000000"
parseInt("11001010100000100010010110000000",2); //3397526912
a[0]=3397526912;
console.log(a[0]); //-897440384