こんにちは!
なかむぅです。
JSのコードを見ていると、文字列変換でString(x)
を使っている時とx.toString()
を使っているときがあって
って感じだったので調べてみました。
私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪
- 未経験、第二新卒歓迎
- 学歴・転職回数・離職期間不問
- 残業は月15時間以下で残業代は全額支給
- 経験者は月給23万円以上
- 年収100万以上UP↑↑↑も可能
- 長く働いていても年収が全然上がらないから、一気に年収を上げたい
- 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
- やりたいことに挑戦させてもらえないから、自分がしてみたいことに挑戦したい
- 通勤時間が長すぎるから、できるだけ短くしたい
- もっと勉強したいから、書籍代など負担してくれるところに入りたい
- 現場に駆り出されてからは放置プレイで、相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい
上記内容に1つでも当てはまる場合は、ぜひご検討ください。
String(x)とx.toString()の違い
JavaScriptで文字列に変換したい時は、String(x)
とx.toString()
のどちらでも変換することができます。
ではこの2つにはどのような違いがあるのでしょうか。
2つの変換方法の大きな違いはnull
やundefined
のときにエラーになるかならないかです。
たとえば、画面から値を受け取った時に、値が取れずにnull
が入ってきたとしましょう。
すると、そのnull
が入った変数などをString()
で変換すると、文字列の"null"
として扱われてしまいます。
しかし、toString()
とすることで、null
にはtoString
プロパティが存在しないためエラーが起きます。
const str = null;
String(str); // 文字列"null"になる
str.toString(); // エラーが発生
エラーが起これば問題に気づくことができるので、toString()
を使う方が安全ということですね♪
String(x)も結局toString()呼び出してる説
そもそもString()
に引数を渡した時はどのような動作をするのでしょうか。
実は、String()
に引数を渡すとtoString
を呼び出します。
そして、toString
がnull
やundefined
の場合はvalueOf
を呼び出します。
って感じですが、たとえば以下のようなtoString
とvalueOf
、hairOff
というプロパティを持つオブジェクトがあるとしましょう。
const obj = {
toString: () => "hoge",
valueOf: () => "piyo",
hairOff: () => "hage"
};
このオブジェクトobj
をString()
の引数に渡すと次のようなことが起こります。
- 暗黙的に
toString
が呼び出される toString
プロパティがnull
やundefined
のときはvalueOf
が呼び出されるtoString
かつ、valueOf
プロパティがnull
かundefined
の場合、TypeErrorになる
const obj = {
toString: () => "hoge",
valueOf: () => "piyo",
hairOff: () => "hage"
};
// hoge
console.log(String(obj));
obj.toString = null;
// piyo
console.log(String(obj));
obj.valueOf = null;
// TypeError
console.log(String(obj));
toString
の順序が変わってもtoString
が呼び出されるので、上から呼び出されてるわけでもありません。
暗黙的に
ことになります。toString
が呼び出されている
ちなみに、toString
プロパティ自体ががない場合はvalueOf
があるないにかかわらず[object Object]
を返します。
const obj = {
valueOf: () => "piyo",
hairOff: () => "hage"
};
// [object Object]
console.log(String(obj));
結論、x.toString()が安全(まとめ)
String(x)
かx.toString()
なら、x.toString()
のほうがnull
やundefined
が来たときにエラーで気づけて安心という結論にいたりました。
ただ、どちらにしてもnull
やundefined
のチェックは必要かなと思います。
そう考えるとどっちでもいいような気がしますね(笑)
以上、String(x)とx.toString()の違いについてでした!
と思った方はコメントいただけると嬉しいです。
最後までお読みいただきありがとうございました!
私が働く会社では、一緒に働いてくれるエンジニアを募集しています♪
- 未経験、第二新卒歓迎
- 学歴・転職回数・離職期間不問
- 残業は月15時間以下で残業代は全額支給
- 経験者は月給23万円以上
- 年収100万以上UP↑↑↑も可能
- 長く働いていても年収が全然上がらないから、一気に年収を上げたい
- 残業をしたくてしているわけではないので、残業代はしっかりと出して欲しい
- やりたいことに挑戦させてもらえないから、自分がしてみたいことに挑戦したい
- 通勤時間が長すぎるから、できるだけ短くしたい
- もっと勉強したいから、書籍代など負担してくれるところに入りたい
- 現場に駆り出されてからは放置プレイで、相談できる人も先輩も居ないので、自分の状況をちゃんと理解してくれるところで働きたい
上記内容に1つでも当てはまる場合は、ぜひご検討ください。