2017-06-27 21 views
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 
+0

:?私たちはあなたのコードをもう一度見てとることができ、これを知っ

QByteArrayは自動的にJSタイプにマッピングされないことに注意してください([here](https://doc.qt.io/qt-5/qtqml-cppintegration-data.html)参照)。無関係のオブジェクト間で最初の比較が行われるため、失敗する可能性があります。 – peppe

+1

私が知っているように、 'QByteArray'からいくつかのQML/Js型への変換はありません。だから2 QObjectとの比較であり、この場合AAAAAとBBBBBは本当に異なるオブジェクトです。つまり、メモリには2つの異なるオブジェクトがあります。 – folibis

答えて

3

id1id2のJavaScript objectある:

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

出力:javasで

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

criptの場合、タイプobjectの2つの変数は、同じオブジェクトを表す場合に限り、等しくなります。 (C++ではポインターを比較するのと同じように、同じアドレスを指していれば同じです)。 `id1`と` id2`の種類はどのようなものがあり

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 
関連する問題