■ 基本的なこと
  JavaScript は statement-set
    statement
      1つ以上の式やキーワード、演算子などから成る
      終端には、[ ; ]をつける ie. [;] がステートメントの終わり
    Sensitive( 大文字, 小文字 のちがいあり)
  
    // ERROR
    var s = new string;
    // OK
    var s = new String;
■ コメント(Comment)
    Comment は評価されないが, Read されるので処理が重くなる
    ( Interpreter が評価するため )
■ 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 );
          } 
        }
      } 
    }
    // Global 変数
    var aNumber = 100;
    // 変数の宣言は Code の実行前に 処理される
    function tweak() 
    {
      // 外の "aNumber" のつもりだが, 関数内の "aNumber"
      var s = "aNumber is " + aNumber;
      return s;
      if (false)  {
        // この宣言は, 外の "aNumber" をかくす( 上書きする )
        var aNumber;      
        aNumber = 123;    
      }
    }
  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" );
  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() );
    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");
   }