Javascript ES6反引号运算符

时间:2018-04-13 06:21:38

标签: javascript

var1 = "string1"
var2 = "string2"
...
varn = "stringn"

var str = `${var1}${var2}${var3}${var4}...${varn}`;

1.在上面的表达式中获取str的{​​{3}}是什么,给定varistring

2.与使用for循环串联字符串相比,它有多快?

Edit1:添加了wiki链接

Edit2:@PatrickRoberts所说的另一个例子。这也是我的实际用例:

我正在使用node,我需要使用XML有效负载回复客户端。他们已经给了我XML和各自XSD的格式。这些是大而嵌套的XML。我有数据(在JSON中),我将使用反引号运算符“填充”XML模板(作为字符串)。我想尽可能避免阻塞node线程。

作为一个虚拟的例子:

let response = 
`<CATALOG>
    <CD>
        <TITLE>${data.title}</TITLE>
        <ARTIST>${data.artist}</ARTIST>
        <COUNTRY>${data.country}</COUNTRY>
        <COMPANY>${data.company}</COMPANY>
        <PRICE>${data.price}</PRICE>
        <YEAR>${data.year}</YEAR>
    </CD>
<CATALOG>
`

1 个答案:

答案 0 :(得分:0)

首先,一个(希望)令人信服的论据来捍卫我的一面 - 在这里踩你的意图。

<子> <rant>

你真正需要问自己的问题是,你真的更喜欢效率,重新使用对你来说绝对没有意义吗?效率通常是A Good Thing™,但请记住,只能维持DRY代码。这个概念是不言自明的:如果你不重复自己,你可以减少不必要的操作,并且作为额外的好处,你的代码更易于维护。

除非您正在编写服务器,否则您希望以每秒数百个请求响应兆字节的XML,您开始关注字符串连接性能的效率水平永远不会发挥作用,所以在这种情况下,你应该考虑更重要的事情,比如如何让你的代码重复使用,这样你就不会一遍又一遍地重复实现同样的事情,每个调整都略有不同适合您特定用例的时间,就像您目前的情况一样。

</rant>

现在回答你的问题。因为我不知道你的&#34;真实&#34; XML看起来像,我将用一个非硬编码的解决方案来解决你的例子,即使API响应JSON也不需要实现更改。

&#13;
&#13;
// assuming you have valid object referenced by `data`
const data = {
  title: 'Code Monkey',
  artist: 'SKG',
  country: 'US',
  company: 'Stack Overflow',
  price: '12.98',
  year: 2006
};

function toXML ([key, value]) {
  const tag = key.toUpperCase();
  return `<${tag}>${value}</${tag}>`;
}

const response = `<CATALOG><CD>
${Object.entries(data).map(toXML).join('\n')}
</CD></CATALOG>`;

console.log(response);
&#13;
&#13;
&#13;

看到XML响应中的空格和顺序都不重要,这种方法比从JSON到XML的每个属性的硬编码更容易重复使用。

扩展此方法,您可以编写一个递归遍历数组和对象的方法,直到它达到原始值,根据各自的键将每个层次结构化为XML标记,但这假设您的JSON模式与XML模式匹配。稍微修改一下你的例子,看起来像这样:

&#13;
&#13;
// assuming you have valid object referenced by `data`
const data = {
  catalog: [{
    cd: {
      title: 'Code Monkey',
      artist: 'SKG',
      country: 'US',
      company: 'Stack Overflow',
      price: '12.98',
      year: 2006
    }
  }, {
    cd: {
      title: 'Mandelbrot Set',
      artist: 'SKG',
      country: 'US',
      company: 'Stack Overflow',
      price: '9.98',
      year: 2004
    }
  }]
};

const XML = {
  stringify (value) {
    switch (typeof value) {
    case 'object':
      return (Array.isArray(value)
        ? value.map(XML.stringify)
        : Object.entries(value).map(entryToXML)
      ).join('');
    default:
      return String(value);
    }
  }
};

function entryToXML ([key, value]) {
  const tag = key.toUpperCase();
  return `<${tag}>${XML.stringify(value)}</${tag}>`;
}

const response = XML.stringify(data);

console.log(response);
&#13;
&#13;
&#13;