18

私が持っている場合:

var test = {toString: function(){alert("evil code"); return "test";}};

どうすればtest文字列に変換できますか?文字列以外を許可したいので、呼び出しもチェックtest.toString()も使用せずに。typeof x == "string"

注:これは、コンテンツページのjsスコープからのオブジェクトを処理するFF拡張機能用です。

4

6 に答える 6

6

JavaScriptを使用すると、スクリプトにアクセスできるほとんどすべてのオブジェクト(Object.prototypeそれ自体を含む)のプロパティを変更できます。つまりオブジェクトは、説明した方法で「悪意のあるコード」に対して脆弱です。

安全性が保証されているのはプリミティブだけなので、「邪悪なコード」が実行されないようにする唯一の方法は、次のようなことを行うことです。

function safeToString(x) {
  switch (typeof x) {
    case 'object':
      return 'object';
    case 'function':
      return 'function';
    default:
      return x + '';
  }
}
于 2010-11-30T04:45:07.430 に答える
6

残念ながら、@ Matthew Flaschenの(現在受け入れられている)回答はSymbol、ES6/ES2015のクラス では機能しません。

console.log("" + Symbol("foo"));
// results in an exception: 
//   `Uncaught TypeError: Cannot convert a Symbol value to a string` 
// (at least in Chrome as of this writing).

https://jsfiddle.net/L8adq9y4/

Symbol(完全に良い方法があるので、理由はわかりませんtoString():)

console.log(Symbol("foo").toString());

https://jsfiddle.net/v1rqfhru/

ただし、解決策はあります。String()関数は、任意の値(少なくとも私が試した値から)をに変換できるようStringです。toString()存在する場合でも呼び出します。

console.log(String("A String"));
console.log(String(undefined));
console.log(String(null));
console.log(String({value: "An arbitrary object"}));
console.log(String({toString: function(){return "An object with a toString() method";}}));
console.log(String(function(){return "An arbitrary function"}));

https://jsfiddle.net/6uc83tsc/

だから、あなたが好きなものを何でも渡すString()と、かなり良い結果が得られます。

于 2016-10-21T21:26:59.540 に答える
5

ここでは解析されませ(toString: function(){alert("evil code"); return "test";})ん。構文エラーがスローされます。{}の代わりに使いたかったと思います()

通常、空の文字列とプラス演算子を使用してキャストを実行できます。

""+test;
""+2; // "2"
""+4.5 // "4.5"
""+[1, 2, 3] // "1,2,3"
""+{} // '[object Object]'

しかし、ここでは、オブジェクトを安全に変換する実際の方法はありません。

delete test.toStringオーバーライドされたメソッドを取り除くために使用できます。その後、toStringを返す通常のメソッドにフォールバックします'[object Object]'toStringメソッド自体を。を介して文字列に変換することもできますtest.toString.toString()

"function () { alert("evil code"); return "test"; }"

ここで何をしたいかはあなた次第です。

于 2010-11-30T04:31:45.647 に答える
5

1つのオプションは次のとおりです。

Object.prototype.toString.call(test)

これは与える:

"[object Object]"

テストの場合。基本的には、タイプ情報を提供するだけです。しかし、正確なシナリオはここにあるのだろうか。邪悪なオブジェクトはどのようにページに読み込まれますか?彼らがページ上で任意のコードを実行できる場合、あなたは基本的に運が悪いです。とりわけ、再定義することが可能Object.prototype.toStringです。

于 2010-11-30T04:34:31.020 に答える
1

ケースのみをチェックして、このようなコンストラクターundefinedを使用して変換できます。String

let a = [1,2,3]

String(a)

例外的なケース:String(undefined) --> "undefined"

それが役に立てば幸い

于 2019-11-22T21:41:47.903 に答える
0

lodashtoStringメソッドを使用できます。

_.toString(null);
// => ''

_.toString(-0);
// => '-0'

_.toString([1, 2, 3]);
// => '1,2,3'

ドキュメントへのリンク

于 2017-10-06T19:00:34.060 に答える