为什么不't|"操作员为大值工作
Why doesn't the "|" operator work for large values?
我正在研究如何有效地检查值是否为整数的问题。一个答案建议使用n === (n|0)
通过|
运算符进行一些快速舍入。一时兴起,我决定用Number.MAX_VALUE
测试它。尽管这应该是一个整数(我认为是?),但测试结果是错误的。
Number.MAX_SAFE_INTEGER
的结果也是错误的,所以我决定测试其他一些大数字,并发现以下内容:
Number.MAX_VALUE | 0 --> 0
Number.MAX_SAFE_INTEGER | 0 --> -1
Number.MAX_SAFE_INTEGER/2 | 0 --> -1
Number.MAX_SAFE_INTEGER/8 | 0 --> -1
1234567890 | 0 --> 1234567890
我真的不确定|
操作符在内部做什么,但在MAX_SAFE_INTEGER
上做似乎不安全。为什么会这样?
JavaScript中的|
运算符将其参数转换为有符号的32位整数,然后对其执行逐位或。|0
或为零,这使值保持不变,因此这已成为将值转换为32位整数的JavaScript惯例(与桌面处理器上C中的int
类型相同,是一种快速处理的数据类型,也是一种方便的舍入)。
我不确定Number.MAX_SAFE_INTEGER
是否是标准的一部分;我刚在IE中尝试过,结果没有定义,但根据你的描述,它可能给了你32位或double
(浮点)中可以容纳的最大数字:2^32-1,在32位的情况下大约是40亿,浮点值要大得多。但请记住,|
会给你一个/签名/数字,所以实际上只有31位可用。另一位用于负数。
要将负数存储在二进制中(从技术上讲,是二进制补码),需要翻转所有位,然后在结果上加一。一个被存储为0001,所以翻转比特并加一得到1110+1==1111(当然,32比特的值更长,但概念相同),这与无符号时的最大值相同。
虽然MAX_SAFE_INTEGER
确实是一个整数。。。它是一个双精度浮点格式的整数,即53位长。
同时,逐位运算符处理32位整数。
我想你可以看到这件事的进展;)
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- $in操作员钛 SDK 无法 #appcelerator 工作
- 操作员不工作!=
- &操作员未在指令的隔离范围内工作
- Javascript>操作员未在Extension中工作
- Javascript:"!="操作员不'工作不正常
- 不等于<>操作员不工作
- 操作员”>"不会'工作不正常
- 这“如果”是怎么回事?无需操作员工作
- 为什么不't|"操作员为大值工作