使用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,在开发时,注意隐式转换
遇见问题,这是你成长的机会,如果你能够解决,这就是收获。
作者:晚来南风晚相识
出处:https://www.cnblogs.com/IwishIcould/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/IwishIcould/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
支付宝
微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。