旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

“str” と new String(“str”) の違い

2007年6月11日

文字列リテラルを使って宣言した文字列にプロパティを足せないのは何故?の続き。

回答らしきものに一歩近づいたので、途中経過を忘れない内にまとめ。

まずは、
(new String(“str”)).valueOf() が “str” と等しかったということを知った。

var s = new String("foo");
ss = s.valueOf();
alert(s);          // -> "foo"
alert(typeof(s));  // -> "object"
alert(ss);         // -> "foo"
alert(typeof(ss)); // -> "string"

ぬぁるほどね

で、くどいですけど、メソッドを呼べないことも確認

var s = new String("foo");
s._a = function(){return "bar"};
ss = s.valueOf();
alert(s._a());     // -> "bar"
alert(ss._a());    // -> エラー
「じゃあ、なんで二つの”文字列”を持つ必要があるんだろう?」
という疑問が出たので調べると

どうやら、一般的なプログラムの概念として
データの型には、基本型(プリミティブ型 原始型 単純型 組み込み型 とも呼ばれる) と 複合型 というものがあるようで、
“str”は前者、new String(“str”) は後者、の概念に基づいているようだ。

まぁ、javascriptの基本型は、一般的な基本型とは違うらしく
それについては、檜山正幸のキマイラ飼育記-プログラマのためのJavaScript (3):参照について考えてみる に重要なことが書いてあるっぽいけど、正直ほとんど理解できない。

また、上記だけでは説明が付かないこともある

String.prototype._a = function(){return "foo"};
alert("dummy"._a()); // -> "foo"を出力

prototypeを拡張すると使えるんだって、この人に教えてもらった。

・・・ということで、途中経過のまとめ終わり。

残りの疑問は、自分の手に余りそうなのでしばらく放置しよう。
そうすると小人が解決してくれるらしいよ!

参考リンク