使用JSON.parse造成前后数据不一致(意外的隐私转化,造成精度丢失)

ES6 数字类型范围在-2^53 + 1 与 2^53 - 1

在ES6(ECMAScript 2015)之前,
所有的数字都被表示为双精度64位浮点数(遵循IEEE 754标准)
也就是说:js能够安全的表示整数范围是从{-2^53 + 1, 2^53 - 1}
如果超出这个范围会出现精度丢失
我们可以简单地认为超过16位的数值就是大数值。
-9007199254740991 (-2^53 + 1)
9007199254740991 (2^53 - 1)

超出这个范围会出现精度丢失

let str= "189818686744008038403"
// 输出的值是:189818686744008030000 【精度已经丢失了】
console.log(Number(str)); 

JSON.parse()意外的隐私转化-将字符串转化为了数字

let obj1 = {
  key: '189818686744008038403',
  name:'张三'
}
// 会造成精度丢失
let obj2 = JSON.parse(obj1.key)
// 输出的是:obj2 189818686744008030000 它是一个数字类型的
console.log('obj2', obj2)

JSON.parse()结合JSON.stringify就不会造成精度丢失

let obj1 = {
  key: '189818686744008038403',
  name:'张三'
}
// 不会造成精度丢失;正常输出
let obj2 = JSON.parse(JSON.stringify(obj1.key))
// 输出的是:obj2 189818686744008038403
console.log('obj2', obj2)

显式转换有哪些?

比如 Number()、parseInt()、parseFloat()、Math.floor、Math.ceil、Math.round等等。

隐私转化有哪些?

-, *, /, %, JSON.parse, switch 语句, sort的回调函数等等。

总结

1,单独使用JSON.parse会有隐私转化。如果结合stringify不会有隐私转换
2,在开发时,注意隐式转换
posted @ 2024-03-31 20:56  南风晚来晚相识  阅读(69)  评论(0编辑  收藏  举报