【執筆中】ティラノスクリプトというかjavascriptの変数の話
ここで書いていること
javascriptの変数について、基礎の基礎
配列について
多次元配列について
オブジェクト(連想配列)について
配列を格納する
関数について
ティラノスクリプトの一時変数(tf.xxx)、ゲーム変数(f.xxx)、システム変数(sf.xxx)
はじめに
ティラノスクリプトはjavascriptによって記述されています。
[iscript]〜[endscript]で記述するのもjavascriptだし、[if]タグなどのexpパラメータ内の式もjavascriptの式です。condもそうですね。
ティラノスクリプトの仕様はだいたいjavascriptの仕様と切っても切り離せない関係にあります。
タグの書き方がわからない!という疑問以外は、まずは「わからないこと javascript」で検索すると幸せになれるかもよ
はじめに、のその次に
まずはリンク先を熟読しましょう
リンク先の内容がだいたい理解できた方は、この記事を読まなくとも問題ありません。あなたにはMDNがついている。
わからなかった方向けに、この記事ではjavascriptの変数について簡単に説明していきます。
文字だらけで読む気がなくなったという方は、残念ながらこの記事も文字だらけなのです…
まずはそもそも
javascriptとJavaは違うものです。
他は理解できなくてもこのことだけは覚えてください。
Javaがなんなのかは理解しなくて構いません。
これからするのはjavascriptの話です。
そのことを頭に入れてからこの先を読んでください。
←左端にグレーの帯が付いた文章(この文とかね)は、余談です。
最初は読み飛ばしてしまって構いません。
あとで気が向いたときにでも読んでください。
javascriptの変数とは
プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。
数学で言うx=0とかy=10とかと一緒です。
xやyにもっとわかりやすい名前を付けてやったものです。
javascriptでは、この変数にどんなものでも入れられます。
さらに、ある変数に一度入れたものと全く違うものを入れることもできます。
たとえば:
変数nandemoを用意する(変数を定義する、と言います)
変数nandemoに数値100を入れる(変数に代入する、と言います)
その後、変数nandemoに文字列"なんでも"を代入する
現在、変数nandemoに入っている値はなんでしょうか。
答えは、文字列"なんでも"です。
最初に代入した数値100は、あとから代入した文字列"なんでも"に上書きされて消えました。
javascriptはゆるふわな言語なので、最初に数値を入れて、そのあと文字列で上書きする、ということができますが、もうちょっと厳しい言語だと、最初に数値を入れる変数と決めたものには数値しか入れられません。
変数に代入できる値
さて、javascriptの変数にはなんでも入れられると言いました。
では具体的にどんなものが入れられるのでしょうか。
以下に挙げてみます。
数値
文字列
true/false
null
undefined
配列
オブジェクト
関数
とりあえず使いそうなのはこんなところ
数値、文字列
これらについては、説明するまでもないと思います。
0,1,2,3…や"abc"、"あいうえお"などですね。
ちなみに、数値であっても""(ダブルクォーテーション)や''(シングルクォーテーション)で囲ってしまうとjavascript的には文字列という扱いになってしまうので注意が必要です。
true/false
true/falseは、少し詳しい人ならわかると思いますが、真偽値と言われる値です。
その名のとおり、真か偽かを表すものです。
真偽値には、trueまたはfalse以外の値はありません。必ずこのどちらかになります。
こちらもまた、trueまたはfalseであっても""(ダブルクォーテーション)や''(シングルクォーテーション)で囲ってしまうとjavascript的には文字列という扱いになってしまいます。
が、ティラノスクリプトで使う分にはそこまで気にしなくてもかまいません。
null、undefined
nullは空
undefinedは未定義
という意味で、javascriptの中では特別な値です。
null、undefinedという名前の変数を定義することはできません。
このふたつの違いについては、今のところは特に意識することはありません。
配列
配列は、[](半角ブラケット)で囲まれた値です。
イメージとしては、ひとつの箱をいくつかに区切ったものです。
[](半角ブラケット)で箱を作り、,(半角カンマ)で区切って部屋(要素といいます)を作ります。
たとえば、このように定義します。
code:sample.js
この場合、nandemoという箱を作り、,で区切り、0番目の要素(配列の要素は0、1、2…と数えます)に0、1番目の要素に1、2番目の要素に2がそれぞれ格納されています。
配列のそれぞれの要素の中を見たり、値を書き換えたりする場合は、nandemo[0]、nandemo[1]と書きます。
それぞれ、nandemoの0番目の要素、1番目の要素、という意味です。
配列の要素の追加、削除
さて、先ほどの例は、最初に配列の中身を全て定義してあげる方法でした。
しかし、はじめから配列の中身が全て決まっている場合は少ないと思います。
最初は何も入っていない配列を用意しておいて、処理をしていく中で要素を追加していく、ということをしたくなりますよね。
そういう場合は、このように書きます。
code:sample.js
nandemo = []
…
なんらかの処理
…
nandemo.push("abc")
まず1行目で、nandemoに[]を代入します。これでnandemoは配列ですよ、と定義したことになります。
最後の行のnandemo.push("abc")というのが肝です。
これは、nandemoのいちばんうしろに新しい要素を作って、その要素に文字列abcを入れる、という意味です。
pushは、配列でさえあれば、どんな配列にも使える命令(メソッドといいます)です。
つまり、このような使い方ができます。
code:sample.js
nandemo.push("abc")
この処理を行ったあとのnandemoの中身はどうなっているでしょうか。
正解は、[0, 1, 2, "abc"]です。
それぞれの部屋に0、1、2が入っている配列の最後に、新しく部屋を作って"abc"を入れたので、このようになるわけです。
この例のとおり、ひとつの配列の中には、部屋さえ違えば数値と文字列が同居していてもいいのです。(javascriptでは)
部屋の追加ができたら、今度は削除もしたくなりますね。
その場合は、このように書きます。
code:sample.js
nandemo.pop()
popメソッドは、配列のいちばんうしろの要素を削除する、という命令です。
上記の例の場合、popメソッド実行後のnandemoの中身は[0, 1]となります。
最後の要素の値だった2が要素ごとなくなるわけです。
ここまで読んで、「いや、最後の要素だけじゃなく途中の要素も削除したいんだけど…」とか「配列の最後に要素を追加じゃなく最初に追加したいんだけど…」とか思った方は、最初に貼ったMDNのリファレンスを読みましょう。
あなたがやりたいことは、ほぼ全て書いてあります。
配列のそれぞれの部屋の中は、変数(nandemoとかですね)と同じ扱いになります。
つまり、どんな値も入れられるということです。
なので、配列の中の要素にさらにまた配列を入れることもできます。
これを多次元配列といいます。
多次元配列
たとえば、このように定義したとします。
code:sample.js
nandemo = []
空の配列nandemoを定義して、そこに配列[0, 1, 2]をpushしていますね。
するとnandemoの中身はどうなるでしょうか。
正解はこうです。
code:sample.js
// nandemoの中身
0, 1, 2
なんだかややこしいことになっていますね。
ややこしいついでにさらに処理を追加します。
code:sample.js
すると、nandemoの中身はこうなります。
code:sample.js
// nandemoの中身
0, 1, 2], [3, 4, 5
まず、nandemoの0番目の要素(=nandemo[0])の中に配列[0, 1, 2]が入っています。
配列[0, 1, 2]の0番目の要素の中身を見るためには、このように書きます。
nandemo[0][0]
nandemoの0番目の要素に入っている配列の、0番目の要素、というわけです。
同じように、たとえば配列[0, 1, 2]の2番目の要素(最後の要素)の中身を見るときは、nandemo[0][2]となります。
この場合は、nandemoの0番目の要素に入っている配列の、2番目の要素、という意味になります。
さて、それでは、数値5が入っているnandemoの要素はどのように指定すればいいでしょうか。
正解は、nandemo[1][2]です。
nandemoの1番目の要素に入っている配列の、2番目の要素、というわけですね。
同じように、[[[0, 1 ,2],[3, 4]]],[5, 6]]]とした場合、4が入っている要素を見るにはnandemo[0][1][1]となりますが、ここまですると見づらいだけなのでこういう使い方はやめたほうが良いです。
オブジェクト(連想配列)
オブジェクトは、{}(半角ブレイス)で囲まれた値です。
イメージとしては配列に近いですが、配列がただの部屋だったのと違って、オブジェクトは名前付きの部屋です。
オブジェクトは、このように定義します。
code:sample.js
nandemo = {
first: "abc",
second: 0,
}
//または
nandemo = {}
nandemo.first = "abc"
nandemo.second = 0
{}(半角ブレイス)で箱を作って、,(半角カンマ)で要素を区切って、:(半角コロン)の左側の文字列で要素(プロパティといいます)の名前(プロパティ名)を指定します。
例文だと、first、second、thirdがそれぞれプロパティ名となります。
プロパティ名は、自分がわかりやすいものならなんでも構いませんが、文字列にしておいた方が配列との混同がなくなって良いです。
文字列でさえあれば、数字を含んでいても大丈夫です。
たとえば、a_0というプロパティ名など。
プロパティ名に数値を指定してもエラーにはならない。が、後述する.でのプロパティ指定ができなくなる。
オブジェクトの各プロパティの値を見たり、書き換えたりする場合は、2通りの書き方があります。
code:sample.js
// または
nandemo.first
注意
[](半角ブラケット)を使ってプロパティ名を指定する場合には""(ダブルクォーテーション)または''(シングルクォーテーション)が必要ですが、.(半角ドット)を使ってプロパティを指定する場合は""または''は付けてはいけません。
ややこしいですが、.のあとには記号は付かないのだと覚えてください。
最初の例文では、オブジェクトのプロパティに文字列、数値、そして配列が定義されていましたね。
nandemo.third内の配列にアクセスするためには、nandemo.third[0]というように書きます。
nandemoの中のプロパティthirdの0番目の要素、というわけです。
また、こういった書き方もできます。
nandemo["third"][0]
これも意味は同じです。
さて、ここでひとつ注意です。
オブジェクトに値を代入する場合、以下のような書き方はエラーになってしまいます。
code:sample.js
nandemo = {}
nandemo.test.dayo = 0
このスクリプトを実行すると、2行目でこのようなエラーが発生します。
code:javascript
Uncaught TypeError: Cannot set property 'dayo' of undefined
エラーメッセージを翻訳すると、「undefinedの中にdayoというプロパティはセットできないよ」となります。
undefinedってなんだよこっちはtestの中のdayoをセットしたいんだよという感じですが、どういうことかというと
最初に変数nandemoをオブジェクトとして定義しました。
次に、nandemoの中のtestの中のdayoプロパティに値を代入しようとします。
ところが、nandemoの中にはtestというプロパティはまだ定義されていません。(定義されていない変数=未定義(undefined)の変数です)
undefinedはオブジェクトではない(undefinedという値)ため、新しくプロパティを作ることはできません。
よって、エラーが発生します。
というわけです。
エラーを起こさないためには、次のように書き換えてあげましょう。
code:sample.js
nandemo = {}
nandemo.test = {}
nandemo.test.dayo = 0
// または
nandemo = {
test: {
dayo: 0
}
}
応用編
ここからは、オブジェクトの応用編です。
ここまでの内容を理解できて、もっと便利に使いたい方は読んでください。
ちょっとまだ理解が追いつかないという方は、いったん読み飛ばしても大丈夫です。
さて、ここまで書いてきたように、オブジェクトの要素を表す書き方は2通りあります。
.を使う方法と、[]を使う方法の2つです。
普段はどちらでも好きな方を使えばいいですが、実はプロパティ名を[]で指定する書き方の場合は、プロパティ名として変数を指定できるのです。
こういうことです。
code:sample.js
nandemo = {
first: 0,
second: "abc"
}
text = "first"
alert(nandemotext) // "abc"が表示される この書き方だといまいち利点がわからないですが、たとえばプロパティ名をtest_0、test_1というふうに、数字の部分がカウントアップしていくものにしたとします。
そして、各プロパティの値を見たり、変更したりする場合は、繰り返し処理の中で以下のようにプロパティを指定します。
code:sample.js
for(i = 0; i < 10; i++){
}
ちょっと難しい書き方かもしれませんが、ひとつひとつみていきましょう。
for文については、ここでは深掘りしません。
簡単に言うと、for(i = 0; i < 10; i++){}という部分では、
変数iに初期値として0を代入し
iを1ずつカウントアップし
iが10未満の値の間
{}の中の処理を行う
ということをしています。
肝心なのは、{}の中、nandemo["test_" + i]の部分です。
まず、nandemoの中身を見ていきましょう。
"test_"という文字列を用意します。
iは、先ほどfor文の説明の中に出てきたものと同じです。
つまり、このiには最初に0が代入されます。
すなわち、"test_" + i = "test_0"です。
なので、nandemo["test_" + i]とは、nandemoのプロパティ名として、"test_0"を指定しますよ、ということになります。
そして、これは繰り返し処理なので、その後test_1、test_2…とプロパティ名の最後の数字がカウントアップされて処理が進んでいきます。
繰り返し処理に限らず、「プロパティ名を変数で指定する」処理はいろいろな場面で応用がききます。余裕があればぜひ覚えておいてください。
関数
関数とは、javascriptで「こういう処理をしてください」という命令のことです。
ティラノスクリプトの一時変数、ゲーム変数、システム変数
これまでに説明してきた変数に格納できる値の内、ティラノスクリプト内で独自に使えるこれらの変数はオブジェクトです。
定義済みのtf、f、sfの各変数に、プロパティとして任意の値を指定できるわけですね。