Skip to content

Commit 2d93ee3

Browse files
committed
types-grammar, ch1: more about template literals
1 parent 13771c0 commit 2d93ee3

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

types-grammar/ch1.md

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -378,25 +378,50 @@ greeting = `Hello, ${myName}!`;
378378
console.log(greeting); // Hello, Kyle!
379379
```
380380
381-
Everything between the `{ .. }` in such a template literal is an arbitrary JS expression. It can be simple variables, or complex JS programs, or anything in between.
381+
Everything between the `{ .. }` in such a template literal is an arbitrary JS expression. It can be simple variables like `myName`, or complex JS programs, or anything in between (even another template literal expression!).
382382
383383
| TIP: |
384384
| :--- |
385-
| This feature is commonly called "template literals" or "template strings", but I think that's confusing. "Template" is usually referred to in programming contexts as a reusable definition that can be re-evaluated with different data. For example, *template engines* for pages, email templates for newsletter campaigns, etc. This JS feature is not re-usable. It's a literal, and it produces a single, immediate value (usually a string). You can put such a value in a function, and call the function multiple times. But then the function is acting as the template, not the the literal itself. I prefer instead to refer to this feature as *interpolated literals*, or the funny, shortened *interpoliterals*, as I think this name is more accurately descriptive. |
385+
| This feature is commonly called "template literals" or "template strings", but I think that's confusing. "Template" usually means, in programming contexts, a reusable set of text that can be re-evaluated with different data. For example, *template engines* for pages, email templates for newsletter campaigns, etc. This JS feature is not re-usable. It's a literal, and it produces a single, immediate value (usually a string). You can put such a value in a function, and call the function multiple times. But then the function is acting as the template, not the the literal itself. I prefer instead to refer to this feature as *interpolated literals*, or the funny, short-hand: *interpoliterals*. I just think that name is more accurately descriptive. |
386+
387+
Template literals also have an interesting different behavior with respect to new-lines, compared to classic `"` or `'` delimited strings. Recall that for those strings, a line-continuation required a `\` at the end of each line, right before a new-line. Not so, with template literals!
388+
389+
```js
390+
myPoem = `
391+
Roses are red
392+
Violets are blue
393+
C3PO's a funny robot
394+
and so R2.`;
395+
396+
console.log(myPoem);
397+
//
398+
// Roses are red
399+
// Violets are blue
400+
// C3PO's a funny robot
401+
// and so R2.
402+
```
403+
404+
Line-continuations with template literals do *not require* escaping. However, that means the new-line is part of the string, even the first new-line above. In other words, `myPoem` above holds a truly *multi-line string*, as shown. However, if you `\` escape the end of any line in a template literal, the new-line will be omitted, just like with non-template literal strings.
386405
387406
Template literals usually result in a string value, but not always. A form of template literal that may look kind of strange is called a *tagged template literal*:
388407
389408
```js
390409
price = formatCurrency`The cost is: ${totalCost}`;
391410
```
392411
393-
Here, `formatCurrency` is a tag applied to the template literal value, which actually invokes `formatCurrency(..)` as a function, passing it the string literals and interpolated expressions parsed from the value. This function can then assemble those in any way it sees fit -- such as formatting a `number` value as currency in the current locale -- and return whatever value, string or otherwise, that it wants. So tagged template literals are not always strings. But untagged template literals will always be strings.
412+
Here, `formatCurrency` is a tag applied to the template literal value, which actually invokes `formatCurrency(..)` as a function, passing it the string literals and interpolated expressions parsed from the value. This function can then assemble those in any way it sees fit -- such as formatting a `number` value as currency in the current locale -- and return whatever value, string or otherwise, that it wants.
413+
414+
So tagged template literals are not always strings; they can be any value. But untagged template literals *will always be* strings.
415+
416+
Some JS developers believe that untagged template literal strings are best to use for *all* strings, even if not using any expression interpolation or multiple lines. I disagree. I think they should only be used when interpolating (or multi-line'ing).
394417
395-
Some JS developers believe that untagged template literal strings are preferable to use for *all* strings, even if not doing any expression interpolation. I disagree. I think it should only be used when interpolating, and classic `".."` or `'..'` delimited strings should be used for non-interpolated string definitions.
418+
| TIP: |
419+
| :--- |
420+
| The principle I always apply in making such determinations: use the closest-matched, and least capable, feature/tool, for any task. |
396421
397422
Moreover, there are a few places where `` `..` `` style strings are disallowed. For example, the `"use strict"` pragma cannot use back-ticks, or the pragma will be silently ignored (and thus the program accidentally runs in non-strict mode). Also, this style of strings cannot be used in quoted property names of object literals, or in the ES Module `import .. from ..` module-specifier clause.
398423
399-
My advice: use `` `..` `` delimited strings where allowed, but only when interpolation is needed, and keep using `".."` or `'..'` delimited strings for all other strings.
424+
My take: use `` `..` `` delimited strings where allowed, but only when interpolation/multi-line is needed; and keep using `".."` or `'..'` delimited strings for everything else.
400425
401426
### Number Values
402427

0 commit comments

Comments
 (0)