よく、クリックしても何もしないリンクを表示するのに
<a href="javascript:void(0);">ほげほげー</a>
とかやるじゃないですか。で、このvoidの意味はなんなんだ、と。
パッと見は関数呼び出しに見えるので、ずっとそうだと思っていたのですが。
先程、それは違うということを知りました。
voidは単項演算子だ
そう。Javascriptにおけるキーワード"void"は単項演算子なのです。
つまり "!" とか "typeof" とかそういうヤツらと同類だったのです。
で、その役目は「与えられた式を評価し、undefinedを返す」というもの。
だから、
<a href="javascript:void(0);">ほげほげー</a> <a href="javascript:(void 0);">ほげほげー</a> ←ちなみに、こう書いても同じ意味
は
<a href="javascript:undefined;">ほげほげー</a>
と同じ。
…(゚Д゚)ハァ?
こんなもん、いったいなんの役に立つのさ。
…と思ったのですが、ぴーんと来た。
そうか、これはhrefの値に入れるワンライナーJavascriptのための演算子なんじゃないか?
だから、
<a href="javascript:void(alert(1), alert(2));">ほげほげー</a>
などと書ける、というわけだ。
まあ、最近のブラウザは
<a href="javascript:alert(1); alert(2);">ほげほげー</a>
とか書いてもちゃんと動作するわけだけど、
古いブラウザたちにはかつて、void演算子を使わなければならないような、
やんごとなき事情があったんだろう。たぶん。違ってたらごめんなさい。
あと、昔は"undefined"キーワードが使えないブラウザもあったらしく、そういう場合にundefined値(正確には『値』じゃないが)を取得するのに
(void 0) // 別に0ではなく任意の式で良い
とするのが常套句だった時代もあったらしい。
というわけで
現代に生きる我々としては、void演算子を使う必要はほぼ皆無だと思うわけですが、
まあ『void(0); って何なのさ?』という疑問が解決しただけでもよかったヨカッタ。
ところで
Javascriptって、
([expr], [expr], ...)
という式があるんだね。今日まで知らんかった。
これは、カンマで区切られたそれぞれの式を順次評価し、
最後の式の値を式全体の評価結果とする式。要するにLispのprognと同じです。
だから、
alert(1, 2);
の結果は"1"が表示されるけど、
alert((1, 2));
の結果は"2"が表示されるというわけ。
…うーむ、大いに誤解を招きそうだなこりゃ。