null是javascript语言的关键字,它表示一个特殊值“空值”,对于null执行typeof()运算,返回object.也就是说,可以将null认为是一个特殊的对象值,含义是"非对象"。但实际上,通常认为null是它自由类型的唯一一个成员。它可以表示数字,字符串,和对象是“无值”的。大多数编程语言和javascript一样含有null,你可以对null或者nil很熟。
javascript还有第二个值表示值的空缺。用来表示更深层次的“空值”。它是一种变量的一种取值。表示变量的没有初始化。如果要查询对象属性或数组元素的值是返回undefined则表明这个属性或者元素不存在。undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是未定义。如果使用typeof来测试undefined类型,则返回“undefined”,表明这个值是这个类型的唯一成员。
尽管null和undefined是不同的,但它们都表示“值的空缺”,两者往往可以互换。判断相等的运算符“==”认为两者是相等的(要使用严格相等运算符"==="来区分它们)。在希望值是布尔类型的地方它们的值都是假值。和false类似。null和undefined都是不包含任何属性和方法。实际上,使用"."和"[]"来存取这两个值的成员或方法,都会产生一个类型错误。
你或许认为undefined是表示系统级的,出乎意料的活类似错误的值的空缺,而null是表示程序级的,正常或在意料之中的值的空缺,如果你想将它们复制变量或者属性,或将它们作为参数传入函数,null是最佳的选择。
5.全局对象
前几节讨论了javascript的元素类型和原始值。对象类型——对象、数组和函数/但有一类非常重要的对象,不得现在就必须将清楚:全局对象
全局对象(global object)在javascript中有着重要的用途。全局对象的属性是全局定义的符号。javascript程序可以直接使用。当javascript解释器启动时,它将新建一个新的全局对象,并给它一组定义的初始属性。
全局属性 比如undefined Infinty和NaN
全局函数 比如isNaN()、parseInt()和eval()
构造函数,比如Date()、RegExp()、String()、Object()和Array()
全局对象,比如Math 和JSON
全局对象的初始属性并不是保留字,但他们应当当做保留字来对待。
在代码的最顶级——不在任何函数内的javascript代码,可以通过javascript关键字来引用全局对象。
var global = this; //定义一个引用全局对象的全局变量。
在客户端javascript中,window对象充当了全局对象,这个全局window对象有一个熟悉window引用其本身,它可以代替this来引用全局对象,window定义了全局核心属性。但也征对web浏览器和和互动javascript定义了一部分其他全局属性。
当初次创建时,全局对象定义了javascript中所有的预定义全局值,这个特殊对象同样包含了为程序定义的全局值。如果代码声明了一个全局变量。这个全局变量就是全局对象的一个属性。
6.包装对象
javascript对象是一种复合值:它是属性或已命名值的集合。通过"."来引用属性值,当属性值是一个函数的时候,陈其为方法,通过o.m()来调运对象o中的方法。
我们看到字符串也同样具有属性和方法。
复制代码 代码如下:
var s ="hello world";
var word = s.substring(s.indexOf("")+1,s.length);//使用字符串的属性。
document.write(word) //"ello world"
字符串既然不是对象,为什么它有属性呢?只要引用了字符串s的属性,javascript就会将字符串的值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法。并被用来处理属性引用。一旦新的属性引用出来。一但引用结束,这个新创建的对象就会被销毁。(实际上并不一定创建或销毁这个临时对象,然而这个过程看起来是这样的。)
如同字符串一样,数字和布尔值也具有各自的方法,通过Number()和Boolean()构造函数创建一个临时对象。这些方法的调用均是来自于这个临时对象。(null和undefined没有包装过对象,访问他们的属性会有一个类型错误)
看如下 代码,思考他们的执行过程
复制代码 代码如下:
var s = "test";
s.len = 4; //给它设置一个属性
var t = s.len //查找这个属性
当运行这段代码时,t的值是undefined,第二行代码创建一个临时字符串对象,并给len的值为4,随即销毁这个对象,第三行用过原始(没有被修改的)的字符串创建一个新的字符串对象,并尝试读取len 的属性。