ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JS单例内置对象

2022-06-21 09:01:17  阅读:223  来源: 互联网

标签:编码 内置 console 单例 URI JS eval encodeURIComponent log


ESMA-262内置对象的定义是“任何由ECMAScript实现提供、与宿主环境无关,并在ECMAScript程序开始执行时就存在的对象”。这就意味着,开发者不用显式实例化内置对象,因为它们已经实例化好了。前面我们已经接触了大部分内置对象,包括Object、Array和String。本节介绍ECMA-262定义的另外两个单例内置对象:Global和Math。

 

  Global对象是ECMAScript中最特别的对象,因为代码不会显式地访问它。ECMA-262规定Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法。事实上,不存在全局变量或全局函数这种东西。在全局作用域中定义的变量和函数都会变成Global对象的属性。本书前面介绍的函数,包括isNaN(),isFinite()、parseInt()和parseFloat(),实际上都是Global对象的方法。除了这些,Global对象上还有另外一些方法。

1、URL编码方式

  encodeURL()和encodeURIComponent()方法用于编码统一资源标识符(URI),以便传给浏览器,有效的URI不能包含某些字符,不如空格。使用URI编码方法来编码URI可以让浏览器能够理解它们,同时又以特殊的UTF-8编码替换掉所有无效字符。

  encodeURI()方法用于对整个URI进行编码,比如‘www.wrox.com/illegal value.js’。而encodeURIComponent()方法用于编码URI中单独的组件,比如前面URL中的’illegal value.js‘。这两个方法的主要区别是,encodeURI()不会编码属于URL组件的特殊字符,比如冒号、斜杠、问号、并号,而encodeURIComponent()会编码它发现的所有非标准字符。来看下面的例子:

let uri="http://www.wrox.com/illegal value.js#start";

//"http://www.wrox.com/illegal%20value.js#start"
console.log(encodeURI(uri));

//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"
console.log(encodeURIComponent(uri));

这里使用encodeURI()编码后,除空格被替换为%20之外,没有任何变化。而ecodeURIComponent()方法将所有非字母字符都替换成了相应的编码形式。这就是使用encodeURI()编码整个URI,但只使用encodeURIComponent()编码那些会追加到已有URI后面的字符串的原因。

注意:一般来说,使用encodeURIComponent()应该比使用encodeURI()的频率更高,这是因为编码查询字符串参数比编码基准URI的次数更多。

与encodeURI()和encodeURIComponent()相对的是decodeURI()和decodeURIComponent()。decodeURI()只对使用encodeURI()编码过的字符解码。例如,%20会被替换为空格,但%23不会被替换为井号(#),因为井号不是由encodeURI

()替换的。类似地,decodeURIComponent()解码所有被encodeURIComponent()编码的字符,基本上就是解码所有特殊值。来看下面的例子:

let uri="http%3A%2F%2F
www.wrox.com%2Fillegal%20value.js%23start";

//http%3A%2F%2Fwww.wrox.com%2Fillegal value.js%23start
console.log(decodeURI(uri));

//http:// www.wrox.com/illegal value.js#start
console.log(decodeURIComponent(uri));

这里,uri变量中包含一个使用encodeURIComponent()编码过的字符串。首先输出的是使用decodeURI()解码的结果,可以看到只用空格替换了%20。然后是使用decodeURIComponent()解码的结果,其中替换了所有特殊字符,并输出了没有包含任何转义的字符串。

注意:URI方法encodeURI()、encodeURIComponent()编码过的字符串。首先输出的是使用decodeURI()解码的结果,可以看到只用空格替换了%20.然后是使用decodeURIComponent()解码所有被encodeURIComponent()编码的字符,基本上ius解码所有特殊值。来看下面的例子:

let uri="http%3A%2F%2F
www.wrox.com%2Fillegal%20value.js%23start";

//http%3A%2F%2Fwww.wrox.com%2Fillegal value.js%23start
console.log(decodeURI(uri));

//http://www.wrox.com/illegal value.js#start
console.log(decodeURIComponent(uri));

这里,uri变量中包含一个使用encodeURIComponent()编码过的字符串。首先输出的是使用decodeURI解码的结果,可以看到只用空格替换了%20。然后时使用decodeURIComponent()解码的结果,其中替换了所有特殊字符,并输出了没有包含任何转义的字符串。

注意:URI变量中包含了一个使用encodeURIComponent()编码过的字符串。首先输出的是使用decodeURI()解码的结果,可以看到只用空格替换了%20。然后是使用decodeURIComponent()解码的结果,其中替换了所有的特殊字符,并输出了没有包含任何转义的字符串。(这个字符串不是有效的URL)

同时:URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent()取代了escape()和unescape()方法,后者在ECMA-262第三版中就已经废弃了。URI方法始终是首选方法,因为它们对所有Unicode字符进行编码,而原来的方法只能正确编码ASCII字符。不要在生产环境中使用escape()和unescape()。

 

2、eval()方法⭐⭐⭐

gobal中最后一个方法可能是整个ECMAScripte语言中最强大的了,它就是eval()。这个方法就是一个完整的ECMAScript解释器,它接收一个参数,即一个要执行的ECMAScript(JavaScript)字符串。来看一个例子:

eval("console.log('hi')");
上面这行代码的功能与下一行等价
console.log("hi");

当解释器发现eval()调用时候,会将参数解释为实际的ECMASCript语句,然后将其插入到该位置。通过eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的的作用域链。这意味着定义在包含上下文中的变量可以在eval()调用内部被引用,比如下面这个例子:

let msg='hello world';
eval("console.log(msg)");      //'hello world'

这里,变量msg是在eval()调用的外部上下文中定义的,而console.log()显示了文本“hello world”。这是因为第二行代码会被替换成一行真正的函数调用代码。类似地,可以在eval()内部定义一个函数或者变量,然后再外部代码中引用,如下所示:

eval("function sayHi(){console.log('hi')}");
sayHi();

这里,函数sayHi()是在内部定义的。因为该调用会被替换成真正的函数定义,所以才可以在下一行代码中调用sayHi()。对于变量也是一样的

eval("let msg='hello world'");
console.log(msg)     //Reference Error:msg is not defined

通过eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在eval()执行的时候才会被创建。

在严格模式下,在eval()内部创建的变量和函数无法被外部访问。换句话说,最后两个例子会报错。同样,在严格模式下,赋值给eval也会导致错误;

"use strict";
eval='hi';

注意:解释代码字符串的能力是非常强大的,但也非常危险。在使用eval()的时候必须极为慎重,特别是在解释用户输入的内容时候。因为这个方法会对XSS利用暴露出很大的攻击面。恶意用户可能会插入会导致你网站或者应用崩溃的代码。

 

标签:编码,内置,console,单例,URI,JS,eval,encodeURIComponent,log
来源: https://www.cnblogs.com/jaetyn/p/16394194.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有