模板字符串(Template String)


語法

模板字符串(Template String)是增強版的字符串,用反引號(`)標識,它可以當作普通字符串使用,也可以用來定義多行字符串,或者在字符串中嵌入變量。

用法

// 普通字符串
`In JavaScript '\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
not legal.`

// 字符串中嵌入變量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`   // Hello Bob, how are you today?

上面代碼中,模板字符串都是用反引號表示,如果在模板字符串中需要使用反引號,則前面需要用反斜杠轉義。

var greeting = `\`Yo\` World!`; // `Yo` World!

如果使用模板字符串表示多行字符串,則所有的空格、縮進和換行都會被保留在輸出中。

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`);

上面代碼中,所有模板字符串的空格和換行都是被保留的,比如

    標簽前面會有一個換行。如果想把行首和行尾的換行、空格等去掉,則使用trim方法即可。

    $('#list').html(`
    <ul>
      <li>first</li>
      <li>second</li>
    </ul>
    `.trim());
    

    模板字符串中嵌入變量,要將變量名寫在${}之中。大括號內可以放入任意的JavaScript表達式,可以進行運算,以及引入對象屬性。

    var x = 1, y = 2;
    
    `${x} + ${y} = ${x + y}`;
    // "1 + 2 = 3"
    
    `${x} + ${y * 2} = ${x + y * 2}`;
    // "1 + 4 = 5"
    
    var obj = {x: 1, y: 2};
    `${obj.x + obj.y}`
    // "3"
    

    模板字符串之中還可以調用函數。

    function func() {
        return 'Hello';
    }
    
    `${func()} World`;
    // "Hello World"
    

    如果大括號中的值不是字符串,則將按照一般的規則轉換為字符串。如,若大括號中是一個對象,則將默認調用對象的toString方法,把對象轉換為字符串。

    如果模板字符串中的變量沒有聲明,則會報錯。

    // 變量place沒有聲明
    var msg = `Hello, ${place}`;
    // ReferenceError: place is not defined
    

    模板字符串之間還可以進行嵌套。

    var tmpl = addrs => `
        <table>
        ${addrs.map(addr => `
            <tr><td>${addr.first}</td></tr>
            <tr><td>${addr.last}</td></tr>
        `).join('')}
        </table>
    `;
    
    tmpl([{first:'a', last: 'b'}]);
    
    // output:
    /*"
        <table>
    
            <tr><td>a</td></tr>
            <tr><td>b</td></tr>
    
        </table>
    "*/
    

    如果需要引用模板字符串本身,在需要時執行,可以像下面這樣寫。

    // 寫法一
    var str = 'return ' + '`Hello ${name}!`';
    var func = new Function('name', str);
    func('Amy');    // "Hello Amy!"
    
    // 寫法二
    var str = '(name) => `Hello ${name}!`';
    var func = eval.call(null, str);
    func('Amy');    // "Hello Amy!"
    
    標簽模板

    模板字符串的功能,不僅是上面那些,它還可以緊跟在一個函數后面,該函數將被調用來處理這個模板字符串,這種稱為“標簽模板”功能(Tagged template)。

    標簽模板函數第一個參數是字符串模板的常量數組,后面的每一個參數為表達式的計算結果,函數名稱可以任意指定。下面是一個例子:

    var a = 5, b = 10;
    
    function tag(strings, ...values) {
        console.log(strings[0]);    // "Hello "
        console.log(strings[1]);    // " world"
        console.log(strings[2]);    // ""
        console.log(values[0]);     // 15
        console.log(values[1]);     // 50
    
        return "Anything";
    }
    
    tag`Hello ${a + b} world ${a * b}`;
    // Anything
    alert`123`
    // 等同於
    alert(123)
    

    標簽模板其它是一種特殊的函數調用形式,“標簽”指的就是函數,緊跟在后面的模板字符串就是它的參數。

    var a = 1,
        b = 2;
    
    tag`Helo ${a + b} world ${a * b}`;
    

    上面代碼中,模板字符串前面有一個標識名tag,它是一個函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM