spiky
@spiky (Nobuyuki Tsuboi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

freeCodeCamp Javascriptの問題「Counting Cards」の解説ページにあるSolution3を説明して欲しい。

解決したいこと

当該問題解説ページにあるSolution3が正しいコードであることを説明して欲しい。

僕には、Solution3はとてもトリッキーな解法に見えます。
それに、Solution3だけ説明文がないのも解せません。

問題ページ「Counting Cards」
https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/counting-cards

解説ページ「freeCodeCamp Challenge Guide: Counting Cards」
https://forum.freecodecamp.org/t/freecodecamp-challenge-guide-counting-cards/16809

確かに、Solution3のコードは Run the Test に合格します。
ですが、else if の条件式
card >= "10" 
つまり「変数cardの値が文字列"10"以上のとき」
が、与えられた条件
「変数cardの値が、数値10または文字列"J"または"Q"または"K"または"A"のとき」
を正しく満たしている理由がわかりません。

該当するソースコード

let count = 0;

function cc(card) {
  if (card <= 6) 
    count++;
  else if (card >="10")
    count--;
  return count + (count > 0 ? ' Bet' : ' Hold');
}

自分で試したこと

ちなみに、僕の回答は以下の2つで、Solution2、Solution3とほぼ同様です。

let count = 0;

function cc(card) {
  // Only change code below this line
  switch (card) {
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
      count++;
      break;
    case 10:
    case 'J':
    case 'Q':
    case 'K':
    case 'A':
      count--;
      break;
  }

  return count + (count > 0 ? ' Bet' : ' Hold');
  // Only change code above this line
}
let count = 0;

function cc(card) {
  // Only change code below this line
  if (card >= 2 && card <= 6) {
    count++;
  } else if (card === 10 || /[JQKA]/.test(card)) {
    count--;
  }
  return count + (count > 0 ? ' Bet' : ' Hold');
  // Only change code above this line
}
0

2Answer

JavaScriptで文字列同士を比較した場合、Unicodeのコード順で比較しようとします。
Unicodeでアルファベットは数字よりあとにあるので、"A" >= "10"などはtrueを返すことになります。

参考:
両方の値が文字列である場合、それらに含まれる Unicode コードポイントの値に基づいて、文字列として比較されます。



■追記
1つ注意点として、同じような比較でも型が数値か文字列かによって結果が変わる場合があります。
値を変数に退避して利用したりすると、型がわかりづらく意図しない比較結果になってしまうこともあるのでご注意ください。

card = 2;
card >= "10";
//false
//→cardが数値型なので、数値に変換したうえで比較している

card = "2";
card >= "10";
//true
0Like

早速のご返信誠にありがとうございます!
明瞭なご説明と参考リンクと追記のおかげでJavascriptの比較仕様への理解が深まりました。

0Like

Your answer might help someone💌