4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【JavaScript】不等号で文字列型の数値を比較してはいけない理由

Last updated at Posted at 2020-05-22

##結論
JavaScriptでconsole.log('3' < '12')を実行すると、文字列比較となってしまうため、結果はfalseと返ってくる。
単純に数を比較した場合と異なる結果が出ることがあるので、
数値を比較したい場合は文字列型(string)ではなく数値型(number)で比較すべき。

##なぜこうなるのか
不等号で文字列型の数値を比較すると、文字のUnicode値が比較されるかららしい。

こちらを参考にしました

##調査記録

実際の挙動も確かめたかったので手を動かしてみた。

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の勉強過程で拾い集めた情報からたどり着いた答えです。間違っているところがあればご指摘お願いいたします。)

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?