JavaScript

『hoge.disabled = "false"; 』は trueだった...?!

衝撃の事実でした

javascript 猛勉強中のみーたです。こんばんは。
寒いですね。凍え死にそう。

それで表題の件。

~~~
あ…ありのまま 今 起こった事を話すぜ!!
「おれは false を指定していたと思ったら true を返されていた」
な…何を言っているのかわからねーと思うが、おれも何をされたのかわからなかった…
頭がどうにかなりそうだった… ウトウトしてたから見間違えたとかそんなチャチなもんじゃあ断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…
~~~

そう

hoge.disabled = "false";

って true だったんですよ!!!!! びっくり。

何が起こってるのか

■ .disabled について

言わずと知れた オブジェクト(hoge)で指定した要素のdisabled属性の値を取得、もしくは、設定するプロパティ。
ここで重要なのが disabledプロパティはブーリアン型ということです。
そのため通常設定する値は、boolean型の「true」か「false」になります。

■ "false"を設定したじゃないか!!

となると思うのですが、よーーーーく見直してください。

hoge.disabled = "false";

false ではなく"false"なのです。
文字列なのです!!!!!

JavaScript では文字列型を boolean型に代入しようとすると暗黙的な型変換というのが起こります。
参考:暗黙的な型変換

すると、1文字以上の文字列は内容に関わらずtrue に、0文字の文字列(空文字)とnullfalse に変換されます。

これにはjs初心者びっくり( •̀ㅁ•́;)

この話を踏まえて問題です!

hoge1.disabled = " ";

hoge2.disabled = "";

どちらがtrueでしょう??
答え:(この下の文章を反転させてみてください)
hoge1 がtrue。(空白は1文字の文字列判定になる)

(2つ問題用意してたんですが答えが間違っていたようなので2問目は削除しました。すみません。ご指摘ありがとうございました。)

いかがでしたでしょうか。
『jsは一番柔軟で一番扱いにくい言語』って誰かが言ってたのを思い出しました。
動けばいい という考え方はせずにキレイなコードが書けるようになりたいです。