QJSManagedValue Class
QJSManagedValue 表示 JavaScript 堆中属于QJSEngine 的一个值。更多内容...
| 头文件: | #include <QJSManagedValue> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| 自: | Qt 6.1 |
公共类型
| enum | Type { Undefined, Boolean, Number, String, Object, …, Function } |
公共函数
| QJSManagedValue() | |
| QJSManagedValue(QJSValue value, QJSEngine *engine) | |
| QJSManagedValue(const QJSPrimitiveValue &value, QJSEngine *engine) | |
| QJSManagedValue(const QString &string, QJSEngine *engine) | |
| QJSManagedValue(const QVariant &variant, QJSEngine *engine) | |
| QJSManagedValue(QJSManagedValue &&other) | |
| ~QJSManagedValue() | |
| QJSValue | call(const QJSValueList &arguments = {}) const |
| QJSValue | callAsConstructor(const QJSValueList &arguments = {}) const |
| QJSValue | callWithInstance(const QJSValue &instance, const QJSValueList &arguments = {}) const |
| bool | deleteProperty(const QString &name) |
| bool | deleteProperty(quint32 arrayIndex) |
| QJSEngine * | engine() const |
| bool | equals(const QJSManagedValue &other) const |
| bool | hasOwnProperty(const QString &name) const |
| bool | hasOwnProperty(quint32 arrayIndex) const |
| bool | hasProperty(const QString &name) const |
| bool | hasProperty(quint32 arrayIndex) const |
| bool | isArray() const |
| bool | isBoolean() const |
| bool | isDate() const |
| bool | isError() const |
| bool | isFunction() const |
| bool | isInteger() const |
| bool | isNull() const |
| bool | isNumber() const |
| bool | isObject() const |
| bool | isQMetaObject() const |
| bool | isQObject() const |
| bool | isRegularExpression() const |
| bool | isString() const |
| bool | isSymbol() const |
| bool | isUndefined() const |
| bool | isUrl() const |
| bool | isVariant() const |
| QJSValue | property(const QString &name) const |
| QJSValue | property(quint32 arrayIndex) const |
| QJSManagedValue | prototype() const |
| void | setProperty(const QString &name, const QJSValue &value) |
| void | setProperty(quint32 arrayIndex, const QJSValue &value) |
| void | setPrototype(const QJSManagedValue &prototype) |
| bool | strictlyEquals(const QJSManagedValue &other) const |
| bool | toBoolean() const |
| QDateTime | toDateTime() const |
| int | toInteger() const |
| QJSValue | toJSValue() const |
| double | toNumber() const |
| QJSPrimitiveValue | toPrimitive() const |
| const QMetaObject * | toQMetaObject() const |
| QObject * | toQObject() const |
| QRegularExpression | toRegularExpression() const |
| QString | toString() const |
| QUrl | toUrl() const |
| QVariant | toVariant() const |
| QJSManagedValue::Type | type() const |
| QJSManagedValue & | operator=(QJSManagedValue &&other) |
详细说明
QJSManagedValue 类允许以与从 JavaScript 本身交互时几乎相同的方式与 JavaScript 值进行交互。您可以获取和设置属性及原型,还可以访问数组。此外,您可以将该值转换为 JavaScript 对象在 Qt 中的对应对象。例如,一个 Url 对象可以转换为QUrl 。
一个 QJSManagedValue 始终与特定的QJSEngine 绑定。您无法独立使用它。这意味着,来自一个引擎的 QJSManagedValue 不能成为来自另一个引擎的 QJSManagedValue 的属性或原型。
与 `QJSValue` 不同,`QJSManagedValue` 持有的几乎所有值都位于 JavaScript 堆上。不存在内联或非托管存储。因此,您可以获取原始值的原型,也可以获取字符串的 `length ` 属性。
只有通过默认构造或从其他地方移动而来的 QJSManagedValue 不会在 JavaScript 堆上持有值。它们表示 `undefined`,后者没有任何属性或原型。
此外,与 `QJSValue` 不同,`QJSManagedValue` 不会捕获任何 JavaScript 异常。如果对 `QJSManagedValue` 的操作引发错误,通常会返回一个 `undefined ` 值,随后 `QJSEngine::hasError()` 将返回 `true `。此时,您可以根据需要使用 `QJSEngine::catchError()` 捕获该异常,或将其向上传递至调用栈。
注意:由于 对 JavaScript 堆中该值的引用必须在销毁时释放,因此您无法将 QJSManagedValue 移动到其他线程。 销毁操作将在新线程中进行,这会导致与原始线程上的垃圾回收器产生竞态条件。这也意味着,您不能将 QJSManagedValue 的持有时间延长至其引擎生命周期之外。
处理 QJSManagedValue 的推荐方法是在栈上创建它(例如通过将一个QJSValue 移动并添加一个引擎),然后对其执行必要的操作,最后将其移回QJSValue 中进行存储。在 QJSManagedValue 和QJSValue 之间转换的速度很快。
成员类型文档
enum QJSManagedValue::Type
该枚举表示ECMA-262 标准中规定的 JavaScript 原生类型。
| 常量 | 值 | 描述 |
|---|---|---|
QJSManagedValue::Undefined | 0 | undefined 类型 |
QJSManagedValue::Boolean | 1 | boolean 类型 |
QJSManagedValue::Number | 2 | number 类型 |
QJSManagedValue::String | 3 | string 类型 |
QJSManagedValue::Object | 4 | object 类型 |
QJSManagedValue::Symbol | 5 | symbol 类型 |
QJSManagedValue::Function | 6 | function 类型 |
请注意,null 值本身并非一种类型,而是一种特殊的对象。您可以使用isNull() 方法查询QJSManagedValue 是否满足该条件。此外,JavaScript 没有整数类型,但它对数字有特殊的处理方式,以支持仅涉及整数的运算。 你可以通过调用isInteger() 方法,查询QJSManagedValue 是否包含此类处理后的结果。
成员函数文档
[constexpr noexcept default] QJSManagedValue::QJSManagedValue()
创建一个 QJSManagedValue 对象,该对象表示 JavaScript 的 `undefined ` 值。这是唯一一个未存储在 JavaScript 堆中的值。对通过默认构造函数创建的 QJSManagedValue 调用 `engine()` 将返回 `nullptr`。
QJSManagedValue::QJSManagedValue(QJSValue value, QJSEngine *engine)
使用engine 的堆,从value 创建一个 QJSManagedValue。如果value 本身是受管理的,且其所属的引擎并非engine ,则结果为undefined 值,并会生成一条警告。
QJSManagedValue::QJSManagedValue(const QJSPrimitiveValue &value, QJSEngine *engine)
使用engine 的堆,从value 创建一个QJSManagedValue。
QJSManagedValue::QJSManagedValue(const QString &string, QJSEngine *engine)
使用engine 的堆,从string 创建一个QJSManagedValue。
QJSManagedValue::QJSManagedValue(const QVariant &variant, QJSEngine *engine)
使用engine 的堆,从variant 创建一个QJSManagedValue。
QJSManagedValue::QJSManagedValue(QJSManagedValue &&other)
从other 构建一个QJSManagedValue对象。这会使other 保持默认构造状态,此时它表示undefined,且不属于任何引擎。
[noexcept] QJSManagedValue::~QJSManagedValue()
销毁QJSManagedValue 。
注意:此操作 将释放该QJSManagedValue 在JavaScript堆中占用的内存空间。切勿在与该 所属的QJSEngine 所在线程不同的线程中销毁该 。
QJSValue QJSManagedValue::call(const QJSValueList &arguments = {}) const
如果该QJSManagedValue 表示一个JavaScript FunctionObject,则使用给定的arguments 调用它,并返回结果;否则返回一个JavaScriptundefined 值。
该arguments 必须是原始值,或者与该QJSManagedValue 属于同一QJSEngine 。否则,不会执行该调用,并将返回一个JavaScriptundefined 值。
QJSValue QJSManagedValue::callAsConstructor(const QJSValueList &arguments = {}) const
如果该QJSManagedValue 表示一个JavaScript函数对象,则将其作为构造函数调用,传入给定的arguments ,并返回结果;否则返回一个JavaScriptundefined 值。
该arguments 必须是基本值,或者与该QJSManagedValue 属于同一QJSEngine 。否则,不会执行调用,并返回一个JavaScriptundefined 值。
QJSValue QJSManagedValue::callWithInstance(const QJSValue &instance, const QJSValueList &arguments = {}) const
如果该QJSManagedValue 表示一个JavaScript FunctionObject,则使用给定的arguments 在instance 上调用该函数,并返回结果。否则,返回一个JavaScriptundefined 值。
arguments 和instance 必须是原始值,或者属于与该QJSManagedValue 相同的QJSEngine 。否则,不会执行该调用,并返回一个 JavaScriptundefined 值。
bool QJSManagedValue::deleteProperty(const QString &name)
从该QJSManagedValue 中删除属性name 。若删除成功,则返回true ;否则返回false 。
bool QJSManagedValue::deleteProperty(quint32 arrayIndex)
从该QJSManagedValue 中删除存储在arrayIndex 处的值。如果删除成功,则返回true ;否则返回false 。
QJSEngine *QJSManagedValue::engine() const
返回与该QJSManagedValue 关联的QJSEngine 。请注意,该引擎始终有效,除非QJSManagedValue 被默认构造或被移动。在后一种情况下,将返回一个 nullptr。
bool QJSManagedValue::equals(const QJSManagedValue &other) const
对该QJSManagedValue 和other 调用JavaScript的“==”运算符,并返回结果。
另请参阅 strictlyEquals 。
bool QJSManagedValue::hasOwnProperty(const QString &name) const
如果该QJSManagedValue 对象具有name 属性,则返回true ;否则返回false 。原型链中的属性不予考虑。
bool QJSManagedValue::hasOwnProperty(quint32 arrayIndex) const
如果该QJSManagedValue 具有数组索引arrayIndex ,则返回true ;否则返回false 。原型链的属性不予考虑。
bool QJSManagedValue::hasProperty(const QString &name) const
如果该QJSManagedValue 对象具有name 属性,则返回true ;否则返回false 。此处会考虑原型链中的属性。
bool QJSManagedValue::hasProperty(quint32 arrayIndex) const
如果该QJSManagedValue 具有数组索引arrayIndex ,则返回true ;否则返回false 。此处会考虑原型链的属性。
bool QJSManagedValue::isArray() const
如果该值表示一个 JavaScript 数组对象,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isBoolean() const
如果该QJSManagedValue 的类型为boolean ,则返回true ;否则返回false 。
bool QJSManagedValue::isDate() const
如果该值表示一个 JavaScript Date 对象,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isError() const
如果该值表示一个 JavaScript 错误对象,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isFunction() const
如果该QJSManagedValue 的类型为function ,则返回true ;否则返回false 。
bool QJSManagedValue::isInteger() const
如果此QJSManagedValue 包含整数值,则返回true ;否则返回false 。数的存储格式不会影响对其执行的任何运算结果,但如果存储的是整数,许多运算的速度会更快。
bool QJSManagedValue::isNull() const
如果该QJSManagedValue 包含JavaScript值null ,则返回true ;否则返回false 。
bool QJSManagedValue::isNumber() const
如果该QJSManagedValue 的类型为number ,则返回true ;否则返回false 。
bool QJSManagedValue::isObject() const
如果该QJSManagedValue 的类型为object ,则返回true ;否则返回false 。
bool QJSManagedValue::isQMetaObject() const
如果该值表示一个由 JavaScript 堆管理的 `QMetaObject ` 指针,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isQObject() const
如果该值表示一个在 JavaScript 堆上管理的 `QObject ` 指针,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isRegularExpression() const
如果该值表示一个 JavaScript 正则表达式对象,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isString() const
如果该QJSManagedValue 的类型为string ,则返回true ;否则返回false 。
bool QJSManagedValue::isSymbol() const
如果该QJSManagedValue 的类型为symbol ,则返回true ;否则返回false 。
bool QJSManagedValue::isUndefined() const
如果该QJSManagedValue 的类型为undefined ,则返回true ;否则返回false 。
bool QJSManagedValue::isUrl() const
如果该值表示一个 JavaScript Url 对象,则返回 `true `;否则返回 `false `。
bool QJSManagedValue::isVariant() const
如果该值表示一个在 JavaScript 堆上管理的QVariant ,则返回 `true `;否则返回 `false `。
QJSValue QJSManagedValue::property(const QString &name) const
返回此 `QJSManagedValue` 的 `name ` 属性。如果在实际对象上未找到该属性,则会遍历原型链进行查找。
另请参阅 setProperty()。
QJSValue QJSManagedValue::property(quint32 arrayIndex) const
返回此 `QJSManagedValue` 对象中存储在 `arrayIndex ` 位置的属性。如果在实际对象上找不到该属性,则会搜索原型链。
QJSManagedValue QJSManagedValue::prototype() const
返回此QJSManagedValue 的原型。该方法对任何值均有效。例如,你可以从boolean 值中获取JavaScriptboolean 的原型。
另请参阅 setPrototype()。
void QJSManagedValue::setProperty(const QString &name, const QJSValue &value)
将此QJSManagedValue 的name 属性设置为value 。此操作仅可针对类型为object 的JavaScript值进行。此外,value 必须是基本类型,或者与该值属于同一引擎。
另请参阅 property()。
void QJSManagedValue::setProperty(quint32 arrayIndex, const QJSValue &value)
将value 存储到arrayIndex 中,位于此QJSManagedValue 中。此操作仅适用于类型为object 的JavaScript值,若该值不是数组,则不建议执行此操作。此外,value 必须是原始类型,或者与该值属于同一引擎。
void QJSManagedValue::setPrototype(const QJSManagedValue &prototype)
将此QJSManagedValue 的原型设置为prototype 。前提条件是prototype 必须与该QJSManagedValue 属于同一个QJSEngine ,并且是一个对象(包括null)。此外,该QJSManagedValue 也必须是一个对象(不包括null),且不能形成原型循环。
另请参阅 prototype()。
bool QJSManagedValue::strictlyEquals(const QJSManagedValue &other) const
对该QJSManagedValue 和other 调用JavaScript的“===”运算符,并返回结果。
另请参阅 equals 。
bool QJSManagedValue::toBoolean() const
将受管值转换为布尔值。如果受管值本身是布尔值,则直接返回该值;否则,将根据 JavaScript 规则进行布尔值强制转换。
QDateTime QJSManagedValue::toDateTime() const
如果该QJSManagedValue 包含一个 JavaScript Date 对象,则返回一个等效的QDateTime 。否则返回一个无效的对象。
int QJSManagedValue::toInteger() const
将托管值转换为整数。此操作首先根据toNumber() 的规则将该值转换为数字,然后按照将 JavaScript 位移运算符的参数强制转换为 32 位整数的规则,将其限制在整数范围内。
在内部,该值可能已被存储为整数,这种情况下将采用快速路径。
注意:将 托管值转换 为数字可能会抛出异常。特别是,符号无法强制转换为数字,否则自定义的 valueOf() 方法可能会抛出异常。在这种情况下,结果为 0,且引擎在转换后会携带一个错误。
注意: JavaScript 将数字转换为 32 位整数的规则并不直观。
QJSValue QJSManagedValue::toJSValue() const
将QJSManagedValue 复制到一个新的QJSValue 中。虽然这比从QJSManagedValue 通过移动构造QJSValue 效率较低,但保留了QJSManagedValue 。
double QJSManagedValue::toNumber() const
将托管值转换为数字。如果托管值本身是一个数字,则直接返回该数字;否则,将根据 JavaScript 规则进行数字强制转换。
注意:将 托管值转换 为数字可能会抛出异常。特别是,符号无法被强制转换为数字,否则自定义的 valueOf() 方法可能会抛出异常。在这种情况下,结果为 0,且引擎在转换后会携带一个错误。
QJSPrimitiveValue QJSManagedValue::toPrimitive() const
将托管值转换为QJSPrimitiveValue 。如果托管值属于QJSPrimitiveValue 支持的类型,则直接复制该值;否则,该值将转换为字符串,并将该字符串存储在QJSPrimitiveValue 中。
注意:将 托管值转换为 字符串可能会抛出异常。特别是,符号无法强制转换为字符串,否则自定义的toString()方法可能会抛出异常。在这种情况下,结果为未定义值,且引擎在转换后会携带一个错误。
const QMetaObject *QJSManagedValue::toQMetaObject() const
如果该QJSManagedValue 包含一个QMetaObject 指针,则返回该指针;否则返回 nullptr。
QObject *QJSManagedValue::toQObject() const
如果该QJSManagedValue 包含一个QObject 指针,则返回该指针;否则返回 nullptr。
QRegularExpression QJSManagedValue::toRegularExpression() const
如果该QJSManagedValue 包含一个 JavaScript 正则表达式对象,则返回一个等效的QRegularExpression 。否则返回一个无效的对象。
QString QJSManagedValue::toString() const
将托管值转换为字符串。如果托管值本身是一个字符串,则直接返回该字符串;否则,将根据 JavaScript 规则进行字符串强制转换。
注意:将 托管值转换为 字符串可能会抛出异常。特别是,符号无法被强制转换为字符串,否则自定义的 toString() 方法可能会抛出异常。在这种情况下,结果为空字符串,且引擎在转换后会携带一个错误。
QUrl QJSManagedValue::toUrl() const
如果该QJSManagedValue 包含一个 JavaScript Url 对象,则返回一个等效的QUrl 。否则返回一个无效的对象。
QVariant QJSManagedValue::toVariant() const
将此QJSManagedValue 复制到一个新的QVariant 中。如果QJSManagedValue::isVariant()返回false,这还会生成一个有用的QVariant 。QVariant 可以包含QJSManagedValue 支持的所有类型。
QJSManagedValue::Type QJSManagedValue::type() const
返回此QJSManagedValue 的JavaScript类型。
QJSManagedValue &QJSManagedValue::operator=(QJSManagedValue &&other)
通过移动赋值将QJSManagedValue 从other 赋值过来。这会使other 保持在默认构造状态,此时它表示 undefined,且不属于任何引擎。
注意:这会 释放该QJSManagedValue 在JavaScript堆上占用的内存槽。你绝不能在与该QJSEngine 所属线程不同的线程上对QJSManagedValue 进行移动赋值。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.