[G] Googleガジェットを作ってみる-02
Googleガジェットは、手軽にJavaScriptの動作検証をするのにも便利です。

向学の為、お気に入りのBlogを探索していると、ヲゾゾさんの記事に、JavaScriptの Booleanオブジェクト に関する不可思議な内容が紹介されていました。
var b = new Boolean(false);
if(b) alert(b);
とすると、falseと書かれたアラートが表示されるというものです。
つまり、真偽値を管理しているBooleanオブジェクトをif条件としてそのまま評価すると、中身がtrueでもfalseでも関係なく常に 真 として評価されてしまうというものです。

私はBooleanオブジェクトを使ったことがなかったのでバグ?・・・と一瞬思いましたが、ヲゾゾさんの記事でもさらっと流されているので、不具合ではなく仕様なんだろうと思い直してしばし考えてみると・・
『!』、JavaScriptでも条件式の中ではオブジェクトをちゃんとオブジェクトとして扱うんだ・・という感動めいた不思議感覚を覚えました。

こちらの説明がわかりやすいと思うのですが、『あなたが自分で valueOf メソッドを実行する必要はほとんどなく、プリミティブな値が期待される場面にオブジェクトが出くわしたとき JavaScript が自動的に実行します。』とあります。

試しに、Googleガジェットで検証してみました。

Googleガジェットエディタを開き、『Hello, world!』と書かれている部分を削除して、問題のJavaScriptを記述します。
完成コードは下記のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example" />
<Content type="html"><![CDATA[
<script>
var b = new Boolean(false);
if (b) {alert(b)}
</script>
]]></Content>
</Module>

早速実行(=「Preview」タブをクリック)してみると・・

確かに Boolean(false)なオブジェクト b は、条件式 if (b) で真と判断されてアラートが出てきます。
つまり、このオブジェクトが存在することは確認しているけど、中身を評価はしていないということなんだと思います。

試しに、条件式を if (b.valueOf()) にしてみると
if (b.valueOf()) {alert(b)}
「Preview」タブをクリックして実行しても何も表示されません。更に念のためにtrue値を保持するBooleanオブジェクトを作成して試すと
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="hello world example" />
<Content type="html"><![CDATA[
<script>
var b = new Boolean(true);
if (b) {alert(b.valueOf())}
</script>
]]></Content>
</Module>
アラートが表示されます。
条件式の中ではプリミティブ型とオブジェクト型を分けて正確に扱いたいプログラマ心への配慮なんでしょうかね。普段は自動で valueOf() が実行されてしまうのでややこしいですね。。
Booleanオブジェクトを使うという発想がなければなかなか気づかないのかも。

脱線しましたが、Googleガジェットエディタを使うと簡単にJavaScriptの動作検証ができるので重宝します!

Comment

管理人にのみ表示する


Track Back
TB*URL

Copyright © Ubuntuといっしょ. all rights reserved.
無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て