为什么比较结果不一样?

3
这是一个关于QML的函数。不清楚为什么比较结果会有所不同?
...
function someFunction() {
        var id1 = AAAAA.objectId // it is QByteArray property of C++ object
        var id2 = BBBBB.objectId // it is QByteArray property of C++ object
        var isEqual = id1 === id2
        var isEqualToString = id1.toString() === id2.toString()

        console.log("=============================")
        console.log("id1: ", id1)
        console.log("id2: ", id2)
        console.log("isEqual: ", isEqual)
        console.log("id1.toString(): ", id1.toString())
        console.log("id2.toString(): ", id2.toString())
        console.log("isEqualToString: ", isEqualToString)
}
...

控制台结果:

id1:  2607d35d-d9d0-49af-b944-3fc60993890a
id2:  2607d35d-d9d0-49af-b944-3fc60993890a
isEqual:  false
id1.toString():  2607d35d-d9d0-49af-b944-3fc60993890a
id2.toString():  2607d35d-d9d0-49af-b944-3fc60993890a
isEqualToString:  true

id1id2的类型是什么?请注意,QByteArray不会自动映射到JS类型(请参见此处)。可能第一个比较发生在不相关的对象之间,因此失败。 - peppe
1
据我所知,QByteArray 无法转换为某些 QML/Js 类型。因此,这将是两个 QObject 之间的比较,在这种情况下,AAAAABBBBB 是真正不同的对象。我的意思是,内存中有两个不同的对象。 - folibis
1个回答

3

id1id2是JavaScript的object对象:

console.log("typeof id1: ", typeof id1)
console.log("typeof id2: ", typeof id2)

输出:

qml: typeof id1:  object
qml: typeof id2:  object

在JavaScript中,只有当两个类型为object的变量表示相同的对象时它们才相等。(在C++中,这就像比较指针,只有它们指向相同的地址时它们才相等)。
了解了这一点,我们可以再次查看您的代码:
var id1 = AAAAA.objectId // Creates an object and reference it by id1
var id2 = BBBBB.objectId // Creates of another object and reference it by id2
var isEqual = id1 === id2 // false because id1 and id2 reference 2 different objects, regardless of their content
var isEqualToString = id1.toString() === id2.toString() // true because you compare strings and strings are compared using their content

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接