JavaScript勉強中
高木です。おはようございます。
先日の勉強会で北本がJavaScriptの勉強を始めることになりました。
私が常々主張しているのは、「お前はやれ、自分はやらない」というのはよくないということで、杉山と私もJavaScriptを勉強することにしました。
実は何を隠そう、この歳になるまでJavaScriptをまともに勉強したことはありませんでした。
JavaScriptは結構サンプルもいろんなところにあって、まともに勉強していなくてもそれらをコピペするだけでどうにかなってしまいます。
私がWebが嫌いなこともJavaScriptにこれまでまともに取り組まなかった原因のひとつでした。
本格的にJavaScriptを勉強するわけですから、いきなり外部のライブラリやフレームワークを使ってどうこうではなく、基本的な言語仕様から手を付けます。
そうなると、PHPのときもそうであったように、いろいろ細かなことが気になり出します。
ところで、私がJavaScriptを勉強するにあたり使用している動作環境はnode.jsです。
Webは意地でもやらんという感じですが、実際にはコマンドラインのほうが扱いが簡単だからです。
たとえば、プログラミング言語の勉強を始めるときにはお決まりのHello, World!も、node.jsであれば次のように書くだけで済みます。
1 | console.log("Hello, World!"); |
あるいは、
1 | process.stdout.write("Hello, World!\n"); |
でもよさそうです。
実行は簡単で、コマンドラインから
1 | $ node hello.js |
とするだけです($はプロンプトです)。
さて、最初に気になった細かい点ですが、ゼロ除算の挙動でした。
私は謙虚にも『JavaScriptの絵本』からスタートしましたので、あまり細かいことは書かれていません。
それでもゼロ除算については書かれていました。
JavaScriptのnumber型が内部的にはIEEEの倍精度浮動小数点数を使っていることは知っていました。
だから、ゼロ除算の挙動は予想できるものでしたが、ゼロ除算の結果が無限大になるというのは非常に気持ちが悪いのです。
特殊な公理系を除けば、ゼロでは除算できないとするのが一番自然です。
ゼロで割ると無限大になるというのは極限の考え方で、普通の代数ではありません。
まあ、Cなんかでも浮動小数点数のゼロ除算の結果が無限大になることは普通にあるのですが、言語仕様上は未定義の動作ですからね。
無限大を扱うのであれば、無限大÷無限大も気になりますね。
実際に試してみたところ、結果は非数(NaN)でした。
予想はついていましたが。
次に気になったのは、ローカル変数の生存期間です。
C++なんかでは、デストラクタが呼ばれてオブジェクトが解体されるタイミングを知ることは重要です。
Cでもポインタで参照した先がどこまで生きているのかは知っていないといけません。
PHPにもデストラクタがあり、C++同様、オブジェクトが解体されるタイミングが重要になります。
最初、C++のようにブロックから出るときに生存期間を終えると予想していたのに、ローカル変数は関数から抜けるまで生存して驚いた記憶があります。
JavaScriptの場合も、ローカル変数は関数から抜けるまで生存しているようです。
次のようなコードを書いて実験してみました。
1 2 3 4 5 6 7 8 9 | function f() { { var a = 123; } console.log(a); } f(); |
結果は「123」が出力されました。
エラーになるか、「undefined」が出力されることを密かに期待したのですが、そうはいかなかったようです。
ログを出力する前にaをdeleteしても結果は同じでした。
というか、(JavaScriptでいう)オブジェクト以外はdeleteできないんですね。
こんな感じでゴソゴソやっています。
JavaScriptについては、今後もブログのネタとして積極的に取り上げていきたいと思います。