連載
» 2016年10月03日 05時00分 UPDATE

JavaScript標準ライブラリの使い方超入門(2):JavaScriptで文字列を扱うStringの基本 (1/4)

JavaScriptの標準仕様としてビルトインされている主なオブジェクトの使い方を紹介する連載。今回は、文字列を扱うStringについて。長さ取得のlength、位置取得のindexOf、切り出しのsubstring、substr、slice、分割のsplitなどの基本を解説。

[金城俊哉,著]

連載目次

書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍『JavaScript Web開発パーフェクトマスター(2015年6月27日発行)』からの抜粋です。

ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。


 Stringオブジェクトは、文字列を扱うためのオブジェクトです。文字列型はJavaScriptの基本データ型なのでオブジェクトではありませんが、これをオブジェクトとして扱えるようにするのが、ビルトインとして組み込まれているStringオブジェクトです。このような基本データ型をオブジェクトとして扱えるようにするオブジェクトのことを「ラッパーオブジェクト」と呼びます。

 Stringオブジェクトのプロパティやメソッドを使うことで、「文字列の中の一部を取り出す」とか「文字列の長さを調べる」のような操作が行えます。

Stringオブジェクト

Navigator

「今さらですが、文字列を変数に代入するコードを書いてみてください」


Driver

「じゃ、変数strに『こんにちは』を代入してみますね」


、変数strに『こんにちは』を代入するコード
Navigator

「このstrという変数には'こんにちは'の文字列が格納されます。文字列型(string型)は基本型に属するので、数値型や真偽型と同じ扱いです。で、これをStiringオブジェクトとして扱えるようにすれば、Stringオブジェクトのメソッドやプロパティが使えるようになります。文字列型の値からStringオブジェクトのインスタンスを生成するには、次のようにnew演算子を使ってインスタンス化します」


冗長な書き方
Navigator

「『冗長な書き方』としたのは、通常であればこのような書き方はしないためです」


Driver

「通常であれば、とはどういうことです?」


Navigator

「実は『文字列型のデータはStringオブジェクトのプロパティやメソッドを利用するときに自動的にStringオブジェクトとして扱われる』のです。ですので、Stringオブジェクトのメソッドを使いたくなっても、いちいち『Stiringオブジェクトにしなきゃ』と考えなくてもいいんです」


Driver

「じゃあ、文字列を格納した変数であれば、自由にStringオブジェクトのメソッドやプロパティを呼び出せるというわけですね」


Navigator

「まさにそうなのです。これについては、さらに詳しく見ていきましょう」


Stringオブジェクトによるラップ(包み込み)

Navigator

JavaScriptでは、String型などの基本データ型の値をラッパーオブジェクトのプロパティやメソッドで操作しようとすると、基本データ型を『一時的にオブジェクトとして扱える』状態にします


Driver

「そんなこと自動でやってくれるんですか?」


Navigator

「オブジェクトを操作するときは『変数名.プロパティ名/メソッド名』のように『.』で区切って記述しますよね。このとき、変数に文字列型の値が格納されていると、それを自動的にStringオブジェクトにする(包み込む)のです。例えば、文字列の長さを返すlengthプロパティの場合は『文字列を格納した変数名.length』と書けば、この変数は新たに生成されたStringオブジェクトを参照するようになります」


Driver

「じゃあ、そのあとは変数が参照するのは、ずーっとStringのインスタンスということですね」


Navigator

「いえ、これは一時的なもので、処理が済めば変数はもとの文字列型に戻ります。『文字列型をStringオブジェクトとして操作するときは文字列型をオブジェクトに変換することを考える必要はない』とした理由は、このような仕組みがあるからです」


文字列型→Stringオブジェクトの変換は、必要に応じで自動で行われる。

Onepoint

メソッドやプロパティの前に付ける「.」はメンバー参照演算子、あるいはたんにドット演算子と呼びます。


newでStringオブジェクトをインスタンス化したときはどうなるの?

Driver

「ところで、new演算子でインスタンス化したら、最初からStringのインスタンスが生成されるんですよね?」


Navigator

「new演算子でStringオブジェクトをインスタンス化した場合は、もちろん文字列型ではなくStringオブジェクトになります」


変数には文字列がStringオブジェクトとして格納される
Driver

「あれ? 変数にはインスタンスの参照が格納されるんじゃないのですか?」


Navigator

「通常のインスタンス化の場合とは異なり、変数strにインスタンスの参照情報が格納されるのではありません。インスタンス化を行うと、『メモリ上にオブジェクトのインスタンスを生成』→『参照変数にインスタンスの参照(メモリアドレス)を格納』という流れになりますが、ラッパーオブジェクトの場合は直接、変数にインスタンスが格納されたときと同じ動作をします。ですので、ラッパーオブジェクト(のインスタンス)を格納した変数は、構造的に基本データ型の変数と何ら変わらないのです


Driver

「それじゃあオブジェクトとはいえ参照型ではないことになりますね。インスタンスを参照しているわけではないので」


Navigator

「確かにそういうことになりますね。Stringなどのラッパーオブジェクトは、基本データ型を『一時的にオブジェクトに見立てる』ためのものですから、本来の参照型のデータ構造とは異なります。通常、オブジェクトから生成したインスタンスは、その参照情報を変数に格納しますので、この変数を別の変数に代入した場合は、インスタンスの参照がコピーされることになります。ということは、どちらの変数も同じインスタンスを参照することになるので、変数名は違っても中身は同じという状態です。ですが、ラッパーオブジェクトの場合は、変数にインスタンスが格納されている扱いになりますので、変数を別の変数にコピーした場合は、インスタンス(値)そのものがコピーされます。それぞれの変数の中身はまったく別のもの、というわけです」


Driver

「オブジェクトとして扱えるようにはしても、データそのものの構造的というか仕組み的には、基本型と同じなのですね」


Navigator

「そういうことです。JavaScriptでは『ラッパーオブジェクトを使わなきゃ』ということを意識しなくても済むようにしているんですね。このようなことから、あえてnew演算子でラッパーオブジェクトをインスタンス化する意味はないのです


「ラッパーオブジェクトは自動でインスタンス化されるので、あえてnewを使う必要はないんです。」「何も意識しなくても、自動で用意されるってわけですね。」
Driver

「データそのものはStringオブジェクトではあるものの、実際の中身は基本データ型の文字列型と同じだということですね」


Navigator

「これは基本データ型を扱うすべてのラッパーオブジェクトにいえることなので、ぜひとも覚えておいてください」


Memo Stringオブジェクトのプロパティとメソッド

Stringオブジェクトには、次のようなプロパティとメソッドがあります。

Stringオブジェクトのプロパティ
プロパティ 説明
length 文字列を長さ(文字数)を扱う

Stirngオブジェクトのメソッド
メソッド 説明
charAt(n) 文字列の中からn+1(nに1を加えた)番目の文字を返す。
charCodeAt(n) 文字列の中からn+1(nに1を加えた)番目の文字コード(Unicode)を返す。
concat(str) 文字列の末尾に文字列(str)を連結する。
indexOf
(substr[,start])
文字列の先頭、または先頭より(strt+整数)文字目以降から文字列substrを検索して、その位置(0から始まるインデックス)を返す。
lastIndexOf
(substr[,start])
文字列の末尾、または末尾より(strt+整数)文字目の前方から文字列substrを検索して、その位置(0から始まるインデックス)を返す。
match(regex) 正規表現のパターン(regex)で文字列を検索し、これに一致した文字列を配列として返す。
replace
(regex, str)
正規表現のパターン(regex)で文字列を検索し、これに一致した文字列を文字列strに置き換える。
search(reg) 正規表現のパターン(regex)で文字列を検索し、これに一致した文字列の最初の文字位置のオフセットを示す数値を返す。
slice
(start[,end])
開始位置startからendの位置までの文字列を取り出す。endを省略した場合は、文字列の最後までを取り出す。
split
(str[,limit])
文字列を区切り文字として指定したstrで切り分け、結果を文字配列として返す。上限の分割数limitを指定した場合は、上限を超えたぶんは無視される。
substr
(start[,length])
開始位置startから長さlengthのぶんだけ文字列を取り出す。lengthを省略した場合は、開始位置startから最後の文字までを取り出す。
substring
(start[,end])
開始位置startから終了位置endまでの文字列を取り出す。endを省略した場合は、最後の文字までを取り出す。
toLowerCase() すべての英字を小文字に変換した文字列を返す。
toString メソッドStringオブジェクトが保持している文字列を返す。
toUpperCase() すべての英字を大文字に変換した文字列を返す。
trim() 文字列の両端のスペース(半角、全角、タブ)を取り除く。
valueOf Stringオブジェクトが保持している文字列を返す。返す値はtoString()メソッドと同等の値。
※[ ]は省略が可能なことを示しています。

オフセット あるデータの位置を、基準点からの差(距離)で表した値のこと。必要なデータの位置を基準点からの差(距離)で表すのに用いられる。


       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。