JScriptの紹介(1)

/ JScript

JScriptとは?

Microsoftが提供するスクリプト言語で、ECMAScriptというくくりの一種。同じくくりに有名なJavascriptがあって言語仕様としてはほぼ互換性があるらしい。言語仕様以外の部分はそれぞれ実行されるシチュエーションが変わってくるので多分違うだろう。

Microsoft製なのでWindowsならば特に何もしなくても拡張子.jsのテキストファイルをダブルクリックすることで動かせる。逆に言えば、Windowsで特に何もせず.jsテキストファイル作ってダブルクリックして動いているのはJavascriptではなくJScript。Javascript動かすならNode.jsとか使うらしい。

なぜJScript?

端的にいってバッチファイルの代替として使いやすい。既に化石となりつつあるWindowsのバッチファイルは.batを拡張子とする一種のシェルスクリプト。Linuxでいう.shファイル。

バッチファイル、使いにくい。スクリプトといえる代物ではないよね。マニアックなところまで調べれば実はいろいろできるのかもしれないけど、調べて出てこないしね。出ても分かりにくい。

あとはJScriptはExcelとかをいじれるVBScriptのバインディング(のようなもの)が用意されていてExcelとかExcelとかExcelとかをいじれるのが良い。Microsoft製なのでPythonとかからxlsxファイルいじるよりもいい感じ、罫線とかその他Pythonではいじれなそうな所がいじれるのが良い。PowerShell?知らね。

JScriptの実行

方法1

既にいった通り、適当なテキストエディタで.jsの拡張子のファイルを編集して保存、その後ダブルクリックするだけ。特に何もしていないならデフォルトで関連付けられているWindows Based Script Hostによってファイルが開かれて実行される。

方法2

コマンドラインからcscriptを実行します。例えばscript.jsにコードを保存したとして、

cscript /nologo script.js

で実行できる。/nologoオプションは鬱陶しいロゴを消せる。そのままコマンドラインに出力できるのでデバックの際に便利。

使いません

他には、Microsoft系のブラウザやその他対応しているブラウザならhtml内の<script>タグから実行できる。このとき、属性でtype="text/JScript"を指定する。IE系ブラウザでしか動かないのにだれが使うでしょうか。使いません。

JScriptの基礎

ここからJScriptの言語仕様の基礎を紹介します。サンプルはまとめて最後に示します。基本的にMSDNのまとめ、自分用。

JScriptのコメント、ブロック

C++/Javaなどと同じです。

  • 1行コメントは//、複数行コメントは/* */です。複数行コメントのネストはサポートされてない。

  • ブロックは中括弧{}を使います。Pythonのようなインデントではありません。

  • ホワイトスペースは無視されます。インデントはコードの見た目をよくするためだけに使われます。

  • 必ずステートメントの最後にはセミコロン;がいります。同じ行に複数のステートメントを記述できます。

JScriptの変数

JScriptは型制限の緩い言語なので宣言の際にC++のような型はいりません。

  • varキーワードを使ってC++と同じように宣言できます。変数名として使用できる単語の規則も同じです。予約語はダメ、普通はエディタがハイライトするのでわかります。
  • 変数名の大文字小文字は区別されます。VBScriptユーザにとっては気になるかもしれませんがこれは普通です。
  • 宣言と同時に値を代入する場合はvarキーワードは省略することが出来るのでPythonなどと同じように書けます。
  • 値を代入せずに宣言した変数の値はundefinedです。undefinedは他の言語には出てきませんがnullと似たようなものです。
JScriptの演算

一般的な演算子は全て使えます。そのあたりは特に説明はいらないでしょう。

  • +で文字列の結合できます。異なる型の変数を+で結合できます。基本的にオペランドに文字列があれば文字列に変換され、ブーリアンと数値の演算では数値に変換されます。
  • 算術演算子は単項マイナス演算子-、インクリメント++、デクリメント--、乗算*、除算/、剰余%、加算+、減算-、使えます。
  • 論理演算子は否定!、小なり<、大なり>、小なりイコール<=、大なりイコール>=、等しい==、等しくない!=、AND&&、OR||、3項演算子?:、使えます。
  • ビット演算子もあります。C言語と同じです。使い時はあまり思いつきません。符号なし右シフト>>>なるビット演算子があります。
  • 例によって=は等号ではなく代入演算子です。+=などもあります。
  • deletetypeofvoidinstanceofnewinがあります。注意点として、voidは型ではなく常にundefinedを返す演算子です。使い時は謎。
JScriptの条件分岐、ループ

基本的にはC++に近いです。ほとんどストレスフリーで書けます。このあたりがバッチファイルと格段に違う。

  • if/elseによる条件分岐、forループ、whileはC/C++と同じです。たぶん一切違いありません。
  • for-each使えます。オブジェクト、配列などに対して使えます。あとswitchも一応あります。
JScriptの関数

こちらはPythonに近いです。Pythonとは違い宣言時のキーワードがdefではなくfunctionです。他は基本的に似ていて、仮引数には型情報いりません、宣言時に戻り値の型もいりません。詳しくはサンプルサンプル!

mainという関数はありません。自由に作るのは構いませんが。このあたりもCよりもPythonなどのスクリプト寄りで、基本的にコードの上から実行されます。functionは読み飛ばされるのでどこに書いてもいいです。プロトタイプ宣言なんてものはいりません。

ここまでのサンプル

上記内容をなるべく全て含んだサンプルを作ろうとしたが無理だった。動かすのはcscript推奨。ダブルクリックするとメッセージボックスが出まくるので。

コード
var x = 10;
var y = 20;
out = x*y + "," + (x+y) + "," + x/y + "," + x%y;
WScript.Echo(out)

var empty;
var string = "20";
if(y == string) {
  WScript.Echo("y == string : " + (y == string));
}
if(y === string) {
  // not executed
} else {
  WScript.Echo("y === string : " + (y === string));
}
if(empty == undefined) {
  WScript.Echo("test == undefined : " + (test == undefined));
}

for(i=0; i<5; i++) {
  x += 1;
  y += sum(x,y);
}
WScript.Echo(x,y);

function sum(x,y) {
  return x+y;
}

結構書きやすいのではないでしょうか。==はオブジェクトの型が違ってもいい感じに変換して比較してくれます。===は型も同じでないとtrue返しません。

実行結果
200,30,0.5,10
y == string : true
y === string : false
test == undefined : true
15 1007