SYNTAX





基本的なこと


JavaScript は statement-set statement 1つ以上の式やキーワード、演算子などから成る 終端には、[ ; ]をつける ie. [;] がステートメントの終わり Sensitive( 大文字, 小文字 のちがいあり)
// ERROR var s = new string; // OK var s = new String;



コメント(Comment)


Comment は評価されないが, Read されるので処理が重くなる ( Interpreter が評価するため )
// comment /* comment */



Function.関数


// 定義する場所は call する前ならばどこでも良い // <head>〜</head> 間 | 外部ファイル function func(hour, min, sec) { var ret = hour * 3600 + min * 60 + sec; return( ret ); } // call ret = func(12, 34, 56);


無名関数


addHandler ( function() { } );



変数(Variable)


DESC JScript の変数のスコープは 3 つ
// 関数定義の中で変数を宣言するとローカル変数 (.) ローカル // クラス定義内なら クラスローカル変数 (.) クラス // それ以外の場所なら グローバル変数 // プログラム内のどこでも値を参照, 変更ができる (.) グローバル
ローカル変数 関数が実行されるたびに生成 関数をぬけると破棄 関数の外部からは、変数にアクセスできません GUIDELINE 同一名は利用しない WARNING C++ のような BlockScope は使えない 関数内の i は同じ
// 3 * 3 = 9 回のループにはならない function foo() { for( var i=0; i<3; i++ ){ WScript.echo( "oya " + i ); // BlockScope はなし if (0) { for( var i=0; i<3; i++ ){ WScript.echo( "kodomo " + i ); } } else { for( var j=0; j<3; j++ ){ WScript.echo( "kodomo " + j ); } } } }
ローカル変数が宣言されている関数の中では "ローカル変数だけ" が見える Local変数は, Global変数をかくす ( "参照可能範囲" という )
// Global 変数 var aNumber = 100; // 変数の宣言は Code の実行前に 処理される function tweak() { // 外の "aNumber" のつもりだが, 関数内の "aNumber" var s = "aNumber is " + aNumber; return s; if (false) { // この宣言は, 外の "aNumber" をかくす( 上書きする ) var aNumber; aNumber = 123; } }
// 先に b というシンボルの宣言を処理するので, ここでは落ちない print (b); // この行まできて, "bbb" が代入 var b = "bbb"; // RET: bbb print( b ); // ------------------------------------------------------ // EEROR // "bは宣言されていません" print (b); // この行まできて, "bbb" が代入 b = "bbb"; // RET: bbb print( b ); // ------------------------------------------------------ print (b); function() { // BlockScope はないので, "b" は Global Scope if (0) { var b = "bbb"; } print ( b ); // ------------------------------------------------------ POINT [.] 宣言 と 代入は別 [.] 宣言されていれば, Symbol がない といわれない [.] 代入されるのは, Code の実行順
変数および定数をすべて検出した後、関数内のコードが実行される ローカル定数の値は、定数の宣言ステートメントが実行されるまで未定義です 関数で変数への代入が実行されるまでは、変数も未定義です JScript では 変数と定数の宣言はすべてコードの実行前に処理される 宣言が条件ブロックや他の構造の内部にあるかどうかは処理には関係なし 変数, 定数をすべて検出した後 関数内のコードが実行される ローカル定数の値は 定数の宣言ステートメントが実行されるまで未定義 また、関数で変数への代入が実行されるまでは、変数も未定義
function isEnvVista() { var ret = 0; var sh = new ActiveXObject("WScript.Shell"); var WshEnvironment = sh.Environment("Process"); // これは 関数内 のみの Scope var val = WshEnvironment.item("HOMEPATH"); if ( val.search(/Documents and Settings/) >= 0 ) { WScript.echo ( "env is XP" ); } else { WScript.echo ( "env is VISTA" ); ret = 1; } return ret; } print( isEnvVista() ); // val は宣言されてません ( Runtime Error ) print( val );



Include


DESC Include という構文がないため eval() で代用する eval は引数に渡された文字列を Interpreter で Code として評価する WARNING eval で評価する 文字列( code ) では file 操作が禁止になる file 操作の関数は module にしないこと TIP 変数は File 単位でとじる C, C++ のように File をまたいで共有することはない main 側で module にあたるファイルを Include( Eval )する
// 共通の module を Include( Eval )する eval( new ActiveXObject("Scripting.FileSystemObject").OpenTextFile("d:/common.js", 1).ReadAll() );



演算子


SYNTAX !exp DESC 式の論理否定
//var b = true; var b = false; print( !d ); if ( !d ) { print("true"); } // undefined はだめ d=0;
// increment, decrement var i = 0; // 後置 i ++; // 前置 ++ i;



cast(キャスト)


明示的にキャストするには 型の識別子の後に式をかく
// string var s = String( 123 ); // number var n = Number( "123" );
文字列と 数値の比較 OK
if ( 10 == "10" ) { WScript.echo("aaa"); }



Bit(ビット演算)


var n = 8; if ( n & 1 ) { WScript.echo( "flag ON" ); } else { WScript.echo( "flag OFF" ); }



type(typeof)


SYNTAX typeof( exp ) DESC 型情報を文字列で返す "number"、"string"、"boolean"、"object"、"function"、"date"、"undefined"、"unknown"
// string var y = "Hello"; // object var z = new Array(); // 未初期化の変数は "undefined" がかえる if ( typeof ( gObj ) == "undefined" ) { print( "not init" ); gObj = {}; // object print( typeof( gObj ) ); } // Array は object { var a = ["aaa"]; print( typeof( a ) ); }



object


DESC すべての Object の基本型
// in 演算子 if ( "prop" in obj ) { } // 文字列をかえす string Object::toString(); // Function 型 Object "foo" function foo() { WScript.echo("foo"); } WScript.echo( foo.toString() );
toString() をすると val の配列が返る
a = ["a", "b", "c" ]; // a,b,c a.toString();



null


DESC Object がないことをあらわす Object


undefined


DESC
//var x = 10; // 未定義 | 未初期化の変数を調べる // if ( typeof( x ) == "undefined" ) { print("undefined"); } else { print("defined"); }