##結論
JavaScriptでconsole.log('3' < '12')
を実行すると、文字列比較となってしまうため、結果はfalseと返ってくる。
単純に数を比較した場合と異なる結果が出ることがあるので、
数値を比較したい場合は文字列型(string)ではなく数値型(number)で比較すべき。
##なぜこうなるのか
不等号で文字列型の数値を比較すると、文字のUnicode値が比較されるかららしい。
こちらを参考にしました
- javascript 文字列のまま数字を比較すると危険が危ない。
- JavaScriptで文字列を比較する
- ECMAScript® Language Specification 11.8Relational Operators
##調査記録
実際の挙動も確かめたかったので手を動かしてみた。
numberとnumber
console.log(1 < 2); // true
console.log(2 < 1); // false
number同士の比較なので、当然みたままの数字が大きい方がtrueになる
stringとnumber
console.log('1' < 2); // true
console.log('2' < 1); // false
片方だけstringの場合、stringはnumberに変換されるため、
numberとnumberで比較した場合と同じ結果が得られる。
stringとstring (1文字の場合)
console.log('1' < '2'); // true
console.log('2' < '1'); // false
Unicodeで比較する。
'1'はu100301
、'2'は u100302
なので、
結局、numberとnumberで比較した場合と同じ結果が得られる。
stringとstring (複数文字列で、文字列の長さが違う場合) *ここがやっかい!
console.log('3' < '12'); // false
console.log('12' < '3'); // true
左詰で、1文字ずつ順番にUnicodeで比較する。
'3'はu100303
、'1'は u100301
になるので、この時点での結果は'3' > '1'
と同じになる。
次の文字列は片方しか値がないため、その時点で処理が終了し、
結局、'3'と'1'を比較した結果が出力される
補足
stringとstringで文字列を比較した際、以下のような結果になるのも上記と同じ理由だと思われる。
console.log('c' < 'ab'); // false
console.log('ab' < 'c'); // true
'c'u00603
と'a'u00601
を比較し、この時点で結果は'c' > 'a'
と同じになる。
次の文字列は片方しか値がないため、その時点で処理が終了し、
'c'と'a'を比較した結果が出力される。
まとめ
数字を比較したい場合は文字列型ではなく数値型で比較すべき。
(JavaScriptの勉強過程で拾い集めた情報からたどり着いた答えです。間違っているところがあればご指摘お願いいたします。)