JavaScriptで文字列を扱う「String」の基本:JavaScript標準ライブラリの使い方超入門(2)(1/4 ページ)
JavaScriptの標準仕様としてビルトインされている主なオブジェクトの使い方を紹介する連載。今回は、文字列を扱うStringについて。長さ取得のlength、位置取得のindexOf、切り出しのsubstring、substr、slice、分割のsplitなどの基本を解説。
書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍『JavaScript Web開発パーフェクトマスター(2015年6月27日発行)』からの抜粋です。
ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
Stringオブジェクトは、文字列を扱うためのオブジェクトです。文字列型はJavaScriptの基本データ型なのでオブジェクトではありませんが、これをオブジェクトとして扱えるようにするのが、ビルトインとして組み込まれているStringオブジェクトです。このような基本データ型をオブジェクトとして扱えるようにするオブジェクトのことを「ラッパーオブジェクト」と呼びます。
Stringオブジェクトのプロパティやメソッドを使うことで、「文字列の中の一部を取り出す」とか「文字列の長さを調べる」のような操作が行えます。
Stringオブジェクト
「今さらですが、文字列を変数に代入するコードを書いてみてください」
「じゃ、変数strに『こんにちは』を代入してみますね」
「このstrという変数には'こんにちは'の文字列が格納されます。文字列型(string型)は基本型に属するので、数値型や真偽型と同じ扱いです。で、これをStiringオブジェクトとして扱えるようにすれば、Stringオブジェクトのメソッドやプロパティが使えるようになります。文字列型の値からStringオブジェクトのインスタンスを生成するには、次のようにnew演算子を使ってインスタンス化します」
「『冗長な書き方』としたのは、通常であればこのような書き方はしないためです」
「通常であれば、とはどういうことです?」
「実は『文字列型のデータはStringオブジェクトのプロパティやメソッドを利用するときに自動的にStringオブジェクトとして扱われる』のです。ですので、Stringオブジェクトのメソッドを使いたくなっても、いちいち『Stiringオブジェクトにしなきゃ』と考えなくてもいいんです」
「じゃあ、文字列を格納した変数であれば、自由にStringオブジェクトのメソッドやプロパティを呼び出せるというわけですね」
「まさにそうなのです。これについては、さらに詳しく見ていきましょう」
Stringオブジェクトによるラップ(包み込み)
「JavaScriptでは、String型などの基本データ型の値をラッパーオブジェクトのプロパティやメソッドで操作しようとすると、基本データ型を『一時的にオブジェクトとして扱える』状態にします」
「そんなこと自動でやってくれるんですか?」
「オブジェクトを操作するときは『変数名.プロパティ名/メソッド名』のように『.』で区切って記述しますよね。このとき、変数に文字列型の値が格納されていると、それを自動的にStringオブジェクトにする(包み込む)のです。例えば、文字列の長さを返すlengthプロパティの場合は『文字列を格納した変数名.length』と書けば、この変数は新たに生成されたStringオブジェクトを参照するようになります」
「じゃあ、そのあとは変数が参照するのは、ずーっとStringのインスタンスということですね」
「いえ、これは一時的なもので、処理が済めば変数はもとの文字列型に戻ります。『文字列型をStringオブジェクトとして操作するときは文字列型をオブジェクトに変換することを考える必要はない』とした理由は、このような仕組みがあるからです」
Onepoint
メソッドやプロパティの前に付ける「.」はメンバー参照演算子、あるいはたんにドット演算子と呼びます。
newでStringオブジェクトをインスタンス化したときはどうなるの?
「ところで、new演算子でインスタンス化したら、最初からStringのインスタンスが生成されるんですよね?」
「new演算子でStringオブジェクトをインスタンス化した場合は、もちろん文字列型ではなくStringオブジェクトになります」
「あれ? 変数にはインスタンスの参照が格納されるんじゃないのですか?」
「通常のインスタンス化の場合とは異なり、変数strにインスタンスの参照情報が格納されるのではありません。インスタンス化を行うと、『メモリ上にオブジェクトのインスタンスを生成』→『参照変数にインスタンスの参照(メモリアドレス)を格納』という流れになりますが、ラッパーオブジェクトの場合は直接、変数にインスタンスが格納されたときと同じ動作をします。ですので、ラッパーオブジェクト(のインスタンス)を格納した変数は、構造的に基本データ型の変数と何ら変わらないのです」
「それじゃあオブジェクトとはいえ参照型ではないことになりますね。インスタンスを参照しているわけではないので」
「確かにそういうことになりますね。Stringなどのラッパーオブジェクトは、基本データ型を『一時的にオブジェクトに見立てる』ためのものですから、本来の参照型のデータ構造とは異なります。通常、オブジェクトから生成したインスタンスは、その参照情報を変数に格納しますので、この変数を別の変数に代入した場合は、インスタンスの参照がコピーされることになります。ということは、どちらの変数も同じインスタンスを参照することになるので、変数名は違っても中身は同じという状態です。ですが、ラッパーオブジェクトの場合は、変数にインスタンスが格納されている扱いになりますので、変数を別の変数にコピーした場合は、インスタンス(値)そのものがコピーされます。それぞれの変数の中身はまったく別のもの、というわけです」
「オブジェクトとして扱えるようにはしても、データそのものの構造的というか仕組み的には、基本型と同じなのですね」
「そういうことです。JavaScriptでは『ラッパーオブジェクトを使わなきゃ』ということを意識しなくても済むようにしているんですね。このようなことから、あえてnew演算子でラッパーオブジェクトをインスタンス化する意味はないのです」
「データそのものはStringオブジェクトではあるものの、実際の中身は基本データ型の文字列型と同じだということですね」
「これは基本データ型を扱うすべてのラッパーオブジェクトにいえることなので、ぜひとも覚えておいてください」
Memo Stringオブジェクトのプロパティとメソッド
Stringオブジェクトには、次のようなプロパティとメソッドがあります。
プロパティ | 説明 | |
---|---|---|
length | 文字列を長さ(文字数)を扱う |
メソッド | 説明 | |
---|---|---|
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()メソッドと同等の値。 | |
※[ ]は省略が可能なことを示しています。 |
*オフセット あるデータの位置を、基準点からの差(距離)で表した値のこと。必要なデータの位置を基準点からの差(距離)で表すのに用いられる。
関連記事
- JavaScriptプログラミングをdocument.writeやalertで始める際の基礎知識をパーフェクトに解説する
初めてJavaScriptのWebアプリを作ってみたいという人に向けて「Hello World!」などの文字列を表示する方法について解説する。 - JavaScriptを中心としたWebアプリ開発の栄枯盛衰まとめ――LiveScriptからAngularJS/React.jsまで
@ITが誕生した2000年頃はJavaScriptが不遇だった時代。そこから現在のような人気のプログラミング言語になるまでには、どのような歴史があったのか。15周年を迎えた@ITの豊富なWeb開発関連記事とともに振り返る。 - ようこそJavaScriptの世界へ
JavaScriptで本格的なプログラミングの世界に触れてみよう。連載を通じて実用的なアプリケーションを作れるようになるはず!?(編集部)
Copyright © ITmedia, Inc. All Rights Reserved.