Как сказано в документации, v8::Value::IntegerValue()
«Возвращает эквивалент ToInteger()->Value()
», что означает, что он генерирует исключение (т.е. возвращает Nothing
) при вызове BigInt
, отражая тот факт, что в JavaScript , вызывая «абстрактную операцию» ToInteger()
на BigInt
, выдает TypeError
, или другими словами: BigInt
не просто неявно конвертируется в Number
.
Чтобы извлечь значение BigInt
из C ++, вы можете сделать следующее:
int64_t bigint = v8::Local<v8::BigInt>::cast(result)->Int64Value();
Конечно, это даст неверный результат, если значение BigInt больше, чем int64. Требуется необязательный bool*
, чтобы указать, было ли преобразование в int64 без потерь или с усечением. Если вам нужно получить большие значения, вы можете использовать метод ToWordsArray(...)
.
как получить возвращаемое значение функции JS из V8?
Точно так же, как и вы:
v8::MaybeLocal<v8::Value> result = func->Call(...);
Обратите внимание, что использование .ToLocalChecked();
рискованно: если функция генерирует исключение вместо возврата значения, тогда .ToLocalChecked()
выдаст ошибку sh. Если вы не контролируете код функции и, следовательно, не можете гарантировать, что она не сработает, тогда лучше проверить, является ли результат пустым, и аккуратно обработать исключения. См. Каталог V8 samples/
или документацию v8.dev / docs / , где можно найти множество примеров и дополнительных объяснений.
(Примечание: я бы рекомендовал использовать auto
намного меньше. Это помогает увидеть типы. Различия, скажем, между v8::Value
, v8::Local<v8::Value>
, v8::MaybeLocal<v8::Value>
и v8::Local<v8::BigInt>
значительны, и это помогает вам писать правильный код, когда вы не просто скрываете их сзади auto
.)