写真 旅 ブログ 開発室
HOME開発室[JavaScript] 値が文字列かどうか判定する方法
キーワード
JavaScript

[JavaScript] 値が文字列かどうか判定する方法

[JavaScript] 値が文字列かどうか判定する方法

変数の中身が文字列かどうか判定したい

結論から言えば以下のような方法で判定することができる。

JavaScript
function IsString(value) { return typeof value === "string" || value instanceof String; } console.log("\"リテラル文字列\" : " + IsString("リテラル文字列")); console.log("new String(\"文字列\") : " + IsString(new String("文字列"))); console.log("123 : " + IsString(123)); console.log("true : " + IsString(true)); console.log("null : " + IsString(null)); console.log("undefined : " + IsString(undefined));
"リテラル文字列" : true new String("文字列") : true 123 : false true : false null : false undefined : false

このようにその変数のtypeofが"string"であるか、あるいはその変数に対してinstanceof Stringがtrueを返すか、いずれかを満たせば文字列であると判別できる。

JavaScriptの文字列には2種類ある

上記のように少々回りくどい方法をとる必要があるのはJavaScriptにおける文字列の内部表現が関係している。

JavaScriptでは文字列を扱う方法として次の2種類の方法がある。

JavaScript
let primitiveString = "プリミティブ文字列"; let objectString = new String("オブジェクト文字列");

ざっくり言えば、プリミティブな値とはメソッドやプロパティを持たない純粋なデータのこと。 対してオブジェクトはそのデータを扱うためのプロパティやメソッドを持っているもの。 これらはソースコード上でほぼ同じものとして扱うことができるが、厳密には区別されている。

JavaScript
let primitiveString = "プリミティブ文字列"; let objectString = new String("オブジェクト文字列"); console.log("typeof primitiveString: " + (typeof primitiveString)); console.log("typeof objectString: " + (typeof objectString)); console.log("primitiveString instanceof String: " + (primitiveString instanceof String)); console.log("objectString instanceof String: " + (objectString instanceof String));
typeof primitiveString: string typeof objectString: object primitiveString instanceof String: false objectString instanceof String: true

このようにtypeofやinstanceof Stringを使用するとその違いが見えてくる。

しかし実際はプリミティブ型の文字列に対して以下のように直接メソッドを呼び出すことができる。

JavaScript
console.log("0123456789".substr(2, 4));
2345

これはプリミティブ型の値に対してメソッドの呼び出しが記述された場合、実行時に自動的にString型のオブジェクトを生成してそこからメソッドを呼び出しているからだ。 しかし文法上同じように扱えるのは内部的にそう処理してくれているからであって、実際にはプリミティブ型のデータとオブジェクト型のデータは異なる状態で存在している。 そのためtypeofやinstanceofの結果は異なるものになる。

その他のプリミティブ型

このことは文字列だけではなく、他のプリミティブ型に対しても同様となる。 プリミティブな数値に対するNumberやBigInt、真偽値であればBooleanといったように、プリミティブな値にはそれに対応するラッパークラスが用意されている。

詳しくは以下のページに詳しく書かれているので参照されたい。

まとめ

普段あまり意識しないことだが、プリミティブ型とそれに対応するラッパークラスの関係はしっかり理解しておかないと気付きにくいバグを生む場合がある。 JavaScriptは時々「変数に型が無い」といった言われ方をされるが、意識しづらいだけで厳密に型が存在する。 値の比較や変換で自動的にあれこれやってくれるからといって、それに依存せずきちんとデータのあり方を意識していく必要があるだろう。

キーワード
JavaScript
シェアする
サイトマップ SITEMAP 広告 写真 PHOTO
年度
2024 2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス 中央アルプス 丹沢 離島 巨樹
写真の一覧へ
ストックフォトで作品を探す
旅 JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 旅 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ
広告
サイトマップ SITEMAP
スタジオ旅路
https://tabiji.gallery
渡邊 佑
tabiji.gallery (c) 2020 Yu Watanabe サイトマップ SITEMAP 写真 PHOTO
年度
2024 2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス 中央アルプス 丹沢 離島 巨樹
写真の一覧へ
ストックフォトで作品を探す
旅 JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 旅 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ