So-net無料ブログ作成
検索選択

JavaScript ブログトップ

連想配列(と言うのかどうかは知らない)の生成 [JavaScript]

記事公開の順番が前後してしまいました。前回の記事は、こちらの記事で出てきた下記の代入式が何を表しているのかを調べた今日の記事の後に公開する予定でした・・。前回の記事の冒頭は意味が分からないですね。

ちなみに、見ているのは、ここJavascriptのソースの式です。

growboxInset = {x:(window.innerWidth - event.x), y:(window.innerHeight - event.y)};


ここ以下のこの変数を参照している箇所では、次の様になっています。

var x = event.x + growboxInset.x;
var y = event.y + growboxInset.y;


これより、「{}」は構造体(クラス?ハッシュ?)を生成するものと予想しています。構造体と言う概念がJavascriptにあるのかどうか知りませんが・・。

で、ここの説明によると「配列」に当たるようです。文字列をインデックスにできる配列(「連想配列」と言うんですかね?)ですね。そして、インデックスが文字列の場合は、括弧の代わりにピリオドでアクセスできるとのこと。「myArray["name"]」と「myArray.name」は同じものを指すようです。

そのオブジェクトの生成は下記の通り、インラインでもできるとのことです。冒頭に出た例と同じ書き方ですね。

myObject = { name: "Apple Inc.", city: "Cupertino" }


こちらは文末にセミコロンがありませんが、これは任意なんですかね?中括弧になってるんで、そこには必要がないと言うことなんでしょうか・・?まあ、私が書くときは、念のため、入れておくことにしておきます。


と言うことで、予想とはちょっとずれていましたが、冒頭の式は連想配列のオブジェクトの定義でした。

と言う記事を前回の記事の前に公開する予定でした。

*

関係ありませんが、こちらの端末、gccは入ってるみたいです。

0921_netwalker_gcc_exist.png
コンパイラは入ってるらしいです


Javaのコンパイラは入ってないみたいですけどね。OpenOffice.orgが動いているので、Java自体(JRE)は入っていると思いますが・・。

0921_netwalker_java_not_exist.png
Javaにもパスが通ってないんですかね・・



JavaScriptについて [JavaScript]

えらい時間がかかっていますが、Dashboard について、ようやく導入部分の理解が終わった感じがしています。さらに読み進めようとしましたが、そろそろJavaScriptも絡んだ内容が増えてきそうな雰囲気だったので、ひとまず、JavaScriptについて、さらっとは見とこうと思います。JavaScriptについては、以前ちょっとだけ内容を読んだことはあるんですが、コードを書かないので、結局ほとんど頭に残っていない状態です。

なんかいい文書があるかな〜と思って探していましたら、アップルが Mac OS X での開発向けに説明をしてくれている文書がありました。「Introduction to Apple JavaScript Coding Guidelines日本語版)」です。この際なので、これで学習していきたいと思います。ちなみに、日本語版は情報が古そうです。例えば、データ型の説明のところで、型変換のルールが英語版と日本語版で異なっています。たぶん、英語版が最新の動作だと思われるので、こちらを参考にします。(と言うか、JavaScriptの仕様はどこにあるんでしょう??)

ざ〜っと見たところ、この文書ではスクリプトがどこから呼び出されるのか(どこから起動されるのか)が書かれていない様です。Dashcodeを使えば、その辺りは自動で生成されるからと言うことでしょうか? 一応、このサイトが簡潔にまとめられている様なので、ここを参考にしておきます。

JavaScriptは、HTMLソース内の<script>要素内にコードを書く様です。直接HTMLソース内にコードを書くこともできる様ですが、JavaScriptのソースファイル(例えば「test.js」)を外部に持たせる場合は、次の様に読み込む模様です。

<script type="text/javascript" src="test.js"></script>


と言うことで、JavaScript本体の話をザ〜っと流しておきます。


変数と代入

変数の宣言は「var」キーワードを使用して下記の様に行う。宣言を行わないことも可能だが、その場合はグローバル変数になる。また、変数に型は無い。

var foo;
var bar, hoge;


値の代入は例えば、下記の通り。

foo = 5;
hoge = foo;


後者の代入方法は、値がコピーされるのか、同じオブジェクトを指すことになるのかが良くわかりませんね。と言うか、数値はオブジェクトじゃないんですかね・・? 文末のセミコロンは省略可能(でも、なるべく省略するな)とのこと。

初期化していない変数の初期値がわかりませんね。不定値なんでしょうか?また、特に宣言が必要でないとのことなので、スペルミスなどでもエラーは出ないと言うことですね・・。


JavaScriptには下記の5つの基本型(primitive type)があるとのこと。

number数値。整数と浮動小数点数が扱える。
boolean論理値。値は「true」もしくは「false」。
string文字列。
null値なし。
undefinedわからない値。


最後が良くわかりませんね。オブジェクト(構造体とかクラスとか)になるんでしょうか? そういえば、構造体などの型が定義されていませんね。型変換は必要に応じて自由に行われるとのことです。下記の様な感じ。

1var x = 1 + "2";数値1が文字列"1"に変換されて、結果は文字列"12"。
2var x = 1 + parseInt("2", 10);右辺の第2項で文字列"2"を10進数扱いで整数に変換している様です。結果は数値の3。
3 var message = "Hello World";
var firstCharacter = message.charAt(0);
2行めの文で文字列messageがオブジェクト化されて結果は"H"になる(のか?)。


2行目の文で、parseInt()の第2引数は基数を表しているが、省略された場合はCと同じルールで第1引数を解釈し、「0x」で始まる場合は16進数、「0」で始まる場合は8進数、他は10進数と扱うとのこと。

基本型は必要に応じてオブジェクト化されるとのことです。3行目の文では、文字列messageがオブジェクト化されてメンバ関数のcharAt()が実行される様です。現状、charAt()の仕様は知らないです・・。

条件文

Cと同様、条件文の結果に応じて、処理を分岐させる為に使用する。条件文の値はboolean型のtrueとfalse。trueは数値の1が、falseは数値の0が割り当てられているとのこと。条件文で使用される演算子は下記の通り。

==両辺の値が等しい場合にtrueを返す。評価前に異なる型の値を変換する。
===両辺の値が等しく、型も同じであった場合にtrueを返す。
!=両辺の値が等しくない場合にtrueを返す。評価前に異なる型の値を変換する。
!==両辺の値が等しくないか、同じ型でない場合にtrueを返す。
<左辺値が右辺値よりも小さい場合にtrueを返す。
<=左辺値が右辺値以下の場合にtrueを返す。
>左辺値が右辺値よりも大きい場合にtrueを返す。
>=左辺値が右辺値以上の場合にtrueを返す。


ここでは、if文とswitch文が紹介されています。条件文がこれだけなのかはここだけでは、良くわかりません。また、if文にelse ifに相当するものがあるのかどうかはここでは不明です。JavaScriptは大元の資料としてどこを見ればいいのかが良くわかっていないのですが、ここによると「else if」もありますね。それをふまえて、サンプルコードに手を加えると下記の様な感じでしょうか。

if (variable1 == valuable2)
{
    // code to execute when this statement is true
}
else if (variable1 == valuable3)
{
    // code to execute when this statement is true
}
else {
    // code to execute when this statement is false
}


また、switch文については、下記の様なサンプルが示されていました。

switch ( variable ){
    case 1: // code to execute when variable equals 1
            break;
    case 2: // code to execute when variable equals 2
            break;
    default: // code to execute when variable equals something other than the cases
             break;
}


いずれもC言語のの構文に似てますね。


ループ文

ループ文には「while」「do...while」「for」の三つが用意されている様です。いずれもC言語と同様の様なので、さらっと、載っていたサンプルコードを紹介しておきます。

while ( variable == true )
{
     // code to execute while variable is true
}


do
{
    // code to execute while variable is true
}
while ( variable == true );


for ( var i = 0; i < variable; ++i )
{
    // code to execute within this loop
}



関数

関数もまあ大体C言語と同じに見えるんですが、初めて見る形式もありました。また、こちらをちらっと見たところ、かなり複雑なこともできる様ですが、詳しくはおいおい見たくなったら見ることにします。

ここでは、まず通常の形式の例から。

function myFunction ( variableOne, variableTwo )
{
    // code to execute within this function

    return variableOne;
}


要点を列挙します。

  • 「function」で宣言を開始し、続いて関数名(myFunction)、引数(variableOne、variableTwo)と続く。
  • 関数はJavaScriptコードのどこでも宣言、使用が可能。
  • 引数について、基本型は値渡し、オブジェクトは参照渡し。
  • 関数の戻り値は「return」で返す。「retun」を省略した場合は暗黙に「undefined」が返される。


と、ここまでは普通に理解できましたが、次の様な宣言もできる様です。

var myFunctionVariable = function ( variable )
{
    // code to execute within this function
}


function myFunction ( myFunctionVariable )
{
    myFunctionVariable( "aString" );
}


まずは最初の宣言。「myFunctionVariable」と言う変数に関数の定義を代入しています。ここでは、関数に名前は付けられていませんが、こちらによるとつけても問題なさそうです。

で、2つ目の宣言で、最初の宣言で定義した関数を呼び出すのに変数を利用しています。C言語で言えば、関数ポインタの利用でしょうか。呼び出し側で適宜呼び出し先を入れ替えたい時に使うのかもしれませんが、どこまで必要か今は不明です。まあ、C言語でも関数ポインタを使うときがあるので、同じ様な用途かもしくはもっとすばらしい用途が秘められているのかもしれません・・。


その他の特徴

C言語同様の演算子のうち2つがここで挙げられています。これは存在するものの一部とのことなので、他にもある様です。

条件演算子表記は<条件> ? <真の場合の値> : <偽の場合の値>で、C言語と同じ用法とのこと。
コンマ演算子「,」で区切って複数の文を並べることで一つの文と見なす。「,」で区切られた各文は左から順に実行され、右端の値を返す。とのことです。


条件演算子はよく使ってましたが、コンマ演算子の方は深く考えたことが無かったので、なるほどと言う感じですね。


以上、長くなりましたがザ〜っと概要を眺めてみました。続いて、オブジェクト指向の話パフォーマンスとかの話が書かれている様ですが、またそのうち読むことにします。


【参考】
Introduction to Apple JavaScript Coding Guidelines日本語版
Leopard Reference Library: Scripting & Automation JavaScript
Apple Developer Documentation 日本語版
Introduction to WebKit DOM Programming Topics ←役に立つ情報があるらしい。
JavaScript講座 [Smart]
Core JavaScript 1.5 Reference - mozilla

JavaScript ブログトップ
ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。