Edited at

javascript ラッパーオブジェクト

More than 3 years have passed since last update.

javascriptの勉強をしていて、以下のようなコードを見た時どう思いますか?

var str = "hello,world";

document.write(str.length);//文字列の長さを表示

オブジェクトが理解できているなら不思議に思うはずです

「なぜ基本型はオブジェクトじゃないのにプロパティを参照できるのか?」

まずは文字列から解説します

ざっくり言えばjavascriptの仕様なんですが

string型変数でプロパティを参照しようとした場合、自動的に

var str = new String("hello,world");

といったコードと同じように生成されるためです。

そのため文字列型は基本型でありながら一時的にオブジェクトとなり、プロパティを扱うことができるようになります

さらにプロパティへのアクセスが完了した時に上記のようなオブジェクトは廃棄されます

これらと同じ理由で数値と論理型もプロパティを参照可能です。

ただし基本型であっても、nullとundefindはこういったオブジェクトをもたないので、プロパティで参照しても

TypeErrorとなってしまうことに注意です

ではこれまでの事を踏まえて以下のコードを実行するとlenが4ではなく11になることがわかりますか?


var str = "hello.world";
str.length = 4;
var len = str.length;

二行目でプロパティのアクセスが完了しているので

値の変更自体は一時的に生成されたオブジェクトに対して行われ、その変更はオブジェクトとともに失われるので

もともとの文字列の長さが表示されます

ここまで解説して、題名であるラッパーオブジェクトとはなにかというと

基本型がプロパティ参照した際に生成される一時的なオブジェクトのことです

追記:実はnew演算子を用いて無理やりラッパーオブジェクトを生成できますがあまりオススメしません

なぜなら===で比較したときに基本型と一致しないからです