Netscape社が自社のブラウザで動作するLiveScriptを開発
↓
Sunと提携したこともあり、JavaScriptと改名する
↓
JavaScript誕生
Microsoftが真似てJScriptを開発
↓
お前ら紛らわしいから統一しる!
↓
情報通信の標準化団体ECMA(エクマ/イーシーエムエー)が標準化を図る目的でECMAScript(ECMA-262)と呼ばれる規格を発表
↓
現在の最新バージョンは3
注意:
ECMAScriptとJavaScript、及びJScriptは相変わらず別物は別物です。
なので
ブラウザの違いによる動作の違いに注意
基本はPHPと同じ
<?php<script type="text/javascript"> PHPのコードJavaScriptのコード ?></script>
異なるパターン
javascript:"JavaScriptのコード"
イベント時やBookmarkletを書くときなど。
外部ファイルを読み込む場合
<script type="text/javascript" src="file.js">
</script>
中身に何も無くても閉じタグが必要
<script type="text/javascript"> a = 1; </script>
変数の頭に$はつけない。
<script type="text/javascript"> a = 1 + 2; alert(a); //3が出力される b = "1" + "2"; alert(b); //12が出力される </script>
JavaScriptには
文字列結合演算子(PHPの.(ドット))は無く
数値加算演算と同じものを使用する。
//数値+数値以外は文字として扱われる
alert( 1 + 2 ); //数値 + 数値 : 数値演算
alert( "1" + 2 ); //数字 + 数値 : 文字演算
alert( 1 + "2" ); //数値 + 数字 : 文字演算
alert( "1" + "2" ); //数字 + 数字 : 文字演算
//数字を数値にするにはparseInt()を使用する
a = parseInt("1");
b = parseInt("2");
alert(a + b); //3が出力される
でも...
<script type="text/javascript"> alert( "1" - "2" ); // 引き算 -1 alert( "1" * "2" ); // 掛け算 2 alert( "1" / "2" ); // 割り算 0.5 alert( "1" % "2" ); // 余り 1 </script>
加算以外はPHPっぽく処理してくれます
<script type="text/javascript">
function hoge(){
var a = 10;
}
a = 5;
hoge();
alert(a); //?105が出力される
</script>
PHPとは違い、通常は関数内でもグローバル変数
→varをつけるとそのスコープ内でのみ有効な変数となる
<?php $hoge = new Hoge(); ↑インスタンス echo $hoge->hogehoge; ↑プロパティ $hoge->hogehoge(); ↑メソッド ?>
オブジェクトの関係は"->"(アロー演算子)で表す
<script type="text/javascript"> hoge = new Hoge(); ↑インスタンス(繰り返すけど変数に$はつけない) alert( hoge.hogehoge ); ↑プロパティ hoge.hogehoge(); ↑メソッド </script>
オブジェクトの関係は"."(ドット)で表す
<script type="text/javascript"> //Stringオブジェクトのインスタンス生成 str = new String("abcde"); //lengthプロパティ(文字数)を出力 alert(str.length);//5が出力される </script>
インスタンスだからプロパティが使える...と思うだろ?
<script type="text/javascript"> //文字列を変数に代入 var str = "abcde"; //lengthプロパティ(文字数)を出力 alert(str.length);//5が出力される </script>
実はただの変数でも使えるし
<script type="text/javascript">
//lengthプロパティ(文字数)を出力
alert("abcde".length);//5が出力される
</script>
そもそも、ただのリテラル(文字列)でも使える
<script type="text/javascript"> //Stringオブジェクトのインスタンス生成 str = new String("abcde"); //そのまま出力 alert(str);//abcdeが出力される </script>
逆にalertとすると
そのままの文字列が出力される
<script type="text/javascript">
var var_str = "abcde";
var obj_str = new String("abcde");
//等しい
if(var_str == obj_str){
alert("trueです");
}
</script>
っていうか、JavaScript的にも等しかったりする
リテラルとインスタンスって同じもの?
違うよ。全然違うよ。
var var_str = "abcde";
var obj_str = new String("abcde");
//typeof:変数の型を調べる関数
alert( typeof(var_str) ); //string
alert( typeof(obj_str) ); //object
あくまでリテラルはリテラルで、オブジェクトはオブジェクト
var var_str = "abcde";
var obj_str = new String("abcde");
//適当なプロパティに代入
var_str.hoge = "hoge";
obj_str.hoge = "hoge";
alert(var_str.hoge);//undefined
alert(obj_str.hoge);//hoge
オブジェクトはプロパティを持つけど、変数(リテラル)は不可
つまり自動で型変換をしているってこと!
//基本形
var arr = new Array();
arr[0] = "foo";
arr[1] = "bar";
arr[2] = "hoge";
alert( arr[0] ); //fooが出力される
var arr = new Array();
arr[10] = "foo";
//添え字の一番大きい値+1が出力される
alert( arr.length ); //11が出力される
alert( arr[0] ); //undefinedが出力される
alert( arr[20] ); //undefinedが出力される
lengthプロパティは「要素数」ではないので注意
var arr arr[0] = "foo"; alert( arr[0] ); //何も出力されない
ただの変数を配列のように扱うことは出来ない
var arr = ["foo", "bar", "hoge"]; alert( arr[0] ); //fooが出力される
Stringに文字列リテラルがあったように、
Arrayにも配列リテラルがある
//[]、カンマで区切ると配列リテラルとなる var arr = ["foo", "bar", "hoge"]; alert( arr.length );//3が出力される //ちなみにStringの例のような書き方も出来る alert( ["foo", "bar", "hoge"].length ); //3 alert( ["foo", "bar", "hoge"][0] ); //foo
newを使わなくても配列を作成できます
[]、カンマで区切ると配列リテラルとなる
var arr = ["foo", "bar", "hoge"];
alert( typeof(arr) ); //object
arr.hoge = "hoge";
alert( arr.hoge ); //hogeが出力される
文字列の場合と異なり
配列の場合はオブジェクト扱いになります。
配列には「Stringに対する文字列」が無いし、しょうがないよね。。。
var obj = new Object(); obj["a"] = "aaa"; obj["b"] = "bbb"; alert(obj["a"]);//aaaが出力される
連想配列とか言ってますけど...
var obj = new Object(); obj["a"] = "aaa"; obj["b"] = "bbb"; alert(obj.a);//aaaが出力される
JavaScriptの場合、連想配列というのはオブジェクトのことです
var obj = new Object(); obj.a = "aaa"; obj.b = "bbb"; alert(obj["a"]);//aaaが出力される
ただ、違いはあります
var obj = new Object(); obj["a"] = "aaa"; obj["b"] = "bbb"; var b = "a"; alert(obj[b]);//aaaが出力される alert(obj.b); //bbbが出力される
連想配列の場合は変数でアクセスが出来る
var obj = new String("hoge");
obj["a"] = "aaa";
obj["b"] = "bbb";
var b = "a";
alert(obj[b]);//aaaが出力される
alert(obj.b); //bbbが出力される
Objectだけが出来るわけではなく、
オブジェクトなら何でもいけます
var obj = {a:"aaa", b:"bbb",};
alert( arr.a ); //aaaが出力される
alert( arr["a"] ); //aaaが出力される
ObjectにもObjectリテラルがある
var func = new Function("arg1", "alert(arg1);"); // ↑引数 ↑処理本体 func("hoge");
↓こう書いているのと見た目は一緒
function func(arg1){ alert(arg1); } func("hoge");
//関数定義 function hoge(){ alert("hoge!"); } var hoge = "hoge"; hoge();//?
関数hogeは文字列リテラルによって
上書きされているので、何も実行されない
//関数定義 function hoge(){ alert("hoge!"); } var func_var = hoge; func_var();//hoge!
func_varにhogeと同一参照先を指定するので、func_varを関数として実行するとhogeと同じ処理が実行される
var func_hoge = alert;
func_hoge("hogehoge!");//hogehoge!
func_hogeにalertの処理と同じ参照先を指定することにより、func_hogeがalertと同じ処理を実行出来るようになる
var func_var = function(){alert("hoge!");};
func_var();//hoge!と出力される
先程と同様、関数にも関数リテラルがある
//普通に関数宣言 function func(){ } //関数を呼ぶときにnewをつけるだけ var obj = new func(); //プロパティ追加 obj.prop = "hoge"; //出力 alert(obj.prop);
JavaScriptでは関数と(PHPにおける)クラスの違いはありません
//thisを使う function func(arg){ this.prop = arg; } //関数を呼ぶときにnewをつける var obj = new func("hoge"); //出力 alert(obj.prop);
プライベート変数の扱いは基本的にはPHPと同じ
//関数と変数は同じなので function func(arg){ this.prop = arg; this.meth = function(){alert(this.prop);}; } //関数を呼ぶときにnewをつける var obj = new func("hoge"); //出力 obj.meth();
変数と関数が同じものだと理解できれば納得です
//{}と:と,を使う var obj = { //ここで定義したものはオブジェクト固有の値になるので //thisは不要 prop : "hoge", meth : function(){alert(this.prop);} } //出力 obj.meth();
あくまでオブジェクト(インスタンス)用のリテラルであることに注意