Ich verbinde V8 als Hilfssprache in einem C ++ Programm.
Ich erhalte ein Handle<Value>
von V8, wenn ich etwas wie
Ich kann dann herausfinden, dass es sich um eine Zeichenfolge mit value_handle->IsString()
handelt. Und wenn ja, kann ich es in ein Handle<String>
konvertieren, um auf seine stringspezifischen Methoden zuzugreifen.
Aber es scheint zwei Möglichkeiten zu geben:
%Vor%oder
%Vor% Für Arrays und Funktionen gibt es jedoch keine toArray()
oder toFunction
Methoden, nur das Casting.
Also meine Frage ist:
a) Sind die ToXXX
nur syntaktischer Zucker zum Gießen?
und, wenn nicht b) Was macht die Methode ToXXX
?
ToXXX
Funktionen führen Typumwandlungen durch, wie in den Unterabschnitten von Abschnitt 9 von ECMA-262 5th beschrieben. Zum Beispiel wird ToString
in Abschnitt 9.8 beschrieben: Wenn ein Wert ohne Zeichenfolge angegeben wird, wird eine entsprechende Zeichenfolge zurückgegeben Darstellung davon, wenn Sie ein Objekt übergeben, ruft es toString
method auf (oder valueOf
, wenn toString
nicht vorhanden ist). Relevanter Code für ToString
: in api.cc
Value::ToString
, die in runtime.js
ToString
Auf der anderen Seite macht Handle<XXX>::Cast(...)
keine Zwänge. Es ist nur eine Art Besetzung für Griffe. Im Wesentlichen ist es nur ein static_cast<XXX*>
. Im Debug-Modus ist Handle<T>::Cast(...)
aktiviert und bricht die Ausführung ab, wenn die Typen nicht übereinstimmen. Es wäre ein fataler Fehler, wenn Sie ein Handle<Value>
mit einem Object
erhalten und es in ein Handle<String>
umwandeln möchten. Im Freigabemodus führt die Umwandlung in einen inkompatiblen Typ später zu seltsamen Ergebnissen und möglicherweise zu Abstürzen, wenn Sie versuchen, das Ergebnis der Besetzung zu verwenden. Relevanter Code in v8.h
Handle<T>::Cast
delegiert an (zum Beispiel) String::Cast
, das die Besetzung überprüft (sofern die Prüfungen aktiviert sind) über String::CheckCast
.
Wir können
findenV8EXPORT Local ToString () const;
in Zeile 971 von v8.h
Wobei V8EXPORT ein Betriebssystemabhängiger Ansatz für Funktionen ist.
ToString von Handle von String befindet sich in Zeile 2362 von api.cc
%Vor%Aus Gründen der Konsistenz und der Vorteile eines weiteren Upgrades von V8-Versionen empfehle ich dringend toString () anstelle der primitiven Besetzung.
Tags und Links javascript c++ v8