在QML JS实现中,我可以这样写:
property var dict1: ({})
property var dict2: { 'a':1, 'b':2, 'c':3 }
// property var dict3: { [0,0]:1, [1,4]:5, [2,4]:3 } // can't do this!
// but can do this.
Component.onCompleted: {
dict1[[0,0]] = 1
dict1[[1,4]] = 5
dict1[[2,4]] = 3
}
所以最后一部分使用JS-Arrays作为dict中的键。但是,第3行(dict3)中的声明是不可能的。我不明白,如果通过其他方式可以达到预期的结果,为什么一个符号不可能。
所以我的问题是:如果不需要dict
或类似的黑客,如何实例化Component.onCompleted
?
如果没有办法做到这一点,那么我们将不胜感激。
答案 0 :(得分:2)
JS对象键始终是字符串。没有像array-as-key或object-as-key那样的东西。
dict1[[0,0]] = 1
严格等同于至dict1['0,0'] = 1
。
底线是属性赋值,属性访问自动将键转换为字符串。
尝试以下方法:
dict1[dict2] = 42
console.log(JSON.stringify(dict1))
输出: {“0,0”:1,“1,4”:5,“2,4”:3,“[object Object]”:42}
表达式dict2
被强制转换为其字符串表示形式并用作键。然后,您可以使用以下任何
dict1["[object Object]"]
dict1[dict2]
dict1[dict1]
,因为toString(dict1)
返回"[object Object]"
dict1[({})]
,因为toString(({}))
返回"[object Object]"
这些强制转换在对象创建时的执行方式不同,这意味着您无法执行property var dict2: { [1,2]:3 }
。但是,property var dict2: { "1,2":3 }
可以正常使用。