http://blog.livedoor.jp/dankogai/archives/50963275.html
えー!
http://d.hatena.ne.jp/odz/20071206/1196927108
ここにあるようにReadOnlyなだけだと思ってた。
var str = "a";
var str2 = str; // アドレスをコピー
var str3 = str.bold(); // 実体をコピーしてboldフラグ立てる
特に根拠は無いが、上の2行目で実体をコピーするなんてそんな効率の悪いことをするとは思えない。
いちおうECMA-262の仕様を読んでみたが、
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
15分くらいで嫌になった。
しかたがないので、ベンチマークしてみた。
string1 : 長さ16384の文字列を代入
string2 : boldメソッドでコピー
array : Arrayを代入
これを100万回繰り返して時間を測ってみた。
string1 : 500ms
string2 : 27250ms
array : 344ms
いつもarrayがstring1より速いのは気になるが、それはおいといて、ベンチマークの結果を見る限り、値をコピーしているとは思えない。ベンチマークは、WSH/JScriptだから、少なくともJScriptではそうとは思えない。
var N = 1e6; // 繰り返し回数// 長さ16384の文字列を作る
var str1 = "a";
for(var i = 0; i < 14; i++) {
str1 += str1;
}
WScript.Echo(str1.length);bench_string1();
bench_string2();
bench_array();function bench_string1() {
var t = (new Date()).getTime();
var str2;
for(var i = 0; i < N; i++) {
str2 = str1;
}
WScript.Echo("string1 : " + (new Date().getTime() - t) + "ms");
}function bench_string2() {
var t = (new Date()).getTime();
var str2;
for(var i = 0; i < N; i++) {
str2 = str1.bold();
}
WScript.Echo("string2 : " + (new Date().getTime() - t) + "ms");
}function bench_array() {
var t = (new Date()).getTime();
var ary1 = [ 1, 2, 3 ];
var ary2;
for(var i = 0; i < N; i++) {
ary1 = ary2;
}
WScript.Echo("array : " + (new Date().getTime() - t) + "ms");
}
ブラウザで実行するなら、WScript.Echoのところをalertにするとか。
ちなみに、
str2 = str1.bold();
を、
str2 = str1.substring(0, 16384);
としても、時間は変わらない。