const stars = ` ⭐ ⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ `; console.log(stars.length * 2);
They create a multiline string via Template Literal syntax. That is just a fancy way of saying they initialized it by using backticks (
`foobar`). It offers some excellent features, one of them even being crucial for this blog post.
Well, then we output the length and multiply it by two.
Commonly the length of a string is described as providing the count of the characters. Technically, this is incorrect. Practically, most times, it's okay to think about it like that, tho. Even now, for our snippet, this is not the trickery! We, indeed, only count characters.
Following that logic, the first thought is to count the stars (⭐) and multiply them by two, being 30. Surprisingly enough, this is far from reality. The output is 62.
The analysis is relatively easy here when you know two things. First, two whitespaces indent every line of stars! They also need to be taken into consideration. For five lines, we have an extra ten characters. Adding up on 15 stars, we have a length of 25.
Second, Template Literals support multiline strings! We need to count every line break (
\n) as well. Let us refactor the string declaration with regular apostrophes:
const stars = '\n ⭐\n ⭐⭐\n ⭐⭐⭐\n ⭐⭐⭐⭐\n ⭐⭐⭐⭐⭐\n';
As you can see, we have six line breaks. These plus 25 characters add up to 31. Doubled in the output gives us 62.
- Trickery: The string contains whitespaces and line breaks
- Key Learning: Template Literals support multi-line strings (for better or worse)
- Further Reading: