为什么在JavaScript中需要对“<\/script>”进行转义?

5

我看到每个人都在做,但我不明白为什么。

document.write('<script src="src"><\/script>');

我指的是使用单引号时,你不需要转义字符吗?

可能是https://dev59.com/nHVC5IYBdhLWcg3wnCj6的重复内容。 - Gumbo
只有 PHP 有这个愚蠢的“单引号字符串中不转义”的规则。 - ThiefMaster
@thief:PHP 的那个规则非常好。 - dynamic
3个回答

5
  1. 单引号和双引号的字符串具有相同的转义规则。
  2. 这可以防止</script>被解析为一个结束标签。

"</script>和"<\/script>"在JavaScript中是相同的,但只有第一个被HTML解析器解释为包含一个HTML结束标签。


4
HTML解析器将在您的字符串中看到</script>作为一个闭合标签,并关闭您最初的<script>。它没有字符串的概念。
因此,如果您不进行转义,您的JavaScript代码片段只会被视为document.write('<script src="src">,而其余部分');将被视为HTML文本节点。
另外,请注意,您不必以特定方式“转义”</script>。只要您不像</script>一样精确地书写它,任何内容都可以。以下是几个有效的示例:
document.write('<script src="src"><\/script>');
document.write('<script src="src"></scr' + 'ipt>');
document.write('<script src="src"></' + 'script>');

4

</script>总是结束脚本块——无论你做什么(例如HTML注释或CDATA)。因此,除非您确实想要结束块,否则不应在脚本块中出现它。最简单的方法是转义正斜杠(转义不起作用;在JavaScript中,未知的转义序列只会“丢失”其反斜杠)。


我不明白。考虑到JavaScript在单引号中的转义,</script><\/script>不是相同的值吗?它们不应该产生相同的“错误”吗? - dynamic
是的,但它不仅更长(3个字符而不是1个字符),而且看起来更丑陋(在我看来)。 - ThiefMaster
是的,是的,我以前见过那种风格。 - Matthew Flaschen
@是的,请不要编辑您的评论以说完全不同的事情。只需发布新的评论即可。 - Matthew Flaschen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接