当前位置: 首页 > 面试题库 >

JavaScript什么时候应该使用转义而不是encodeURI / encodeURIComponent?

鲁炳
2023-03-14
问题内容

编码要发送到Web服务器的查询字符串时-您escape()何时使用以及何时使用encodeURI()encodeURIComponent()

使用转义:

escape("% +&=");

要么

使用encodeURI()/ encodeURIComponent()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");

问题答案:

escape()

不要使用它! escape()在B.2.1.2节中定义了转义,并且附件B的引言中指出:

…本附件中指定的所有语言功能和行为均具有一个或多个不良特征,在没有遗留用法的情况下,将从本规范中删除。…
…程序员不应该使用或编写新的ECMAScript代码时承担的这些功能和行为的存在....

特殊字符的编码除外:@ * _ +-。/

字符的十六进制形式(其代码单位值为0xFF或更小)是两位数字的转义序列:%xx

对于具有较大代码单位的字符,将%uxxxx使用四位数格式。查询字符串(如RFC3986中所定义)中不允许这样做:

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

仅当百分号后接两个十六进制数字时才允许使用百分号,而百分号后接u则不允许。

encodeURI()

当您需要有效的URL时,请使用encodeURI。拨打电话:

encodeURI("http://www.example.org/a file with spaces.html")

要得到:

http://www.example.org/a%20file%20with%20spaces.html

不要调用encodeURIComponent,因为它会破坏URL并返回

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent()

当您想对URL参数的值进行编码时,请使用encodeURIComponent。

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

然后,您可以创建所需的URL:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

您将获得以下完整的URL:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

请注意,encodeURIComponent不会转义该'字符。一个常见的错误是使用它来创建html属性,例如href='MyUrl',可能会遇到注入错误。如果要从字符串构造html,请使用"而不是使用'属性引号,或添加额外的编码层('可以编码为%27)。



 类似资料:
  • 问题内容: 我是一名C ++程序员,偶尔使用MySQL处理数据库,但是我的SQL知识非常有限。但是,我当然愿意改变这一点。 目前,我正尝试仅通过SQL查询对数据库中的数据进行分析(!)。但是我将放弃,而是将数据导入C 并使用C 代码进行分析。 我已经与同事讨论了这一点,他们也促使我使用C ++,他说SQL并不是用于复杂的分析,而是主要用于导入(从现有表中)和导出(到新表中)数据,还有更多内容。例如

  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 问题内容: 流式XML解析器(例如SAX和StAX)比构建像DOM解析器之类的树结构的解析器更快,内存效率更高。SAX是推送分析器,这意味着它是观察者模式(也称为侦听器模式)的实例。SAX首先出现,然后是StAX- 拉式解析器,这意味着它基本上像迭代器一样工作。 您可以找到在任何地方都偏爱StAX而不是SAX的原因,但是通常可以归结为:“更易于使用”。 在JAXP上的Java教程中,StAX被模糊

  • 问题内容: 在本文中, Nick Coghlan讨论了PEP 435类型的 一些设计决策,以及如何将其子类化以提供不同的体验。 但是,我给出的建议(我是stdlib的主要作者)关于使用元类的建议是,在没有充分好的理由的情况下不应该这样做- 例如,无法使用类装饰器或专用工具来完成所需的工作隐藏任何丑陋的功能;而在我自己的工作,我已经能够做到我需要什么简单的使用,在创建时,和/或正常类/实例方法类:

  • 最近,我收到了在代码中使用's的建议,或者在站点上看到了一些使用's的答案--应该是某种容器。但是--我在C++17标准库里找不到类似的东西。 那么这个神秘的是什么?如果它是非标准的,为什么(或何时)使用它是个好主意?