Global对象

版权声明:(๑╹◡╹)ノ""" https://blog.csdn.net/qq_41218152/article/details/82763132

Gloabal对象

一、相关概念

  1. Global(全局)对象可以说是ECMAScript中最特别的一个对象,因为不管从什么角度看,这个对象都是不存在的
  2. 不属于任何其他对象的属性和方法,最终都是它的属性和方法
  3. 事实上,没有全局变量或全局函数;所有在全局作用域中定义的属性和方法,都是Global对象的属性
  4. isNaN()ifFinite()parseInt()以及parseFloat(),实际上都是Global对象的方法

二、URI编码方法

(一).相关概念

  1. Global对象的encodeURI()encodeURIComponent()方法可以对URI(Uniform Resource Identifiers,通用资源标识符)进行编码,以便发送给浏览器
  2. 有效的URI中不能包含某些字符,例如空格
  3. 而这两个URI编码方法可以对URI编码,它们用特殊的UTF-8编码替换编码所有无效字符,以便浏览器能够接受和理解

(二).encodeURI()和encodeURIComponent()

  1. encodeURI()主要用于整个URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()主要用于对URI中的某一段(illegal value.htm)进行编码
  2. encodeURI()不会对本身属于URI大的特殊字符进行编码,例如冒号、正斜杠、问号和井号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码
	var uri="http://www.wrox.com/illegal value.htm#start";
    console.log(encodeURI(uri));
    console.log(encodeURIComponent(uri));
     /*使用encodeURI()编码后的结果是除了空格以外的其他字符都不变,只有空格被替换成了%20。而encodeURIComponent()方法则会使用对应的编码替换所有非字母数字的字符*/
     /*因此对整个URI使用encodeURI(),而对附加在现有的URI后面的字符串使用encodeURIComponent()*/

在这里插入图片描述

(三).decodeURI()和decodeURIComponent()

  1. encodeURI()encodeURIComponent()方法对应的两个方法分别是decodeURI()decodeURIComponent()
  2. decodeURI()只能对encodeURI()替换的字符进行编码。例如,它可将%20替换成一个空格,但不会对%23做任何处理,因为%23表示井号(#),而井号不是用encodeURI()替换的
  3. decodeURIComponent()能够解码使用encodeURIComponent()编码的所有字符,即它可以解码任何特殊字符的编码
  4. URI方法encodeURI()encodeURIComponent()decodeURI()decodeURIComponent()用于替代已经被ECMA-262第3版废弃的escape()unescape()方法
  5. URI方法能够编码所有Unicode字符,而原来的方法只能正确得编码ASCII字符。因此在开发实践中,特别是产品级的代码中,一定要使用URI方法,不要使用escape()unescape()方法
	 var uri="http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start";
    console.log(decodeURI(uri));
    console.log(decodeURIComponent(uri));
    /**/这里,变量包含一个有encodeURIComponent()编码的字符串。在第一次调用decodeURI()输出的结果中,只有%20被替换成可空格。*/
    /*而在第二次调用decodeURIComponent()输出的结果中,所有特殊字符的编码都被替换成了原来的字符,得到了一个未经转义的字符串(但这个字符串并不是一个有效的URI)*/

在这里插入图片描述

三、eval()方法

  1. eval()方法就像是一个完整的ECMAScript解析器,它只接受一个参数,即要执行的ECMAScript字符串
  2. 当解析器发现代码中调用eval()方法时,它会将传入的参数当做实际的ECMAScript语句来解析,然后把执行结果插入到原位置
  3. 通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链
	eval("alert('hi')");
	//这行代码等价于
	alert("hi");
  1. 通过eval()执行的代码可以引用在包含环境中定义的变量
	var msg="hello world";
	eval("alert(msg)");   //"hello world"
	/*变量msg是在eval()调用的环境之外定义的,但其中调用的alert()仍然能够显示"hello world"。这是因为上面的第二行代码最终被替换成了一行真正的代码*/
  1. 可以在eval()调用定义一个函数,然后在该调用的外部代码中引用这个函数
	eval("function sayHi(){alert('hi');}");
	sayHi();
	/*函数sayHi()是在eval()内部定义的。但由于对eval()的调用最终会被替换成定义函数的实际代码,因此可以在下一行调用sayHi()。对于变量也一样*/
	eval("var msg='hello world';");
	alert(msg);//"hello world"
  1. eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只在eval()执行的时候创建
  2. 严格模式下,在外部访问不到eval()中创建的任何变量或函数,因此前面的两个例子都会导致错误,在严格模式下,为eval赋值也会导致错误
	"use strict";
	eval="hi";  //causes error
  1. 能够解释代码字符串的能力非常强大,单也非常危险。因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁站点或应用程序的代码(所谓大的代码注入)

四、Global对象的属性

  1. 特殊的值undefinedNaN以及Infinity都是Global对象的属性。此外,所有原生引用类型的构造函数,像ObjetctFuction,也都是Global对象的属性
  2. ECMAScript 5明确禁止给undefinedNaNInfinity赋值,这样做即使在非严格模式下也会导致错误
属性 说明 属性 说明
undefined 特殊值undefined Date 构造函数Date
NaN 特殊值NaN RegExp 构造函数RegExp
Infinity 特殊值Infinity Error 构造函数Error
Object 构造函数Object EvalError 构造函数EvalError
Array 构造函数Array RangError 构造函数RangError
Function 构造函数Function ReferenceError 构造函数ReferenceError
Boolean 构造函数Boolean SyntaxError 构造函数SyntaxError
String 构造函数String TypeError 构造函数TypeError
Number 构造函数Number URIError 构造函数URIError

五、window对象的属性

  1. ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分来加以实现的
  2. 因此,在全局作用域中声明的所有变量和函数,就都成了window对象的属性
	var color="red";
	function sayColor(){
		alert(window.color);
	}
	window.sayColor();  //"red"
	/*这里定义了一个名为color的全局变量和一个名为sayColor()的全局函数。在sayColor()内部,可以通过window.color来访问color变量 ,以说明全局变量是window对象的属性。然后又使用window.sayColor()来直接通过window对象调用这个函数,结果就显示在了警告框中*/
  1. 另一种取得Global对象的方法如下:
	var global=function(){
		return this;
	}();
/*以上代码创建了一个立即调用的函数表达式,返回this的值。如前所述,在没有给函数明确指定this值的情况下(无论通过将函数添加为对象的方法,还是通过调用call()或apply(),this值等于Global对象*/
/*而像这样通过简单地返回this来取得Global对象,在任何执行环境下都是可行的*/

源自
源于《JavaScript高级程序设计》

猜你喜欢

转载自blog.csdn.net/qq_41218152/article/details/82763132