JavaScriptのStringは値?

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);

としても、時間は変わらない。