PHPStormでJavaScriptのコードを書いていて
var name = new String("hoge");
みたいなコードを書いたら
Primitive type object wrapper used
Checks for improper usage of wrappers for JavaScript primitive types. Also, warning will be produced when property of primitive type is modified, as assigned value will be lost.
という警告が表示された。で、
var name = String("hoge");
と new を消したら警告も消えた。
new String() と String() で何が違うのかわからなかったので調べた。
#new String()
new String("hoge") は "hoge" という値を持ったStringクラスのオブジェクトを生成して返す。
#String()
String("hoge") はStringクラスのオブジェクトではなく、プリミティブデータ型の文字列の値を返す。
#プリミティブデータ型の文字列とオブジェクトの文字列
- プリミティブデータ型の文字列に対してそのラッパークラスがある。
- プリミティブデータ型の文字列は不変。例えば "hoge".substr(1, 2) は値を変更しているのではなく、元の文字列から新しい文字列を作っている。
- プリミティブ型のStringに対してメソッドを呼ぶと、プリミティブ型のStringはラッパークラスのオブジェクトの自動的に変換される。
- メソッドによっては文字の並びは同じでも型がプリミティブ型がラッパークラスかで結果が異なるものがある。eval()とか。
- 文字列を作るとき、あえてStringクラスのオブジェクトを使う理由はなさそう。