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
属性。
只有默认构建的或移动而来的 QJSManagedValues 才不在 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]
QJSManagedValue::QJSManagedValue()
创建表示 JavaScriptundefined
值的 QJSManagedValue。这是唯一没有存储在 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)
Move-construct 一个来自other 的 QJSManagedValue。这会使other 处于默认构造状态,即表示未定义,不属于任何引擎。
[noexcept]
QJSManagedValue::~QJSManagedValue()
销毁QJSManagedValue 。
注意: 这将释放 JavaScript 堆上的内存槽。切勿在不同的线程中销毁QJSManagedValue ,而不是在它所属的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 FunctionObject,则使用给定的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 Array 对象,则返回true
,否则返回false
。
bool QJSManagedValue::isBoolean() const
如果QJSManagedValue 的类型是boolean
,则返回true
,否则返回false
。
bool QJSManagedValue::isDate() const
如果该值代表 JavaScript Date 对象,则返回true
,否则返回false
。
bool QJSManagedValue::isError() const
如果该值代表 JavaScript Error 对象,则返回true
,否则返回false
。
bool QJSManagedValue::isFunction() const
如果QJSManagedValue 的类型是function
,则返回true
,否则返回false
。
bool QJSManagedValue::isInteger() const
如果QJSManagedValue 保存的是整数值,则返回true
,否则返回false
。数字的存储格式不会影响对其执行的任何操作的结果,但如果存储的是整数,许多操作会更快。
bool QJSManagedValue::isNull() const
如果QJSManagedValue 持有 JavaScriptnull
值,则返回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
返回存储在arrayIndex 的属性QJSManagedValue 。如果在实际对象中找不到该属性,则会搜索原型链。
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)
将arrayIndex 中的value 存储到QJSManagedValue 中。这只能在 JavaScript 值类型为object
时执行,如果值不是数组,则不建议执行。此外,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)
Move-assigns aQJSManagedValue fromother 。这样,other 就处于默认构造状态,表示未定义,不属于任何引擎。
注意: 这将释放QJSManagedValue 在 JavaScript 堆上的内存槽。不得在不同的线程上移动分配QJSManagedValue ,而不是在它所属的QJSEngine 上。
© 2025 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.