読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

voidの真の意味

Javascript


よく、クリックしても何もしないリンクを表示するのに

<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"が表示されるというわけ。


…うーむ、大いに誤解を招きそうだなこりゃ。