v8 不再支持 v8::Value::ToNumber 了吗?

v8 do not support v8::Value::ToNumber anymore?

我目前正在寻找带有 node-gyp 的 C++ 附加组件。

node-gyp configure 工作正常,但 node-gyp build 给出错误 error C2661: 'v8::Value::ToNumber': no overloaded function take 0 parameter.

有一些关于弃用的警告,它们在 v8.h 文件(在 node-gyp 中)中给出了 link 声明。 但是,关于 ToNumber 只有 V8_DEPRECATED 和 V8_WARN_UNUSED_RESULT。因此,似乎由于 v8.h.

中缺少关于 v8::Value::ToNumber 的定义而导致错误

下面最后一行代码出现错误:

void someFunction(const FunctionCallbackInfo<Value>& args) {
    Isolate *iso = args.GetIsolate();
    if (args.Length() < 1) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Must provide Input")));
    }

    Local<Object> coords = args[0]->ToObject()->Clone();  // note that the keys are available with coords->GetOwnPropertyNames();
    Local<Array> keys = coords->GetOwnPropertyNames();

    if (keys->Length() != 2) {
        iso->ThrowException(Exception::TypeError(String::NewFromUtf8(iso, "Need exactly 2 values")));
    }

    char props[2];
    double values[2];

    for (int i=0; i < 2; i++) {
        String::Utf8Value key(keys->Get(i)->ToString());
        props[i] = (*key)[0];
        values[i] = coords->Get(keys->Get(i))->ToNumber()->Value();
    }
    ...

我试图阅读 nodejs 文档,但似乎没有关于删除 ToNumber 的证据。 也找了相关的问题,但没有匹配我的:(

可能与我的节点版本有关,但在测试节点版本之前我需要一些问题的答案..

我正在使用节点:10.16.3 npm:6.9.0 node-gyp:5.0.3

感谢您的阅读。感谢任何帮助!

这里是 V8 开发人员。您找不到删除 ToNumber 的证据,因为它还没有被删除 ;-)

只是这个函数的无参数版本,已经被弃用了一段时间,终于被放弃了。替换的是将 Local<Context> 作为参数的版本,请参见此处:https://github.com/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425

技术背景是 ToNumber 可以最终执行 JavaScript(例如,如果使用 valueOf 方法在对象上调用它),然后执行 JavaScript 是特定于上下文的。用于 ToNumber 的上下文过去是隐式的,这很难推理,有时会导致嵌入端的细微错误;所以 V8 的 "new"(过去几年)API 理念是使上下文参数显式化。您的嵌入应用程序越复杂,您就越(希望)欣赏代码的更明显结构。

ToString 在同一条船上,顺便说一句。在这种情况下,无参数版本仍然存在,但已被弃用;替换为 ToString(Local<Context> context).