JavaScriptの書籍を読むと、文字列の定義において以下の2つが同じであるという説明をしている場合があります(入門書だと良く有る説明です)。
case1:
var msg = new String( "hello" ); |
case2:
var msg = "hello"; |
確かに両者ともalert( msg );で、メッセージを出力できるので一見すると同じに見えるのですが、実は一緒では有りません。
両者の違いは、下記のコードを実行してみると分かります。
var msg = new String( "hello" ); msg.lang ="en"; alert( msg.lang ); |
–
var msg = "hello"; msg.lang ="en"; alert( msg.lang ); |
前者は期待通り”en”と出力してくれますが、後者はundefinedと出力されてしまいます。
このことから分かるのは、new String()でオブジェクトとして文字列を生成した場合は、プロパティを保持することが可能ですが、プリミティブ型として作った純粋な文字列リテラル(後者の例)の場合はプロパティを持つことが出来ないということです。
また、後者の例において、「msg.lang =”en”;」の部分では、エラーは出ませんが代入値は無視されます)
通常プログラムを作る場合は、余り気にする必要は無いかもしれませんが、ライブラリを設計する場合に注意が必要となる場合が出て来るため、注意が必要なポイントです。
ちなみに、下記のようにnewを書かずにString()をコールした場合は、プリミティブ型の文字列が返されるため、結果はundefinedになります。
var msg = String( "hello" ); msg.lang ="en"; alert( msg.lang ); |
こちらも見落としやすいポイントなので気をつける必要がありますね。
関連記事
コメントを残す