Javascript Qt和x27之间的差异;Mac和Windows上的s QML JS引擎

Javascript Qt和x27之间的差异;Mac和Windows上的s QML JS引擎,javascript,qt,qml,qt5.6,qt5.9,Javascript,Qt,Qml,Qt5.6,Qt5.9,我已经将我的项目从Qt5.6.2升级到Qt5.9.4,当我第一次尝试使用新的Qt版本构建时,mac上出现了一些问题,但没有什么大问题。我合并了这些更改并切换到Windows,以便尝试在那里构建我的项目。不幸的是,由于一些JS问题,没有成功 看起来QML的JS引擎在Mac和Windows上的工作方式与Qt5.9.4(也可能是早期版本,没有尝试过)和Qt5.6.2有所不同 下面是一个小示例,它演示了我的问题的根本原因: QtQuick.Item { QtQuick.Compo

我已经将我的项目从Qt5.6.2升级到Qt5.9.4,当我第一次尝试使用新的Qt版本构建时,mac上出现了一些问题,但没有什么大问题。我合并了这些更改并切换到Windows,以便尝试在那里构建我的项目。不幸的是,由于一些JS问题,没有成功

看起来QML的JS引擎在Mac和Windows上的工作方式与Qt5.9.4(也可能是早期版本,没有尝试过)和Qt5.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 })
       }
    }
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
_.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];
  };
以前有人提到过这个问题吗?这里到底发生了什么?在此之后,我如何信任QML的JS引擎

最初的问题出现在library.js文件中的我的原始项目中。我在QML项目中使用下划线.js作为.js库,它在Mac上的Qt 5.6.2和Qt 5.9.4上都可以正常工作,但在Windows上的
\u.find(…)
函数失败,该函数始终返回
未定义的
。一旦我将函数从
.find
重命名为类似
.下划线find
的其他名称,并更改
void 0
检查以对照
未定义的
检查它,它就会工作

这是
的原始实现。查找

_.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上的问题:

qml: type of KEY number
qml: KEY IS 2
qml: OBJ KEY IS 5
qml: #1 EVALUATING AS  FALSE
qml: #2 EVALUATING AS TRUE
_.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:


这个问题实际上是从Qt5.6.3引入的,aka 5.6.2具有预期的行为,但是5.6.3在上面的小测试示例中已经失败了

提交错误报告。