Wenn ich:
%Vor% Wie kann ich test
in eine Zeichenkette konvertieren? ohne Aufruf von test.toString()
und ohne Verwendung von typeof x == "string"
check, da ich nonstrings zulassen möchte.
Hinweis: Dies ist für eine FF-Erweiterung, die Objekte aus dem js-Bereich einer Inhaltsseite behandelt.
JavaScript ermöglicht es Ihnen, die Eigenschaften von so ziemlich jedem Objekt zu ändern, auf das Ihr Skript zugreifen kann, einschließlich Object.prototype
selbst, was bedeutet, dass jedes Objekt in der Ihnen bekannten Weise für "bösen Code" anfällig ist erklärt.
Nur Primitive sind garantiert sicher, also ist die einzige Möglichkeit, um sicherzustellen, dass "böser Code" niemals ausgeführt wird, etwas zu tun:
%Vor% Ihr (toString: function(){alert("evil code"); return "test";})
wird hier nicht einmal geparst, es löst einen Syntaxfehler aus. Ich glaube, du wolltest {}
anstelle von ()
verwenden.
Normalerweise könnten Sie eine leere Zeichenfolge und den Plus-Operator verwenden, um eine Umwandlung durchzuführen:
%Vor%Aber hier gibt es keine echte Möglichkeit, das Objekt sicher zu konvertieren.
Sie können delete test.toString
verwenden, um die überschriebene Methode loszuwerden, danach wird auf die normale Methode toString
zurückgegriffen, die '[object Object]'
zurückgibt. Sie können die Methode toString
auch selbst in eine Zeichenfolge über test.toString.toString()
konvertieren.
Es liegt an Ihnen, was Sie genau hier machen wollen.
Eine Option ist:
%Vor%Dies ergibt:
%Vor% im Testfall. Im Grunde gibt es nur Typinformationen. Ich frage mich jedoch, was das genaue Szenario hier ist. Wie wird das böse Objekt in die Seite geladen? Wenn sie auf der Seite beliebigen Code ausführen können, haben Sie grundsätzlich kein Glück. Unter anderem ist es dann möglich, Object.prototype.toString
neu zu definieren.
Leider funktioniert die Antwort von @Matthew Flaschen (derzeit akzeptiert) nicht mit der Klasse Symbol
von ES6 / ES2015:
(Ich habe keine Ahnung warum, denn Symbol
hat eine vollkommen gute toString()
Methode :)
Es gibt jedoch eine Lösung: Die Funktion String()
scheint in der Lage zu sein, jeden Wert (zumindest einen der Werte, die ich ausprobiert habe) in einen String
umzuwandeln. Es wird sogar toString()
aufrufen, wenn es existiert:
Übergeben Sie alles, was Ihnen gefällt, in String()
und Sie erhalten ein ziemlich gutes Ergebnis.
Sie können die lodash toString-Methode verwenden.
%Vor%Tags und Links javascript security firefox-addon gecko