使用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.floorMath.ceilMath.round等等。

隐私转化有哪些?

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

总结

1,单独使用JSON.parse会有隐私转化。如果结合stringify不会有隐私转换
2,在开发时,注意隐式转换
posted @   南风晚来晚相识  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2020-03-31 ElementUI实现表格(table) 行上下移动的效果
点击右上角即可分享
微信分享提示