我正在考虑this question关于如何有效地检查值是否为整数。建议使用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
上做起来似乎并不安全。为什么会这样?
答案 0 :(得分:3)
JavaScript中的|
运算符将其参数转换为带符号的32位整数,然后按位或按位执行。 |0
或者为零,它保持值不变,因此它已成为一种JavaScript约定,用于将值转换为32位整数(与桌面处理器上的C中的int
类型相同,是一种快速数据类型处理以及方便的一轮)。
我不确定Number.MAX_SAFE_INTEGER
是否属于标准;我刚刚在我的IE中尝试了它并且它返回undefined,但根据你的描述,它可能会给你最大的数字,可以适合32位或double
(浮点):2 ^ 32- 1,在32位的情况下大约40亿,而浮动的东西大得多。但请记住|
给你一个/ signed / number,所以实际上只有31位可用。另一位用于负数。
要以二进制形式存储负数(从技术上讲,二进制补码),您可以翻转所有位,然后在结果中添加一位。一个存储为0001,因此翻转位并添加一个给出1110 + 1 == 1111(当然,32位但相同概念的值更长),这与无符号时的最大值相同。
答案 1 :(得分:1)
虽然MAX_SAFE_INTEGER
是一个整数...但它是双精度浮点格式的整数,即。 53位长。
同时,按位运算符用于32位整数。
我想你可以看到它的发展方向;)