JavaScriptとRubyの文法対比表を作りました。
類義語
JavaScript | Ruby |
オブジェクト | ハッシュ |
文字列 | シンボル |
プロパティ | 属性 |
対比表
項目 | JavaScript | Ruby |
ソース文字コード | Unicode(UCS-2/UTF-16) | ソースコードの先頭もしくはshebang行の次に以下のように定義。 # -*- coding: utf-8 -*- |
文の区切り | ; | ;または改行 |
改行コード | ;を挿入して文となる場合自動的に挿入 | 文が終端 |
コメント | //, /* */ | # |
識別子 | Unicode, _, $のいずれかで始まる | 先頭文字[アルファベット, _, @, @@, $]で何の名前か区別。 先頭文字の後は大文字小文字のアルファベット, _,数字 |
予約語 | (*1) | (*2) |
値型 | 数値,文字列,論理値,null,undefined | なし |
参照型 | オブジェクト,配列 | 変数に代入できるものすべて |
基本型(リテラルを持つもの) | 値型と同じ | 数値,文字列,配列,ハッシュ,範囲,シンボル,正規表現 |
論理値 | true/false | falseとnilが偽、それ以外真 falseとnilはFalseClassとNilClassの特異インスタンス |
その他のデータ型 | 関数 | なし |
整数リテラル | -2^53から2^53までは正確。それ以上は精度が落ちる | OS固有のサイズのFixnumと無限サイズのBignumどちらかに自動変換 |
文字列 | ’または"で囲む | ’または"で囲む。%で始まる自由区切り文字入力あり |
'で括られた文字列 | エスケープシークエンスのほか、"のエスケープが必要 | \と'だけエスケープ。他はエスケープ不可 |
"で括られた文字列 | エスケープシークエンスのほか、'のエスケープが必要 | エスケーブシーケンスとその他変換あり |
エスケープシークエンス | \0,\b,\t,\n,\v,\f,\r,\",\',\\ | \b,\t,\n,\v,\f,\r,\",\',\\,\e,\s |
文字 | 一文字の文字列 | 一文字の文字列。Ruby1.8では整数 |
アスキー文字の整数値 | "a".charCodeAt(0) | ?a |
文字列の文字への参照 | s.charAt(i) | s[i] |
数値から文字列へ | n+"", String(n), n.toString() | n.to_s |
文字列から数値へ | "21*"1", s - 0, Number(s) | s.to_i, s.to_f |
範囲オブジェクト | 組み込みなし | 式1 .. 式2, 式1 ... 式2。Rangeオブジェクト |
関数定義 | function square(x){return x*x;} square=function(x){return x*x;} Functionコンストラクタで生成 |
なし。メソッドかコードブロックかProcオブジェクト |
メソッド | 関数をオブジェクトのプロパティに代入 | クラス宣言内で def 関数名 本体 end |
プロパティの参照 | image.width image['width'] |
クラスにアクセッサメソッドを用意 慣例としてimage.width,image['width'] |
オブジェクトの生成 | var o = new Object(); | o = Object.new |
連想配列リテラル | オブジェクトリテラル{x:2.3, y:-1.2} | ハッシュリテラル{:x =>2.3, :y => -1.2} |
自動型変換 | 論理文脈ではnull以外true。文字列文脈では文字列に。あと色々。 | なし |
配列の生成 | var a = new Array(); | a = Array.new |
配列リテラル | [1,2, "JavaScript", true, {x:1, y:3}] | [1,2, "JavaScript", true, {:x=>1, :y=>3}] |
配列の要素へのアクセス | a[0] | a[0] |
正規表現 | Perlと同じ | Perlと同じ |
文字列に変換 | toString() | to_s |
ラッパーオブジェクト | Number, String, Booleanクラス | なし |
値型に変換 | valueOf() | なし |
同値演算子 | === 値型は値が等しいか否か、参照型は同一オブジェクトの参照か否か |
equal? |
等値演算子 | == 基本型に変換して変換結果の値が等しいか否か |
== Objectクラスの==は「値」(Hashのキー)が同じか否か。サブクラスが適宜オーバーライドする |
文字列 | イミュータブル | ミュータブル。 イミュータブルな文字列はシンボル |
変数宣言 | var i;, 宣言しないとグローバル変数 | なし。名前で区別 |
グローバル変数 | グローバルオブジェクトのプロパティ | $で始まる名前 |
ローカル変数 | Callオブジェクトのプロパティ | 小文字で始まる名前 |
ローカル変数スコープ | 関数レベル。宣言位置に無関係 | 最初の代入があった最も内側のブロック。代入位置に無関係 |
クラス変数 | コンストラクタ関数のプロパティ | @@で始まる名前 |
定数 | なし | 大文字で始まる名前 |
グローバルオブジェクト | クライアントサイドJavaScriptではWindowオブジェクト。ウィンドウやフレーム毎に存在。 | オブジェクトmain(Objectクラスのインスタンス) |
if文 | if (論理式) 文 [else 文] | if 論理式 [:/then/改行]文 [elseif 論理式[:/then/改行]文] [else 文] end unless/else/endも類似 |
switch文 | switch(式) {case 式: 文[break;]...default:} | case 式 when 式[:/then/改行] 文 ... [else 文] end case when 論理式[:/then/改行] 文 ... [else 文] end |
while文 | while (論理式) 文 | while 論理式 [:/do/改行] 文 end until/do/endも類似 |
do/while文 | do 文 while (論理式) | 文 while 式 文 until 式 |
for文 | for (初期化;条件;増分)文 | なし |
for/in文 | for (変数 in オブジェクト) | for 変数 in 式 [:/do/改行] 文 end .eachイタレータも参照 |
ラベル文 | 名前: | なし |
break文 | break [ラベル]; | break |
continue文 | continue [ラベル]; | next |
retry文 | なし | retry |
function文 | function func_name (x) {} | def func_name (x) end |
return文 | return | return, メソッドの最後の式の値 |
throw文 | thow | Kernel.raise |
例外処理 | try/catch/finally | begin/rescue/ensure |
with文 | with文は最適化が難しくなる | なし |
プロパティの削除 | delete book.chapter2; | なし |
連想配列 | オブジェクト | ハッシュ |
Objectのプロパティ | constructor, toString(), toLocaleString(), valueOf(), hasOwnProperty(),propertyIsEnumerable(),isPrototype() | ==,===,=~,__id__,__send___,class, clone,display,dub,eql?,equal?,extend, freeze,frozen?,hash,initialize_copy,inspect, instance_eval,instance_of?instance_variable_get,instance_variable_set,instance_variables,is_a?, kind_of?,method,method_missing,methods,nil?,object_id, private_methods,protected_methods,public_methods,respond_to?,send,singleton_methods, taint,tainted?,to_a,to_s,untaint |
配列のインデックス | 0から2^32-2までの整数。それ以外は文字列に変換してプロパティ | 制限なし |
配列要素の削除 | shift(), pop(), splice() | clear,compact!,delete,,delete_at,delete_if,slice!,uniq! |
配列の長さ | lengthプロパティ | lengthメソッド |
関数リテラル | function () {} | コードブロック |
可変長引数 | arguments | name引数 |
---|---|---|
引数に名前を付けるには | 名前のプロパティを持つオブジェクトを渡すようにする | なし |
メソッド内でのコンテキストオブジェクトの参照 | this | self |
new | a = new Object(); | a = Object.new |
関数宣言の引数の数 | 関数のlengthプロパティ | なし |
クラス | なし。new演算子とコンストラクタ関数でシミュレート | クラス宣言で定義 |
すべての関数はprototypeプロパティを持つ | なし | |
スーパークラス | コンストラクタチェーンとコンストラクタ関数のprototypeプロパティが参照するオブジェクトの生成 | クラス宣言で指定 |
関数をメソッドに | apply(), call() | なし |
インスタンス変数 | プロパティ | @で始まる名前 |
インスタンス変数へのアクセス | object.property | アクセッサメソッドを定義 |
スタティック変数 | 関数のプロパティ クロージャを使って実装 |
プライベートのインスタンス変数 |
継承 | コンストラクタ関数のプロトタイプオブジェクトのプロパティはすべての「インスタンス」で利用可能 | スーパークラス |
コンテキストオブジェクト | thisはプロトタイプオブジェクトの関数プロパティがコンテキストのオブジェクトを参照する方法 | self |
プライベートメンバー | クロージャで作る。面倒 | private宣言 |
ミックスイン | インスタンスプロパティを直接使わないメソッドを持つクラスからコピー | include |
オブジェクトクラスの判定 | instanceof | instance_of? |
モジュール | 空のオブジェクトを作り、プロパティを追加する | module モジュール名 本体 end |
初期化ルーチン | なし | BEGINブロック |
後始末ルーチン | なし | ENDブロック |
シェルコマンド | `で囲まれた文字列 | |
文のグループ化 | 複数文を{ }で囲む | 複数文をbegin endで囲む |
オーバーライドしたメソッドのコール | なし | super |
別名 | なし | alias, メソッドの別名を作成すると、コピーしてから参照する |
未定義化 | なし | undef |
クラス定義/拡張 | prototypeプロパティが参照するオブジェクトへのプロパティ追加 | class [スコープ::]クラス名[< superexpr]本体end |
クロージャ | 入れ子関数宣言 | do |x,y,..| end, {|x,y,...| }、メソッドの呼び出しの直後だけ。ブロックはオブジェクトではないが、Procオブジェクトに変換可能 |
JavaScriptの予約語
break | do | if | switch | typeof |
case | else | in | this | var |
catch | false | instanceof | throw | void |
continue | finally | new | true | while |
default | for | null | try | with |
delete | function | return |
Object.prototypeに絶対にプロパティを追加しないこと
Rubyの予約語
__FILE__ | and | def | end | in | or | self | unless |
__LINE__ | begin | defined? | ensure | module | redo | super | until |
BEGIN | break | do | false | next | rescue | then | when |
END | case | else | for | nil | retry | true | while |
alias | class | elsif | if | not | return | undef | yield |
今後の予定
どこが違いかという視点ではなく、同じことをどう表現するかという視点で更新していく予定です。最終的に、動的言語を1つマスタして対比表を手に持っていれば、どの言語でも不自由しないというところに持って行きたいです。
(どの動的言語にも「コンパイル」できる統一言語という野望。それがCoffeeScript?)