曖昧だった箇所についての整理。
まず、これは何て出力されるか。
console.log(1 + 0);
正解は、「1」。当然だよね。1も0も数値だから、計算して1になる。
次はこれ。
console.log("iro"+"has");
正解は、「irohas」。ダブルコーテーションで囲われた部分は文字列になる。文字列同士は後ろにくっつく感じになる。
あと、いろはす桃味は美味しい。
となるとこれは?
console.log("1"+"0");
正解は、10。ただし、これは数値ではなく文字列としての10ね。
var a = "1" + "0"; console.log(typeof a);
こうしてみると「string(文字列)」って出力される。(typeofは型が何かを判定するもの)
じゃあこれは当然失敗するよね。
var a = "1" + "0"; //stringの10 if (a < 11) { console.log("成功"); } else { console.log("失敗"); }
結果は「成功」が出力される。あれー?
これはjavascriptの仕様で、違う型での演算ができてしまうというもの。(参考資料)
要するに自動で型変換して比較するらしい。な、何てややこしい・・・。
ってなるとif文の中ではどうなってるのってなる
var a = "1" + "0"; //stringの10 if (a < 11) { console.log(typeof a); }
こうすると「string」と出力される。つまりaの中の10は文字列のまま。
これでわかったことは、比較演算子の計算では自動でオペランドを変換するけど、計算が終わったら元に戻るということ。ふむふむ。わからん。
次の実験。
var a = "1" + "0"; if (a < 11) { a = a + 1; console.log(a); console.log(typeof a); }
要するに「a = “10” + 1;」がどうなるかなんだけど。
これは、「101」「string」と出力される。文字列に数値を足すと、文字列の後ろに数値がくっつく。んで、それは文字列として扱われる。
ってことはこれも同じことになるはず
var a = "1" + "0"; if (a < 11) { a++; console.log(a); console.log(typeof a); }
++は、1を代入してaに1足すやつ。
結果は「11」「number」。えっ。(numberは数値という意味)
どうやらインクリメント演算子とデクリメント演算子は型変換した上で代入し、その型は変換しっぱなしのようだ。ほーん・・・。
ちょっと方向性変えて、これは?
var a = 2 * 3; console.log(a);
アスタリスクは掛け算ね。これは「6」と出力される。わかる。
これは?
var a = 2 * "3"; console.log(a); console.log(typeof a);
これも「6」「number」と出力される。算術演算子の中でも掛け算割り算はインクリメント演算子と同じような感じで型変換されるようだ。
ちなみに「var a = “2” * “3”;」も同じね。ふーん・・・。
またまた方向性を変える。なんか、jsのtrueは1、falseは0的な意味があると聞いた。まずこれ。
var a = true; console.log(a); console.log(typeof a);
これは「true」「boolean」と出力される。(booleanはブール値と呼ばれる型)
じゃあ肝心のこれは。
var a = true + 1; console.log(a); console.log(typeof a);
「2」「number」と出力された。マジだ。trueは1だったんや。
trueが1ってことは、これも思った通りになるはず。
var a = true + "1"; console.log(a); console.log(typeof a);
結果は「true1」「string」。11じゃないんかい。
おそらくだけど、trueやfalseといったbooleanは、算術演算子の中でも足し算と引き算は、もう片方の型に合わせて1(falseの場合0)になるか、文字列trueになるかが分かれるって認識でいいのか?いいのか?
で、掛け算と割り算は無条件でnumberになるみたいな。
結論から言うと・・・
めんどくさい。
あといろはす桃味美味しい