前提・実現したいこと
JavaScript プリミティブ型 (基本データ型)というサイトを読んでいます。
発生している問題・エラーメッセージ
上のサイトの「ラッパーオブジェクトのインスタンスと論理値」セクションには次のようなコードがありました。
js
1alert(new Boolean(new Boolean(false))); 2alert(new Boolean(Boolean(false)));
上下ソースの動きはこのようになると考えていました。
上のソース
new Boolean(false)
が評価
⇒false
のラッパーオブジェクトがかえる
0. new Boolean(new Boolean(false))
が評価
⇒手順1のラッパーオブジェクトはfalse
を持っているが、このオブジェクト自体は空じゃないのでtrue
と評価される
A. 出力はtrue
になる
下のソース
Boolean(false)
が評価
⇒false
がプリミティブ値としてかえる
0. new Boolean(Boolean(false))
が評価
⇒new Boolean(Boolean(false))
はfalse
を持っているラッパーオブジェクトになるので、true
と評価される
A. 出力はtrue
になる
しかし, 実際に下のソースをFirefox最新版のコンソールで実行したら、false
が出力されました。
該当のソースコード
下の動きがわからない。
js
1alert(new Boolean(new Boolean(false))); 2alert(new Boolean(Boolean(false)));
試したこと
まず、下のソースを段階的に観察するために, 各時点での値をコンソールで出力してみました
Boolean(false)
⇒false
ここは考えたとおり、プリミティブな真偽値が返ってきています
new Boolean(false)
⇒Boolean { false }
(ラッパーオブジェクト)
ここも考えたとおり、false
を持っているラッパーオブジェクトが返ってきています
!!new Boolean(Boolean(false))
⇒true
でも、ここでfalse
が・・・。と思いきや、true
が返ってきてしまいました。
Boolean(new Boolean(Boolean(false)))
⇒true
何かの手違いだと思い、Boolean
関数で真偽値に変換すると、やはりfalse
が・・・。
と思いきや、ここでもtrue
が返りました。
これらの結果の最後2つをみていただくと、new Boolean(Boolean(false))
をNOT
論理演算子で真偽値に変換したものと, Boolean関数
で真偽値に変換したもの, どっちもtrue
となっているので、alert(new Boolean(Boolean(false)));
の結果はtrue
でないとおかしいと感じます。
これはalert()
が特殊な型変換をしている(?)のだと考えましたが、どのようなことをしているんでしょうか?
ご回答よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/16 09:13 編集
2019/02/16 09:30
2019/02/16 10:22
2019/02/16 10:41