Blackjack game: Count Hand Value method
Review

Function hasAceInHand could be boiled down to a one-liner using array.find. It returns the first element of the array that passes the condition x =&gt; x.face === "A" provided.

const hasAceInHand = (cardsOnHand) =&gt; {
  return cardsOnHand.find(x =&gt; x.face === "A") != null;
}


Function countHandValue iterates the items, and calls the other function which iterates the items nested in the outer iteration if (sum &gt; 21 &amp;&amp; hasAceInHand(cardsOnHand)) { ... You could just keep track of aces to avoid iterating the items more than once.

Alternative for countHandValue

In black-jack, at most 1 ace could have value 11, all other aces in the hand must have value 1, else 21 would get exceeded (11 + 11 &gt; 21). I would change the default value of an ace to 1.

switch (face) {
    case "A":
        this.faceValue = 1;
        break;


As a first step, Array.reduce could be used to calculate the sum of card values.

const countHandValue = (cardsOnHand) =&gt; {
  return cardsOnHand.reduce((sum, current) =&gt; {
    sum += current.faceValue;
    return sum;
  }, 0);
}


Then we can implement a relaxation allowing at most 1 ace to get value 11.

const countHandValue = (cardsOnHand) =&gt; {
  let ace;
  let value = cardsOnHand.reduce((sum, current) =&gt; {
    ace |= current.faceValue === 1;
    sum += current.faceValue;
    return sum;
  }, 0);
  if (ace &amp;&amp; value + 10 &lt;= 21) {
    value += 10;
  }
  return value;
}


And we also no longer need to call hasAceInHand as we're tracking the ace inline.