次の点を考慮してください。
var foo = []
for (var i=0; i<100000; i++) { foo.push(97); }
var bar = String.fromCharCode.apply(String,foo)
ほとんどのブラウザーは正常に動作しますが、Safari は次のようにスローします。RangeError: Maximum call stack size exceeded.
これに基づいて、Safari のFunction.prototype.applyの実装は再帰的であるように見えます。これは本当ですか?
上記のリンク先の MDN ページでは、JS エンジンの引数の長さ制限に関する潜在的な問題について言及していますが、ここでは明らかにそうではありません。
編集:私はまだそれが引数の長さの問題だとは思わない. このページと私自身のテストによると、Safari は最大524197個の引数を処理できるようですが、上記のコードはこれを超えていません。
おまけの質問: 上記のコードを書き換えてString.fromCharCode
、配列の各要素を明示的に呼び出しjoin
て結果をまとめることで apply の使用を避けることができますが、( large-input をサポートするブラウザーの場合apply
) 遅くなると思います。整数文字コードの配列から大きな文字列を組み立てる最良の方法は何ですか?