JavaScript速记3 —— 全局对象和包装对象

来源:互联网 发布:jsp加载时调用js 编辑:程序博客网 时间:2024/05/20 18:53

JavaScript中的对象类型包括对象、数组和函数,后续会陆续介绍到。这里我们将介绍两种特殊的对象,全局对象和包装对象。

全局对象

当JavaScript解释器启动时,它将创建一个新的全局对象,并给它一组定义的初始属性:
  • 全局属性,例如undefined、Infinity和NaN。
  • 全局函数,例如isNaN()、parseInt()和eval()。
  • 构造函数,例如Date()、RegExp()、String()、Object()和Array()。
  • 全局对象,例如Math和JSON。
在代码的最顶级,可以使用JavaScript关键字this来引用全局对象。在客户端JavaScript中,在其表示的浏览器窗口中的所有JavaScript代码中,Window对象充当了全局对象。这个全局对象有个window属性引用其自身,它可以替代this来引用全局对象。Window对象定义了核心全局属性,但它也针对Web浏览器和客户端JavaScript定义了一少部分其他全局属性。
当初次创建是,全局对象定义了JavaScript中所有的预定义全局值。这个特殊对象同样包含了为程序定义的全局值。如果代码声明了一个全局变量,这个全局变量就是全局对象的一个属性。

包装对象

在介绍包装对象前,首先我们思考下如下代码的执行结果:
var s = "hello";s.len = 4;var t = s.len;console.log(t);
这段代码的运行结果为undefined。有两个问题值得我们思考,一个是字符串不是对象,为什么可以设置属性?另外一个问题就是问什么结果是undefined?
首先来看第一个问题,只要引用了字符串s的属性,JavaScript就会将字符串的值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。同字符串类似,数字和布尔值也有自己的方法,可以通过Number()和Boolean()构造函数创建各自的对象,我们称这样的对象为包装对象。另外,mull和undefined没有包装对象,访问它们的属性会造成一个类型错误。
再来看第二个问题,就然有了包装对象,为什么访问它的属性是返回undefined呢?这是因为包装对象是一个临时对象,一旦属性引用结束,这个包装对象就会被销毁。第三行创建了一个新的临时对象,这时候属性len是不存在的,尝试读取一个不存在的属性值,自然会返回undefined。
为了更好的理解包装对象的含义,思考以下代码的执行结果:
var s = "hello";console.log(s.length); // 5s.length = 2;console.log(s.length); // 5
需要注意的是,可以通过String()、Number()或Boolean()构造函数来显式的创建包装对象。JavaScript会在必要时,将包装对象转换成原始值。“==”运算符将原始值和其包装对象视为相等,但“===”运算符将它们视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。
0 0