我已将我的项目从Qt 5.6.2升级到Qt 5.9.4当我尝试使用新的Qt版本第一次构建时,在mac上有几个问题,但没什么大不了的。我已合并这些更改并切换到Windows,以便尝试在那里构建我的项目。不幸的是,由于一些JS问题而没有成功。
看起来QML的JS引擎在Mac和Windows上的工作方式与Qt 5.9.4不同(也许是早期版本,没有尝试过),然后它在Qt 5.6.2上完成。
这是一个小例子,它说明了我的问题的根本原因:
QtQuick.Item {
QtQuick.Component.onCompleted: {
function underscoreFind(obj, predicate, context) {
var findIndex = function(obj, predicate, context) {
for (var i = 0; i < obj.length; i++) {
if (predicate(obj[i])) {
return i;
}
}
return -1;
}
var key = findIndex(obj, predicate, context)
console.log("type of KEY " + (typeof key))
console.log("KEY IS " + key)
console.log("OBJ KEY IS " + obj[key])
var keycheck = (key !== void 0 && key !== -1)
if (key !== void 0 && key !== -1) {
console.log("#1 EVALUATING AS TRUE")
} else{
console.log("#1 EVALUATING AS FALSE")
}
if (keycheck) {
console.log("#2 EVALUATING AS TRUE")
} else{
console.log("#2 EVALUATING AS FALSE")
}
}
underscoreFind([,,5], function(obj){return obj !== undefined })
}
}
Mac上的输出:
qml: type of KEY number
qml: KEY IS 2
qml: OBJ KEY IS 5
qml: #1 EVALUATING AS TRUE
qml: #2 EVALUATING AS TRUE
Windows上的输出:
qml: type of KEY number
qml: KEY IS 2
qml: OBJ KEY IS 5
qml: #1 EVALUATING AS FALSE
qml: #2 EVALUATING AS TRUE
之前有人遇到过这个问题吗?这到底发生了什么?在此之后我怎么能相信QML的JS引擎?
原始问题出现在我的原始项目库.js文件中。我在我的QML项目中使用underscore.js作为.js库,它在Qt 5.6.2上运行得很好,在Mac上与Qt 5.9.4一起工作正常,但在Windows上_.find(...)
函数失败,总是返回undefined
。只要我将函数从_.find
重命名为_.underscoreFind
之类的其他内容并更改void 0
,请检查undefined
是否有效。
这是_.find
的原始实现:
_.find = _.detect = function(obj, predicate, context) {
var key;
if (isArrayLike(obj)) {
key = _.findIndex(obj, predicate, context);
} else {
key = _.findKey(obj, predicate, context);
}
if (key !== void 0 && key !== -1) return obj[key];
};
这是我修改过的函数,它解决了Windows上的问题:
_.underscoreFind = function(obj, predicate, context) {
var key;
if (isArrayLike(obj)) {
key = _.findIndex(obj, predicate, context);
} else {
key = _.findKey(obj, predicate, context);
}
if (key !== undefined && key !== -1) return obj[key];
};
修改1:
这个问题实际上是从Qt 5.6.3引入的,又名5.6.2具有预期的行为,但5.6.3已经在上述小测试示例中失败了。