@@ -399,7 +399,7 @@ function fn() {
399
399
// foo Hello World bar
400
400
```
401
401
402
- 如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法 。
402
+ 如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的 ` toString ` 方法 。
403
403
404
404
如果模板字符串中的变量没有声明,将报错。
405
405
@@ -416,6 +416,20 @@ var msg = `Hello, ${place}`;
416
416
// "Hello World"
417
417
```
418
418
419
+ 如果需要引用模板字符串本身,可以像下面这样写。
420
+
421
+ ``` javascript
422
+ // 写法一
423
+ let str = ' return ' + ' `Hello ${name}!`' ;
424
+ let func = new Function (' name' , str);
425
+ func (' Jack' ) // "Hello Jack!"
426
+
427
+ // 写法二
428
+ let str = ' (name) => `Hello ${name}!`' ;
429
+ let func = eval .call (null , str);
430
+ func (' Jack' ) // "Hello Jack!"
431
+ ```
432
+
419
433
## 实例:模板编译
420
434
421
435
下面,我们来看一个通过模板字符串,生成正式模板的实例。
@@ -524,45 +538,48 @@ div.innerHTML = parse({ supplies: [ "broom", "mop", "cleaner" ] });
524
538
525
539
模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
526
540
541
+ 标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。
542
+
527
543
``` javascript
528
544
var a = 5 ;
529
545
var b = 10 ;
530
546
531
547
tag` Hello ${ a + b } world ${ a * b } ` ;
532
548
```
533
549
534
- 上面代码中,模板字符串前面有一个标识名tag ,它是一个函数。整个表达式的返回值,就是tag函数处理模板字符串后的返回值 。
550
+ 上面代码中,模板字符串前面有一个标识名 ` tag ` ,它是一个函数。整个表达式的返回值,就是 ` tag ` 函数处理模板字符串后的返回值 。
535
551
536
- 函数tag依次会接收到多个参数 。
552
+ 函数 ` tag ` 依次会接收到多个参数 。
537
553
538
554
``` javascript
539
555
function tag (stringArr , value1 , value2 ){
540
556
// ...
541
557
}
542
558
543
559
// 等同于
560
+
544
561
function tag (stringArr , ... values ){
545
562
// ...
546
563
}
547
564
```
548
565
549
- tag函数的第一个参数是一个数组 ,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。
566
+ ` tag ` 函数的第一个参数是一个数组 ,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。
550
567
551
- tag函数的其他参数 ,都是模板字符串各个变量被替换后的值。由于本例中,模板字符串含有两个变量,因此tag会接受到value1和value2两个参数 。
568
+ ` tag ` 函数的其他参数 ,都是模板字符串各个变量被替换后的值。由于本例中,模板字符串含有两个变量,因此 ` tag ` 会接受到 ` value1 ` 和 ` value2 ` 两个参数 。
552
569
553
- tag函数所有参数的实际值如下 。
570
+ ` tag ` 函数所有参数的实际值如下 。
554
571
555
- - 第一个参数:[ 'Hello ', ' world ', '']
572
+ - 第一个参数:` ['Hello ', ' world ', ''] `
556
573
- 第二个参数: 15
557
574
- 第三个参数:50
558
575
559
- 也就是说,tag函数实际上以下面的形式调用 。
576
+ 也就是说,` tag ` 数实际上以下面的形式调用 。
560
577
561
578
``` javascript
562
579
tag ([' Hello ' , ' world ' , ' ' ], 15 , 50 )
563
580
```
564
581
565
- 我们可以按照需要编写tag函数的代码。下面是tag函数的一种写法 ,以及运行结果。
582
+ 我们可以按照需要编写 ` tag ` 函数的代码。下面是 ` tag ` 函数的一种写法 ,以及运行结果。
566
583
567
584
``` javascript
568
585
var a = 5 ;
@@ -649,13 +666,13 @@ function SaferHTML(templateData) {
649
666
}
650
667
```
651
668
652
- 上面代码中,经过SaferHTML函数处理 ,HTML字符串的特殊字符都会被转义。
669
+ 上面代码中,经过 ` SaferHTML ` 函数处理 ,HTML字符串的特殊字符都会被转义。
653
670
654
671
标签模板的另一个应用,就是多语言转换(国际化处理)。
655
672
656
673
``` javascript
657
- i18n` Hello ${ name } , you have ${ amount } :c(CAD) in your bank account. `
658
- // Hallo Bob, Sie haben 1.234,56 $CA auf Ihrem Bankkonto.
674
+ i18n` Welcome to ${ siteName } , you are visitor number ${ visitorNumber } ! `
675
+ // "欢迎访问xxx,您是第xxxx位访问者!"
659
676
```
660
677
661
678
模板字符串本身并不能取代Mustache之类的模板库,因为没有条件判断和循环处理功能,但是通过标签函数,你可以自己添加这些功能。
@@ -674,6 +691,22 @@ var libraryHtml = hashTemplate`
674
691
675
692
除此之外,你甚至可以使用标签模板,在JavaScript语言之中嵌入其他语言。
676
693
694
+ ``` javascript
695
+ jsx`
696
+ <div>
697
+ <input
698
+ ref='input'
699
+ onChange='${ this .handleChange } '
700
+ defaultValue='${ this .state .value } ' />
701
+ ${ this .state .value }
702
+ </div>
703
+ `
704
+ ```
705
+
706
+ 上面的代码通过` jsx ` 函数,将一个DOM字符串转为React对象。你可以在Github找到` jsx ` 函数的[ 具体实现] ( https://gist.github.com/lygaret/a68220defa69174bdec5 ) 。
707
+
708
+ 下面则是一个假想的例子,通过` java ` 函数,在JavaScript代码之中运行Java代码。
709
+
677
710
``` javascript
678
711
java`
679
712
class HelloWorldApp {
@@ -685,7 +718,7 @@ class HelloWorldApp {
685
718
HelloWorldApp .main ();
686
719
```
687
720
688
- 模板处理函数的第一个参数(模板字符串数组),还有一个raw属性 。
721
+ 模板处理函数的第一个参数(模板字符串数组),还有一个 ` raw ` 属性 。
689
722
690
723
``` javascript
691
724
tag` First line\n Second line`
@@ -696,13 +729,13 @@ function tag(strings) {
696
729
}
697
730
```
698
731
699
- 上面代码中,tag函数的第一个参数strings,有一个raw属性 ,也指向一个数组。该数组的成员与strings数组完全一致 。比如,strings数组是 ` ["First line\nSecond line"] ` ,那么strings.raw数组就是 ` ["First line\\nSecond line"] ` 。两者唯一的区别,就是字符串里面的斜杠都被转义了。比如,strings.raw数组会将` \n ` 视为\和n两个字符 ,而不是换行符。这是为了方便取得转义之前的原始模板而设计的。
732
+ 上面代码中,` tag ` 函数的第一个参数 ` strings ` ,有一个 ` raw ` 属性 ,也指向一个数组。该数组的成员与 ` strings ` 数组完全一致 。比如,` strings ` 数组是 ` ["First line\nSecond line"] ` ,那么 ` strings.raw ` 数组就是 ` ["First line\\nSecond line"] ` 。两者唯一的区别,就是字符串里面的斜杠都被转义了。比如,strings.raw数组会将` \n ` 视为` \ ` 和 ` n ` 两个字符 ,而不是换行符。这是为了方便取得转义之前的原始模板而设计的。
700
733
701
734
## String.raw()
702
735
703
- ES6还为原生的String对象,提供了一个raw方法 。
736
+ ES6还为原生的String对象,提供了一个 ` raw ` 方法 。
704
737
705
- String.raw方法 ,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。
738
+ ` String.raw ` 方法 ,往往用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串。
706
739
707
740
``` javascript
708
741
String .raw ` Hi\n ${ 2 + 3 } !` ;
@@ -712,10 +745,17 @@ String.raw`Hi\u000A!`;
712
745
// 'Hi\\u000A!'
713
746
```
714
747
715
- 它的代码基本如下。
748
+ 如果原字符串的斜杠已经转义,那么` String.raw ` 不会做任何处理。
749
+
750
+ ``` javascript
751
+ String .raw ` Hi\\ n`
752
+ // "Hi\\n"
753
+ ```
754
+
755
+ ` String.raw ` 的代码基本如下。
716
756
717
757
``` javascript
718
- String .raw = function (strings ,... values ) {
758
+ String .raw = function (strings , ... values ) {
719
759
var output = " " ;
720
760
for (var index = 0 ; index < values .length ; index++ ) {
721
761
output += strings .raw [index] + values[index];
@@ -726,9 +766,9 @@ String.raw = function (strings,...values) {
726
766
}
727
767
```
728
768
729
- String.raw方法可以作为处理模板字符串的基本方法 ,它会将所有变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用。
769
+ ` String.raw ` 方法可以作为处理模板字符串的基本方法 ,它会将所有变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用。
730
770
731
- String.raw方法也可以作为正常的函数使用 。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组 。
771
+ ` String.raw ` 方法也可以作为正常的函数使用 。这时,它的第一个参数,应该是一个具有 ` raw ` 属性的对象,且 ` raw ` 属性的值应该是一个数组 。
732
772
733
773
``` javascript
734
774
String .raw ({ raw: ' test' }, 0 , 1 , 2 );
0 commit comments