0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[JavaScript]undifinedをStringオブジェクトの引数に入れたら文字列undifinedに変換されてしまった話

Posted at

undifinedをStringオブジェクトの引数に入れたら文字列undifinedに変換され、意図しない処理が入ってしまってびっくりしたので、投稿。
JavaScript初心者なので、間違い指摘はコメントください。

結論としては、「undifinedかどうか判断してから文字列変換しよう」です。
 undifinedかどうか判断は、typeof a === "undefined"で比較などで対応しよう。
 (undefinedは、typeof演算子をかけると文字列"undefined"に変換されるため)

実際、どのようにundifinedが文字列に変換されるか見てみましょう。

let a;
console.log(a + ":" + typeof a); // undefined:undefined

let b = String(a);
console.log(b + ":" + typeof b); // 'undefined:string'

let c = a.toString(); // Uncaught TypeError: Cannot read property 'toString' of undefined
// console.log(c + ":" + typeof c); 

let d = a + "";
console.log(d + ":" + typeof d); // 'undefined:string'

let e = a.valueOf(); // Uncaught TypeError: Cannot read property 'valueOf' of undefined
// console.log(e + ":" + typeof e); 

toStringやvalueOfは例外が生じます。
Stringやobj+""は文字列"undefined"に変換されます。

私の場合、Stringオブジェクトで変換していたため例外が生じず、気づくのが遅れてしまいました。

ただし、Stringオブジェクトは、「toStringでプリミティブ値が返されなければvalueOfを呼び、その値を文字列に変換する」というプロセスとなっているため、文字列変換において安定して使えるようです。
toStringやvalueOf、obj+""では、必ず文字列変換されるという保証がないとのことです。
詳しくは、下記のリンク先を読もう。(現在、勉強中・・・)

obj+""≠obj.toString()≠String(obj)っていう話 - Qiita より

toStringはJavaのように文字列の連結に暗黙的に使用されるメソッドではない。
obj+""はまずobj.valueOf()を呼び、obj.toString()を呼ばないことがある(がしかし、実は一つだけ例外がある)。
String(obj)は間違いなく obj.toString() を呼ぶ。

valueOfとtoStringメソッドの水深43cmぐらいの深さの話 - 三等兵

オブジェクトを文字列に変換するならtoStringで、数値ならvalueOfという傾向がある。(valueOfの場合正確には基本型に変換すると表現するのが正しい)
toStringのみでオブジェクトを変換するときはvalueOfに一切触れずに行う。逆にvalueOfのみで変換するときは、文字列のときはtoStringを通じて変換する。ただし、toStringが使えないようならそのままvalueOfで返す。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?