V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onice
V2EX  ›  程序员

javascript 字符串不能包含尖括号吗?

  •  
  •   onice · 2020-04-15 11:55:01 +08:00 · 3080 次点击
    这是一个创建于 1668 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var html = "<script></script>";
    

    这行总是报错,把第二个<去掉就不报错了。为什么呢?尖括号不需要转义的啊??

    DeepinScrot-5252.png

    12 条回复    2020-04-15 16:36:53 +08:00
    longgediyi999
        1
    longgediyi999  
       2020-04-15 11:56:40 +08:00
    ``
    longgediyi999
        2
    longgediyi999  
       2020-04-15 11:57:19 +08:00
    建议先去学一波 es6
    littleylv
        3
    littleylv  
       2020-04-15 11:57:57 +08:00
    ..
    ksedz
        4
    ksedz  
       2020-04-15 12:01:00 +08:00
    vs 提示的问题,代码没错误
    最近我也遇到了,看着不爽
    mercury233
        5
    mercury233  
       2020-04-15 12:02:32 +08:00
    html 里</script>优先闭合脚本标签,部分浏览器看到的只有半截 js
    lsvih
        6
    lsvih  
       2020-04-15 12:04:03 +08:00
    ide 的问题吧
    SunriseFox
        7
    SunriseFox  
       2020-04-15 12:04:43 +08:00   ❤️ 1
    不是 JavaScript 的问题,而是 XML 的问题
    不是不能包含尖括号,而是 </script> 闭合了 <script>

    = =

    你这个代码被解析后就是

    <script>... ' ... </script>

    '

    </script>

    当然是不行了... 需要转义为 <\/script>
    libook
        8
    libook  
       2020-04-15 12:21:19 +08:00   ❤️ 8
    5 楼和 7 楼是正解。
    HTML 引擎和 JS 引擎是两个独立的引擎,HTML 源码会由 HTML 引擎优先解析,解析到 script 标签的时候,HTML 引擎会把<script>和后面第一个遇到的</scriipt>字符串之间的字符串交给 JS 引擎来解析。
    虽然你的</script>在 JS 的字符串值内部,但对于 HTML 引擎来说,它并不认识 JS 代码,它就只是憨憨地在<script>后面找第一个遇到的</script>字符串。这样的话你的代码里,截取<script>到第一个</script>字符串之间的不是一段有效的 JS 代码,而之外的也不是有效的 HTML 代码。

    举例:
    源代码是:

    <script>
    html='<script></script>'
    </script>

    HTML 引擎交给 JS 引擎解析的是:

    html='<script>

    上面 JS 字符串缺失后面的引号,所以不是合法的 JS,HTML 留下的代码是:

    '
    </script>

    首先第一行留下一个残缺的单引号,所以 HTML 就认为这是一段 text,就直接输出这个单引号字符;同时因为在</script>之前没有与之配对的<script>起始标签,所以后面这个闭合标签是不合法的 HTML 。
    xmadi
        9
    xmadi  
       2020-04-15 12:52:31 +08:00 via iPhone
    编辑器识别的问题 换一个
    yafoo
        10
    yafoo  
       2020-04-15 13:06:39 +08:00 via Android
    以前"</scr"+"ipt>"这样写过代码
    onice
        11
    onice  
    OP
       2020-04-15 15:56:18 +08:00
    @libook 感谢解答。
    otakustay
        12
    otakustay  
       2020-04-15 16:36:53 +08:00
    最简单的是<\/script>就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2568 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.