1、全局对象
全局对象指的是js解释器在启动的时候,创建的一个全局的对象,并给他一组初始属性,全局对象的属性是全局定义的符号,js可以直接调用。
他的初始属性有:
全局属性,比如undefined、Infinity、NaN等
全局函数,比如isNaN(),parseInt()
构造函数,Date()、RegExp()、String()等等
全局对象JSON的的序列化等(这个和函数有点不同,是把值放在序列化的括号里)
当然如果用浏览器来运行js脚本的话,Window对象(也就是Window端全局对象)定义了一些额外的全局属性。
在代码的最顶级,用this引用全局对象;
var global = this;
如果是window端的话,可以用window属性引用Window对象自身。
预定义的时候,全局对象定义了预定义的全局值,每声明一个全局变量,就是增加了全局对象的一个属性。
2、包装对象
我们都知道js有两种数类型,原始数据类型和对象数据类型。
针对于对象数据类型,我们通过.的方式引用他的属性。
而当属性是一个函数的时候,我们称这个属性为这个对象的方法,通过o.m()来进行调用。
我们知道字符串、数字、和布尔值都是原始的数据类型,但js中对于这些原始的数据类型也有一些方法进行调用。
它通过的方法是,构造一个临时的对象、也叫包装对象。
那么,它是怎么实现的呢?
他调用了全局对象的构造函数属性,众所周知,全局对象的属性是全局定义的符号,js程序可以直接使用,比如我们常常用的NaN全局属性,全局函数属性parseInt()等等,那么构造函数也是可以调用的。
而我们只要调用了原始数据类型s的属性,js就会把字符串通过调用new String(s)这样一个构造函数转化为对象,这个对象会继承字符串的方法(我对这儿的理解是,String()包装成的对象继承构造函数自带有的自有属性方法),创建的对象继承了构造函数的方法,不然原本的字符串是原始数据类型,根本没有属性可以继承。
在创建包装对象之后,这个对象被用来处理对象的引用,一旦引用结束,这个新创建的包装对象就会被销毁。
同样的,数字和布尔值也有各自的方法,并通过Number()和Boolean()构造函数创建临时对象。
而null和undefined没有包装对象,访问他们的属性会造成类型错误。
看一个题:
var s = "test";//创建一个字符串
s.len = 4;//给它设置一个属性
var t = s.len;//查询这个属性
运行之后我们会发现,t的值为undefined;
因为第二行在创建完属性之后并负责,对象就销毁了,之后根本查不到这个对象的属性。
也就是说,不要试图给包装对象的属性赋值,那都是无用功。他们的属性都是只读的,我们也只是用他们只读的属性。
我们也可以自己创建包装对象:
var s = “test”;
var S = new String();
在比较时:s和S用等于=是相等的,但用全等===是不等的。用typeof运算符可以看出他们的不用。