最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 2浏览 0评论

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

我目前正在使用node-gyp寻找C ++附加组件。

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

有一些关于不建议使用的警告,它们提供了指向v8.h文件(在node-gyp中)的声明的链接。但是,关于ToNumber只有V8_DEPRECATED和V8_WARN_UNUSED_RESULT。因此,似乎由于v8::Value::ToNumber中缺少对v8.h的定义而导致了错误。

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

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/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425

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

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

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

我目前正在使用node-gyp寻找C ++附加组件。

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

有一些关于不建议使用的警告,它们提供了指向v8.h文件(在node-gyp中)的声明的链接。但是,关于ToNumber只有V8_DEPRECATED和V8_WARN_UNUSED_RESULT。因此,似乎由于v8::Value::ToNumber中缺少对v8.h的定义而导致了错误。

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

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/nodejs/node/blob/v10.16.3/deps/v8/include/v8.h#L2425

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

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

发布评论

评论列表 (0)

  1. 暂无评论