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)
.
我目前正在寻找带有 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)
.