uni-app 数字经过JSON.stringify 和JSON.parse转换之后类型异常

发布于 1周前 作者 caililin 来自 Uni-App

uni-app 数字经过JSON.stringify 和JSON.parse转换之后类型异常

示例代码:

type P = {
x : number
y : number
}
const s = JSON.parse<P[]>(JSON.stringify([{ x: 0, y: 0 }])) as P[]
s[0].x += 0;
const clearList = s.map((v : P, _, _a) : number => v.x)
console.log( clearList.includes(0));  

操作步骤:

如代码所示

预期结果:

打印 true

实际结果:

打印 false

bug描述:

通过JSON.parse 和JSON.stringify 双重转换后 数字类型出现异常。


5 回复

这个问题在于 include 函数在web 平台不区分 0.0和0 的情况。 目前UTS是区分的。
HBuiler X 4.0之后版本bug已修复


clearList这个变量哪来的 发完整的代码片段看下

不好意思,我修改了一下代码

回复 h***@geely.com: 确实只要JSON转了之后 在+= 就会变成0.0 导致includes查询不到 还是邀请官方人员看看吧

uni-app 中,当你使用 JSON.stringifyJSON.parse 对数字进行序列化和反序列化时,数字的类型通常不会发生变化。然而,如果你遇到类型异常的情况,可能是由于以下原因:

1. 数字被转换为字符串

在某些情况下,数字可能会被错误地转换为字符串。例如,如果你在序列化之前将数字与字符串拼接,或者在反序列化后进行了某些操作,可能会导致数字被转换为字符串。

示例:

let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str); // 123

console.log(typeof parsed); // "number"

如果你在序列化之前将数字与字符串拼接,可能会导致问题:

let num = 123;
let str = JSON.stringify(num + ""); // "123"
let parsed = JSON.parse(str); // 123

console.log(typeof parsed); // "number"

在这个例子中,num + "" 将数字转换为字符串,但 JSON.parse 仍然会将其解析为数字。

2. 数字被转换为科学计数法

对于非常大的数字或非常小的数字,JSON.stringify 可能会将其转换为科学计数法。这通常不会导致类型异常,但在某些情况下可能会影响数据的精度。

示例:

let num = 1e21;
let str = JSON.stringify(num); // "1e+21"
let parsed = JSON.parse(str); // 1e+21

console.log(typeof parsed); // "number"

3. 数字被转换为其他类型

如果你在序列化或反序列化过程中进行了某些操作,可能会导致数字被转换为其他类型。例如,如果你在反序列化后对数据进行了某些操作,可能会导致类型异常。

示例:

let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str); // 123

parsed = parsed.toString(); // "123"

console.log(typeof parsed); // "string"

4. 使用 JSON.parsereviver 函数

如果你在 JSON.parse 中使用了 reviver 函数,可能会在解析过程中改变数据的类型。

示例:

let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str, (key, value) => {
    if (typeof value === 'number') {
        return value.toString(); // 将数字转换为字符串
    }
    return value;
});

console.log(typeof parsed); // "string"
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!