- Qt 5.15
- Qt QML
- QML Types
- var QML Basic Type
- Qt 5.15.18 Reference Documentation

# var QML Basic Type

The `var` type is a generic property type that can refer to any data type.

It is equivalent to a regular JavaScript variable. For example, var properties can store numbers, strings, objects, arrays and functions:

     Item {
         property var aNumber: 100
         property var aBool: false
         property var aString: "Hello world!"
         property var anotherString: String("#FF008800")
         property var aColor: Qt.rgba(0.2, 0.3, 0.4, 0.5)
         property var aRect: Qt.rect(10, 10, 10, 10)
         property var aPoint: Qt.point(10, 10)
         property var aSize: Qt.size(10, 10)
         property var aVector3d: Qt.vector3d(100, 100, 100)
         property var anArray: [1, 2, 3, "four", "five", (function() { return "six"; })]
         property var anObject: { "foo": 10, "bar": 20 }
         property var aFunction: (function() { return "one"; })
     }

## Change Notification Semantics

It is important to note that changes in regular properties of JavaScript objects assigned to a var property will not trigger updates of bindings that access them. The example below will display "The car has 4 wheels" as the change to the wheels property will not cause the reevaluation of the binding assigned to the "text" property:

     Item {
         property var car: new Object({wheels: 4})

         Text {
             text: "The car has " + car.wheels + " wheels";
         }

         Component.onCompleted: {
             car.wheels = 6;
         }
     }

If the onCompleted handler instead had `"car = new Object({wheels: 6})"` then the text would be updated to say "The car has 6 wheels", since the car property itself would be changed, which causes a change notification to be emitted.

## Property Value Initialization Semantics

The QML syntax defines that curly braces on the right-hand-side of a property value initialization assignment denote a binding assignment. This can be confusing when initializing a `var` property, as empty curly braces in JavaScript can denote either an expression block or an empty object declaration. If you wish to initialize a `var` property to an empty object value, you should wrap the curly braces in parentheses.

For example:

     Item {
         property var first:  {}   // nothing = undefined
         property var second: {{}} // empty expression block = undefined
         property var third:  ({}) // empty object
     }

In the previous example, the `first` property is bound to an empty expression, whose result is undefined. The `second` property is bound to an expression which contains a single, empty expression block ("{}"), which similarly has an undefined result. The `third` property is bound to an expression which is evaluated as an empty object declaration, and thus the property will be initialized with that empty object value.

Similarly, a colon in JavaScript can be either an object property value assignment, or a code label. Thus, initializing a var property with an object declaration can also require parentheses:

     Item {
         property var first: { example: 'true' }    // example is interpreted as a label
         property var second: ({ example: 'true' }) // example is interpreted as a property
         property var third: { 'example': 'true' }  // example is interpreted as a property
         Component.onCompleted: {
             console.log(first.example) // prints 'undefined', as "first" was assigned a string
             console.log(second.example) // prints 'true'
             console.log(third.example) // prints 'true'
         }
     }

See also QML Basic Types.