2016-04-26 62 views

回答

3

這並不意味着在模板字符串的情況下任何特殊。這僅表示數組is frozen。從文檔:

的對象,如果凍結且僅當它是不是extensible,其所有屬性都是不可配置的,並且它的所有數據屬性(即,未存取器與getter或setter屬性特性組件)是不可寫的。

因此,傳遞到標記函數的字符串數組基本上是不可變的。這應該允許引擎將其存儲爲常量,並在每次評估標記的模板文字時重複傳遞相同的數組對象。

3

可以在ECMA腳本中定義自定義模板文字標籤6。例如,

(function(parts, a, b) { 
    return Object.isFrozen(parts) && Object.isFrozen(parts.raw); 
}) `foo${0}bar${0}baz`; 

來源:https://kangax.github.io/compat-table/es6/#test-template_literals

在上面的代碼中,功能對象是模板文字的「標籤」。

當字面模板進行評價時,該標記函數被調用與模板字面的所有部分(在這種情況下,它們是foobar,和baz)爲一個數組。你看到的測試用例是確保數組對象已經被凍結或不凍結。

測試基本檢查ES6規格的this section

Perform SetIntegrityLevel(rawObj, "frozen"). 
... 
Perform SetIntegrityLevel(template, "frozen"). 
+2

值得一提的凍結的對象是什麼 - 凍結的對象是一個對象,其屬性不能被修改。您可以使用Object.freeze創建自己的凍結對象,並檢查對象是否通過Object.isFrozen凍結。請注意,「解凍」物體是不可能的。您可以在控制檯中查看它:'Object.isFrozen(Object.freeze({}))'。 –

+0

因此,您的答案頂部的函數表達式旨在表示隱藏的函數表達式在幕後與每個模板文字相關聯? – Ben

+0

@BenAston不是每個文字,只是這個模板文字。如果你想和其他文字一起使用,你可以像這樣做'const fn = ...;'然後「fn'foo $ {0}'」 – thefourtheye

0

模板字符串是ECMA6概念,我們可以使用「`」編寫和附加多行代碼,就像之前我們用帶字符串concat的雙引號一樣。

var container = document.getElementById('container'); 
 

 
var todo = { 
 
    id: 123, 
 
    name: "Pick up dry cleaning", 
 
    completed: true 
 
} 
 

 
container.innerHTML = ` 
 
<div todo='$(todo.id)' class="list-group-item"> 
 
<i class='${todo.completed}?"hidden":"glyphicon-ok"} text-success glyphicon'></i> 
 
<span class="name">${todo.name}</span> 
 
` 
 
Templates strings are the ECMA6 concepts where we can write and append multiple line code with " ` " as before we use to do with double quotes with string concat.
<div id="container" class="container"> 
 
    </div>