C++ 比较v8字符串(Node.js加载项)

C++ 比较v8字符串(Node.js加载项),c++,v8,C++,V8,我有这个: if (!args[2]->IsString() || (*args[2]->ToString() != "true" && *args[2]->ToString() != "false")) { Nan::ThrowTypeError("Third argument to 'replace-line' must be a string representing whether to find or replace.");

我有这个:

  if (!args[2]->IsString() || (*args[2]->ToString() != "true" && *args[2]->ToString() != "false")) {
        Nan::ThrowTypeError("Third argument to 'replace-line' must be a string representing whether to find or replace.");
        return;
    }
但我得到一个编译错误和警告:

../hello.cpp:49:58: error: comparison between distinct pointer types ‘v8::String*’ and ‘const char*’ lacks a cast [-fpermissive]
../hello.cpp:49:92: warning: comparison with string literal results in unspecified behaviour [-Waddress]
     if (!args[2]->IsString() || (*args[2]->ToString() != "true" && *args[2]->ToString() != "false")) {

如何正确比较v8字符串与普通C字符串?

您可以使用
v8::String::NewFromOneByte
进行转换详细信息如果需要,还可以使用其他源代码


如果您想换一种方式,您可能需要创建自己的缓冲区并使用
WriteOneByte

您可以使用
v8::String::NewFromOneByte
进行转换。如果您需要,还可以使用其他源代码

如果您想换一种方式,那么看起来您必须创建自己的缓冲区并使用
WriteOneByte

您可以构造一个类似
v8::String::Utf8Value arg(args[2]->ToString())
,并将其与C字符串文本进行比较(尽管事件使用
strcmp/strncmp
而不是
=
或从中构造
std::string

您可以构造一个类似
v8::string::Utf8Value arg(args[2]->ToString())
,并将其与C字符串文本进行比较(尽管事件使用
strcmp/strncmp
而不是
=
,或者从中构造一个
std::string

V8用于Javascript 如何正确比较Javascript中的两个字符串

"String 1" === "String 2"
value1 === value2
如何正确比较Javascript中的两个值

"String 1" === "String 2"
value1 === value2

在C++中也可以使用<代码> = = = /代码>的魔力。 不要提取内部字符值进行比较。 比较(
==
)v8::Values.

假设
args[2]
v8::Local
而不是空句柄,则可以执行以下操作:

Isolate *isolate = Isolate::GetCurrent();
v8::Local<v8::String> h_true = v8::String::NewFromUtf8(isolate, "true");
v8::Local<v8::String> h_false = v8::String::NewFromUtf8(isolate, "false");
if(args[2]->StrictEquals(h_true) || args[2]->StrictEquals(h_false) == false)
{
    v8::Local<v8::String> h_error_message = v8::String::NewFromUtf8(
        isolate,
        "The argument must be a \"true\" or a \"false\"."
    );
    v8::Local<v8::Error> h_error = v8::Exception::RangeError(h_error_message);
    isolate->ThrowException(h_error);
    return;
}
您甚至不必检查参数是否是字符串,也不必检查它是否由调用方提供。

V8用于Javascript 如何正确比较Javascript中的两个字符串

"String 1" === "String 2"
value1 === value2
如何正确比较Javascript中的两个值

"String 1" === "String 2"
value1 === value2

在C++中也可以使用<代码> = = = /代码>的魔力。 不要提取内部字符值进行比较。 比较(
==
)v8::Values.

假设
args[2]
v8::Local
而不是空句柄,则可以执行以下操作:

Isolate *isolate = Isolate::GetCurrent();
v8::Local<v8::String> h_true = v8::String::NewFromUtf8(isolate, "true");
v8::Local<v8::String> h_false = v8::String::NewFromUtf8(isolate, "false");
if(args[2]->StrictEquals(h_true) || args[2]->StrictEquals(h_false) == false)
{
    v8::Local<v8::String> h_error_message = v8::String::NewFromUtf8(
        isolate,
        "The argument must be a \"true\" or a \"false\"."
    );
    v8::Local<v8::Error> h_error = v8::Exception::RangeError(h_error_message);
    isolate->ThrowException(h_error);
    return;
}
您甚至不必检查参数是否是字符串,也不必检查它是否由调用方提供。