这是Qt(LTS 5.6.2)QML JavaScript实现中的数字比较的疯狂字符串:
console.log("240000000000" == "3776798720");
console.log("240000000000" === "3776798720");
console.log("240000000000" === "3776798721");
输出是:
true
true
false
它看起来像字符串解释为(u)int32和高字节丢失:
240000000000 == 0x37E11D6000
3776798720 == 0xE11D6000
此错误也会对对象产生影响:
var g = {};
var h = "240000000000";
g[h] = h + "BUG";
console.log(JSON.stringify(g, null, 2));
console.log(g["3776798720"], g["240000000000"]);
输出:
qml: {
"3776798720": "240000000000BUG"
}
qml: 240000000000BUG 240000000000BUG
如您所见,钥匙已损坏。该值可以通过两个不同的字符串获得。
有没有选项可以在不修补Qt的情况下解决这个问题?或者至少在Qt中可能出现问题的大致位置可以改善自己?
P.S。此处还有我的同事报告的QTBUG-56830。
答案 0 :(得分:4)
答案 1 :(得分:1)
这里似乎有效的解决方法
console.log(String("3776798720").localeCompare("240000000000") === 0)
console.log(String("3776798721").localeCompare("240000000000") === 0)
console.log(String("240000000000").localeCompare("240000000000") === 0)
输出:
qml: false
qml: false
qml: true
或者如果你有字符串变量
var str = "3776798720"
console.log(str.localeCompare("240000000000") === 0)