og

JSON.parse方法可能存在的一种隐患

会有什么问题?

经常有的后端的api会返回一串JSON字符串,需要我们前端来进行JSON.parse来转成JSON来使用。那么会有什么问题呢。 大家可以试一试下面这两条语句,看一看执行的结果

        
  • 1
  • 2
var a = '[{"id":15345566334232451}]' console.log(JSON.parse(a))

可以看到id的值变成了15345566334232452,跟原本的值不一样了

原因?

JavaScript 采用双精度浮点数( IEEE 754 标准)来表示它的 Number 类型。一个数字占用 64 bits 存储空间(这里的每一位都只能存放 0 或 1): 第一位 0 表示正值、1 表示负值;第 2- 12 位表示 2 的指数部分(可正可负);剩下的 52 个 bits 表示尾数部分,它的长度决定了数字的精度。

所以双精度浮点数能表示的最大 16 进制数为 0x7fef_ffff_ffff_ffff,转为十进制约为 1.79 ×10 的 308 次方。能表示的数的范围非常大,但受限于尾数的长度,能“精确”表示的数字并不多,我们来看看这个数到底是多少。 最大安全整数 从以上表示公式我们能看到,当指数部分只取 1 位,尾数部分取满 52 位时,可以精确表示出 JavaScript 里的整数,其 16 进制形式为 0x001f_ffff_ffff_ffff ,即 9007199254740991。

它等于 2 的 53 次方减 1,在 ES6 中,可以通过 Number.MAX_SAFE_INTEGER 引用到这个数值。

        
  • 1
  • 2
  • 3
  • 4
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true Number.MAX_SAFE_INTEGER === 0x001f_ffff_ffff_ffff // true Number.MAX_SAFE_INTEGER === 9007199254740991 // true Number.MAX_SAFE_INTEGER === -Number.MIN_SAFE_INTEGER // true

超过这个最大安全整数的运算,都可能因为发生进位溢出,造成精度丢失。

Article created at   2020/10/22 PM  in category  code ,   89  Views

Related tags: js

Article Address: https://www.hooyim.com/article/6