Javascript 是否可以在es6模板字符串中包含注释?

Javascript 是否可以在es6模板字符串中包含注释?,javascript,ecmascript-6,backticks,template-strings,Javascript,Ecmascript 6,Backticks,Template Strings,假设我们有一个多行es6模板字符串来描述,例如请求的一些URL参数: const fields = ` id, message, created_time, permalink_url, type `; 有没有办法在backtick模板字符串中添加注释?比如: const fields = ` // post id id, // post status/message message, // ..... c

假设我们有一个多行es6模板字符串来描述,例如请求的一些URL参数:

const fields = `
    id,
    message,
    created_time,
    permalink_url,
    type
`;
有没有办法在backtick模板字符串中添加注释?比如:

const fields = `
    // post id
    id,
    // post status/message
    message,
    // .....
    created_time,
    permalink_url,
    type
`;
没有

该语法有效,但只返回一个包含
\n//post id\nid
的字符串,而不是删除注释并创建一个没有注释的字符串


如果查看,您可以看到在反勾号分隔符之间识别的唯一标记是TemplateCharacters,它接受转义序列、换行符和普通字符。在中,SourceCharacter被定义为任何Unicode点(11.8.6中排除的点除外)。

只是不要使用模板字符串:

const fields = [
    'id',  // comment blah blah
    'message',
    'created_time',
    'permalink_url',
    'type'
].join(',');
您需要在初始化时支付数组和方法调用的成本(假设JIT不够聪明,无法完全优化它)

正如ssube所指出的,生成的字符串将不会保留换行符或空格。这取决于换行符或空格的重要性,如有必要,您可以手动添加“”和“\n”,或者决定您实际上不需要那么多的内联注释

更新 请注意,在字符串中存储编程数据通常被认为是:将它们存储为命名变量或对象属性 url查询字符串:

const makeQueryString = (url, data) => {
  return url + '?' + Object.keys(data)
    .map(k => `${k}=${encodeURIComponent(data[k))})
    .join('&');
};

let qs = makeQueryString(url, {
  id: 3,
  message: 'blah blah',
  // etc.
});

现在,您拥有了更易于更改、理解、重用的内容,并且对代码分析工具(如您选择的IDE中的工具)更加透明。

选项1:插值

我们可以创建返回空字符串的块,并将注释嵌入其中

const字段=`
id,${/*帖子id*/'}
消息,${/*发布状态/消息*/'}
创造了一段时间,
永久链接,
类型
`;

console.log(fields);
我知道这是一个古老的答案,但看到上面的答案,我感到必须回答这个纯粹的问题,然后回答提问者问题的精神

可以在模板文本字符串中使用注释吗? 是的。是的,你可以。但是它不漂亮。 请注意,必须将
'
(空字符串)放在
${}
大括号中,以便Javascript插入表达式。否则将导致运行时错误。引号可以放在注释之外的任何位置

我不是一个超级粉丝。这很难看,并且使得评论很麻烦,尽管在大多数IDE中切换评论变得很困难

就我个人而言,我尽可能地使用模板字符串,因为它们比常规字符串效率高出一小部分,而且它们可以捕获您想要的所有文本,大多数情况下不需要转义。您甚至可以将函数调用放在其中

上面示例中的字符串有点奇怪,对于您正在查找的内容可能没有用处,但是,因为会有一个初始换行符、逗号和注释之间的额外空格以及一个额外的最后换行符。删除不需要的空格可能会对性能造成小的影响。为了提高速度,您可以使用正则表达式还有效率,不过…下面有更多关于这方面的内容

现在回答问题的意图:

如何编写一个逗号分隔的列表字符串,每行都有注释? 加入数组是一种方式…(如@jared smith所建议)

但是,在这种情况下,当您只分配
join()的返回值时,您正在创建一个数组,然后立即丢弃组织好的数据
函数。不仅如此,您还在为数组中的每个字符串创建一个内存指针,在作用域结束之前不会对其进行垃圾收集。在这种情况下,捕获数组、按使用指示动态加入或使用模板文本并对实现进行不同的注释(如ghostDoc样式)可能更有用

似乎你只使用模板文字来满足在每行中没有引号的愿望,尽量减少字符串查询参数在URL和代码中的认知不一致。你应该知道这保留了断线,我怀疑你想要这个。

/****************
 * Fields:
 *   id : post ID
 *   message : post/status message
 *   created_time : some other comment...
 */
const fields = `
    id,
    message,
    created_time,
    permalink_uri,
    type
`.replace(/\s/g,'');
这使用正则表达式过滤掉所有的空白,同时保持列表的可读性和可重排性。正则表达式文字所做的只是捕获空白,然后替换方法将捕获的文本替换为
'
(结尾的
g
只是告诉正则表达式不要在它找到的第一个匹配项(在本例中是第一个换行符)处停止。)

或者,最糟糕的是,您可以直接将注释放在模板文字中,然后用正则表达式将其剥离:

const fields = `
    id, // post ID
    message, // post/status message
    created_time, // ...
    permalink_uri,
    type
`.replace(/\s+\/\/.*\*\/\n/g,'').replace(/\s/g,'');
第一个正则表达式将查找并替换为空字符串(
'
)的所有实例:双斜杠前面的一个或多个空白字符(每个斜杠由反斜杠转义)后跟空格和新行字符。如果要使用
/*多行*/
注释,此正则表达式会变得更复杂,您必须在末尾添加另一个
.replace()

.replace(/\/\*.*\*\//g,'')
该正则表达式只能在去掉
\n
换行符后才能使用,否则正则表达式将与现在的not not multiline注释不匹配。这将类似于:

const fields = `
    id, // post ID
    message, /* post/
                status message */
    created_time, // ...
    permalink_uri,
    type
`.replace(/\s+\/\/.*\n/g,'').replace(/\s/g,'').replace(/\/\*.*\*\//g,'');
以上所有操作都将产生此字符串:

“id,message,created\u time,permalink\u uri,type”

也许只有一个正则表达式就可以做到这一点,但这超出了这里的范围,真的。此外,我鼓励你通过自己玩正则表达式来爱上它


稍后我会尝试对此进行讨论。我现在非常好奇!

这会产生一个非常不同的字符串,因为它不保留换行符或空格。是的,我也考虑过这一点。删除的换行符/空格是(在我的例子中)需要,所以我想我必须采用这个解决方案。我只是想知道它是否可能。在我的情况下,它不是关于存储数据,而是关于一个图形
.replace(/\/\*.*\*\//g,'')
const fields = `
    id, // post ID
    message, /* post/
                status message */
    created_time, // ...
    permalink_uri,
    type
`.replace(/\s+\/\/.*\n/g,'').replace(/\s/g,'').replace(/\/\*.*\*\//g,'');