呈现标记模板文字时的额外替换
Extra substitution when rendering a tagged template literal
我刚开始使用模板文字和标记的模板文字。但是我 运行 在尝试呈现模板文字时遇到了问题,因为它呈现了一个额外的替换,我想知道它来自哪里。
这是我试过的:
我的数据
var data = {
login: "john_12",
name: "John",
bio: "developer",
email: "jdev@mail.com"
}
我的标签功能
function replaceNullData(strings, ...parts) {
var checkedMarkup = "";
strings.forEach((string, index) => {
if (!parts[index]){
parts[index] = "data no available";
}
checkedMarkup += string + parts[index];
});
return checkedMarkup;
}
我的模板文字
var summaryMarkup = replaceNullData`
<div>
<p>Username: ${data.login}</p>
</div>
<div>
<p>Name: ${data.name}</p>
</div>
<div>
<p>Bio: ${data.bio}/<p>
</div>
<div>
<p>Email: ${data.email}</p>
</div>
`;
现在,如果我这样做 console.log(summaryMarkup);
,我会得到这个:
<div>
<p>Username: john_12</p>
</div>
<div>
<p>Name: John</p>
</div>
<div>
<p>Bio: developer/<p>
</div>
<div>
<p>Email: jdev@mail.com</p>
</div>
data no available <------- THIS IS WHAT SHOULDN'T APPEAR
末尾多了一个"data no available"。这就像标签函数收到 6 parts
(替换或表达式)而不是 5.
我在这里错过了什么?
您的 parts.length
是您预期的长度,但请注意您正在迭代 strings
,而不是 parts
。 strings.length === parts.length + 1
,因此您正在 parts
越界访问。改为迭代 parts
并将最后一个字符串附加到迭代之外:
function replaceNullData(strings, ...parts) {
var checkedMarkup = "";
parts.forEach((part, index) => {
if (part == null) { // because false, 0, NaN, and '' should be "available"
part = "data not available";
}
checkedMarkup += strings[index] + part;
});
return checkedMarkup + strings[strings.length - 1]; // manually append last string
}
我刚开始使用模板文字和标记的模板文字。但是我 运行 在尝试呈现模板文字时遇到了问题,因为它呈现了一个额外的替换,我想知道它来自哪里。
这是我试过的:
我的数据
var data = {
login: "john_12",
name: "John",
bio: "developer",
email: "jdev@mail.com"
}
我的标签功能
function replaceNullData(strings, ...parts) {
var checkedMarkup = "";
strings.forEach((string, index) => {
if (!parts[index]){
parts[index] = "data no available";
}
checkedMarkup += string + parts[index];
});
return checkedMarkup;
}
我的模板文字
var summaryMarkup = replaceNullData`
<div>
<p>Username: ${data.login}</p>
</div>
<div>
<p>Name: ${data.name}</p>
</div>
<div>
<p>Bio: ${data.bio}/<p>
</div>
<div>
<p>Email: ${data.email}</p>
</div>
`;
现在,如果我这样做 console.log(summaryMarkup);
,我会得到这个:
<div>
<p>Username: john_12</p>
</div>
<div>
<p>Name: John</p>
</div>
<div>
<p>Bio: developer/<p>
</div>
<div>
<p>Email: jdev@mail.com</p>
</div>
data no available <------- THIS IS WHAT SHOULDN'T APPEAR
末尾多了一个"data no available"。这就像标签函数收到 6 parts
(替换或表达式)而不是 5.
我在这里错过了什么?
您的 parts.length
是您预期的长度,但请注意您正在迭代 strings
,而不是 parts
。 strings.length === parts.length + 1
,因此您正在 parts
越界访问。改为迭代 parts
并将最后一个字符串附加到迭代之外:
function replaceNullData(strings, ...parts) {
var checkedMarkup = "";
parts.forEach((part, index) => {
if (part == null) { // because false, 0, NaN, and '' should be "available"
part = "data not available";
}
checkedMarkup += strings[index] + part;
});
return checkedMarkup + strings[strings.length - 1]; // manually append last string
}