欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。
本节内容对应《JavaScript高级程序设计》的第五章内容。
在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法。对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象。构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义的。
ECMAScript提供了很多原生引用类型,以便开发人员用以实现常见爱你的计算任务。
1、Object类型:Object类型是ECMAScript中使用最多的一个类型。
- 创建Object实例的方式有两种。
- 第一种是使用new操作符后跟Object构造函数,如下所示:
var person = new Object(); person.name = “Nicholas”; person.age = 29;
- 另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。注意:在通过这种方法创建对象时,实际上并不会调用object的构造函数。
var person = { name:”Nicholas”, age:29 //最后一个属性不加逗号 };
- 第一种是使用new操作符后跟Object构造函数,如下所示:
- Object对象访问属性的方法也有两种:
- 第一种是用点表示法,person.name ,很常用的一种方法。一般除非必须使用变量来访问属性,否则建议使用点表示法。
- 另一种是是使用方括号表示法来访问对象的属性,person["name"] ,该方法的主要优点是可以通过变量来访问属性,eg:var propName = "name" ; alert(person[propName]) ;
2、Array类型:除了Object之外,Array类型恐怕是ECMAScript中最常用的类型了。而且,ECMAScript中的数组与其他多数语言中的数组有着很大的区别。与其他语言不同的是,ECMAScript数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二个位置来保存数值,用第三个位置来保存对象,依次类推。而且,ECMAScript数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
- 创建数组的基本方式有两种:
- 第一种是使用Array构造函数
//直接创建对象 var colors = new Array() ; //创建指定数组大小的数组对象 var nums = new Array(20) ; //预先知道要保存的数据项 var anims = new Array("tiger","cat","dog") ;
- 用数组字面量表示法创建。与Object一样,使用数组字面量表示法也不会调用Array构造函数
//创建一个空数组 var names = []; //创建一个包含三个字符串的数组 var colors = [“red”,”blue”,”green”];
- 第一种是使用Array构造函数
- 数组的length属性不是只读的,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项。
var colors = ["red","blue","green"]; colors.length = 2; alert(colors[2]); //undefined
- 所有对象都具有toLocalString()、toString()和valueOf()方法。其中,调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串;而调用valueOf()返回的还是数组;toLocalString()方法是调用数组中的每一项的toLocalString()方法后拼接成字符串返回。如果数组中的某一项的值是null或者undefined,那么该值在这些方法中返回的结果中以空字符串表示。
- ECMAScript中数组可以表现得像栈(先进后出,插入和删除都发生在栈顶元素)一样,ECMAScript为数组专门提供了push()和pop()方法,以便实现类似栈的行为。其中push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。结合push()和pop()方法,可以像使用栈一样使用数组。
- ECMAScript中数组可以表现得像队列(先进先出,插入发生在队尾,删除发生在队头)一样,ECMAScript为数组专门提供了push()和shift()方法,以便实现类似队列的行为。push()方法和栈中的push()一样的用法,shift()方法是移除数组中的第一个项并返回该项,同时将数组的长度减1。结合push()和shift()方法,可以像使用队列一样使用数组。
- 重排序方法:reverse()和sort()方法。reverse()方法会反转数组。sort()方法默认情况下按升序排列——即最小的值位于最前面,最大的值排在最后面。为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。
var numbers = [0,1,5,10,15]; numbers.sort(); alert(numbers);//0,1,10,15,5
sort()方法可以接收一个比较函数作为参数,以便指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个参数之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。
function compare(value1 , value2){ if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; } } var numbers = [0,1,5,10,15]; var characters = ["A" , "a" , "e" , "b"]; characters.sort(compare); numbers.sort(compare); alert(numbers);//0,1,5,10,15 alert(characters);//A,a,b,e
- 操作方法:concat()方法(返回的是一个包含两个数组所有元素的新数组,不会改变原来数组的值)、slice()方法(截取数组部分元素,只有一个参数时,截取从该参数指定下标的位置到数组末尾的所有元素作为新数组返回,有两个参数(负数表示倒数)时,截取前闭后开的所有元素组成的新数组返回)、splice()方法(很强大的功能):
- splice()的主要用途是向数组的中部插入项,但使用这种方法的方式有如下3种。
删除:可以删除任意数量的项,只需指定两个参数:要删除的第一项的位置和要删除的项数。例如:splice(0,2)会删除数组中的前量项。
插入:可以向指定位置插入任意数量的项,只需提供3个参数:起始位置、0(要删除的项数)和要插入的项。如果插入多个项,可以再传入第四、第五,以至任意多个项。例如:splice(2,0,”red” , “green”),会从当前数组的位置2开始插入字符串”red”和”green”。
替换:可以项指定位置插入任意数量的项,同时删除任意数量的项,只需指定3个参数:其实位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如,splice(2,1,”red”,”green”)会删除当前数组位置2的项,然后再从位置2开始插入字符串”red”和”green”。
splice()方法始终会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何项,则返回一个空数组)。
var numbers = [0,1,2,3]; var removed = numbers.splice(0,1);//删除第一项 alert(numbers);//1,2,3 alert(removed);//0 removed = numbers.splice(1,0,8,9); alert(removed);//返回的是一个空数组 removed = numbers.splice(1,1,5,6); alert(removed);//8
- splice()的主要用途是向数组的中部插入项,但使用这种方法的方式有如下3种。
- 位置方法:indexOf()和lastIndexOf()。这两个函数都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中,indexOf()方法从数组的开头(位置0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1。在比较第一个参数与数组中的每一项时,会使用全等操作符;也就是说,要求查找的项必须严格相等。
- 迭代方法:ECMAScript为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象——影响this的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。根据使用的方法不同,这个函数执行后的返回值可能会也可能不会影响访问的返回值。以下是这5个迭代方法的作用,这些方法都不会修改数组中的包含的值。
- every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
- filter():对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。
- forEach():对数组中的每一项运行给定函数,这个方法没有返回值。
- map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
- some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
var numbers = [0,1,2,3]; var everyResult = numbers.every(function(item , index , array){ return (item > 2); }); alert(everyResult);//false var someResult = numbers.some(function(item , index , array){ return (item > 2); }); alert(someResult);//true
- 缩小方法:reduce()和reduceRight()方法。这两个方法都会迭代数组的所有项,然后构建一个最终返回的值。其中,reduce()方法从数组的第一项开始,逐个遍历到最后。而reduceRight()则从数组的最后一项开始,向前遍历到第一项。这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值。传给reduce()和reduceRight()的函数接收4个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。均不改变原数组的值。
var nums = [1,2,3,4,5,6]; var sum = nums.reduce(function(prev, cur , index , array){ return prev + cur; }); alert(sum);//21 alert(nums);//1,2,3,4,5,6
3、Date类型:ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的。为此,Date类型使用自UTC(CoordinatedUniversal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285616年。
- 要创建一个日期对象,使用new操作符和Date构造函数即可, var now = new Date() ; 返回当前日期和时间。如果想根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数(即从1970年1月1日午夜起至该日期经过的毫秒数)。为了简化这一计算过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC()。 其中Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。Date.UTC()方法同样也返回表示日期的毫秒数,但它与Date.parse()在构建时使用不同的信息。Date.UTC()的参数分别是年份、基于0的月份(一月是0,二月是1,以此类推)、月中的哪一天(1到31)、小时数(0到23)、分钟、秒以及毫秒数。在这些参数中,只有前两个参数(年和月)是必需的。如果没有提供月中的天数,则假设天数为1;如果省略其他参数,则统统假设为0。
//GMT 时间2000年1月1日午夜零时 var y2k = new Date(Date.UTC(2000 , 0)); //GMT时间2005年5月5日下午5:55:55 var allFives = new Date(Date.UTC(2005 , 4 ,5 , 17 , 55 , 55));
- ECMAScript5添加了Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数。这个方法简化了使用Date对象分析代码的工作。
//取得开始时间 var start = Date.now(); //执行某些操作 …… //取得停止时间 var stop = Date.now(); var result = stop – start;
- 与其他引用类型一样,Date类型也重写了toLocalString()、toString()和valueOf()方法;但这些方法返回的值与其他类型中的方法不同。
- toLocalString()方法会按照与浏览器设置的地区相适应的格式返回日期和时间。这大致意味着时间格式中会包含AM或PM,但不会包含时区信息(当然,具体的格式会因浏览器而异)。
- toString()方法则通常返回带有时区信息的日期和时间,其中时间一般以军用时间(即小时的范围是0到23)表示。
- valueOf()方法则根本不返回字符串,而是返回日期的毫秒表示。因此,可以方便使用比较操作符来比较日期值。
- 日期的格式化方法有多种,与toLocaleSTring()和toString()方法一样,这些字符串格式方法的输出也是因浏览器而异的,因此没有哪一个方法能够用来在用户页面中显示一致的日期信息。
- toDateString():以特定于实现的格式显示星期几、月、日和年;
- toTimeString():以特定于实现的格式显示时、分、秒和时区;
- toLocaleDateString():以特定于地区的格式显示星期几、月、日和年;
- toLocaleTimeString():以特定于实现的格式显示时、分、秒;
- toUTCString():以特定于实现的格式完整的UTC日期。
- 日期/时间组件方法
- 直接取得和设置日期值的方法
方法
说明
getTime()
返回表示日期的毫秒数;与valueOf()方法返回的值相同
setTime(毫秒)
以毫秒数设置日期,会改变整个日期
getFullYear()
取得4位数的年份(如2016而非仅16)
getUTCFullYear()
返回UTC日期的4位数年份
setFullYear(年)
设置日期的年份。传入的年份值必须是4位数字
setUTCFullYear(年)
设置UTC日期的年份。传入的年份值必须是4位数字
getMonth()
返回日期中的月份,其中0表示一月,11表示十二月
getUTCMonth()
返回UTC日期中的月份,其中0表示一月,11表示十二月
setMonth(月)
设置日期中的月份。传入的月份值必须大于0,超过11则增加年份
setUTCMonth(月)
设置UTC日期中的月份。传入的月份必须大于0,超过11则增加年份
getDate()
返回日期月份中的天数(1到31)
getUTCDate()
返回UTC日期月份中的天数(1到31)
setDate(日)
设置日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
setUTCDate(日)
设置UTC日期月份中的天数。如果传入的值超过了该月中应有的天数,则增加月份
getDay()
返回日期中星期的星期几(其中0表示星期日,6表示星期六)
getUTCDay()
返回UTC日期中星期的星期几(其中0表示星期日,6表示星期六)
getHours()
返回日期中的小时数(0到23)
getUTCHours()
返回UTC日期中的小时数(0到23)
setHours(时)
设置日期中的小时数,传入的值超过了23则增加月份中的天数。传入的值为负数,则实际值为前一天的24减参数的绝对值小时。
setUTCHours(时)
设置UTC日期中的小时数,传入的值超过了23则增加月份中的天数。传入的值为负数,则实际值为前一天的24减参数的绝对值小时。
getMinutes()
返回日期中的分钟数(0到59)。
getUTCMinutes()
返回UTC日期中的分钟数(0到59)。
setMibutes(分)
设置日期中的分钟数,传入的值超过59则增加小时数
setUTCMinutes(分)
设置UTC日期中的分钟数,传入的值超过59则增加小时数
getSeconds()
返回日期中的秒数(0到59)
getUTCSeconds()
返回UTC日期中的秒数(0到59)
setSeconds(秒)
设置日期中的秒数,传入的值超过59则增加分钟数
setUTCSeconds(秒)
设置UTC日期中的秒数,传入的值超过59则增加分钟数
getMilliseconds()
返回日期中的毫秒数
getUTCMilliseconds()
返回UTC日期中的毫秒数
setMilliseconds(毫秒)
设置日期中的毫秒数
setUTCMilliseconds(毫秒)
设置UTC日期中的毫秒数
getTimezoneOffset()
返回本地时间与UTC时间相差的分钟数。
- 直接取得和设置日期值的方法
4、RegExp类型:ECMAScript通过RegExp类型来支持正则表达式。使用下面类似Perl的语法,就可以创建一个正则表达式。 var expression =/pattern/flags; 其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可以有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志:
- g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
- i:表示不区分大小写模式(case-insensitive)模式,即在确定匹配时忽略模式与字符串的大小写;
- m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找系一行中是否存在与模式匹配的项。
//匹配第一个“bat”或“cat”,不区分大小写 var pattern2 = /[bc]at/i;
- 与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括( [ { \ ^ $ | ) ? * + . ] },这些元字符在正则表达式中都有一或多种特殊用途,因此想如果想要匹配字符串中包含的这些字符就必须对它们进行转义。
- RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。通过这些属性可以获知一个正则表达式的各方面信息,但却没有多大用处,因为这些信息全部包含在模式声明中。
- global:布尔值,表示是否设置了g标志。
- ignoreCase:布尔值,表示是否设置了i标志。
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
- multiline:布尔值,表示是否设置了m标志。
- source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
- RegExp对象的主要方法是exec(),该方法是专门为捕获组而设计的。exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性:index和Input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项。
- 正则表达式的第二个方法是test(),它接收一个字符串参数。在模式与该参数匹配的情况下返回true;否则,返回false。在只想知道目标字符串与某个模式是否匹配,但不要知道其文本内容的情况下,使用这个方法非常方便。因此,test()方法经常被用在if语句中。
- RegExp实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。
- 正则表达式的valueOf()方法返回正则表达式本身。
- 正则表达式的各种局限性的详细内容参见http://blog.csdn.net/goskalrie/article/details/51517913
5、Function类型:在ECMAScript中函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的。函数是对象,函数名是指针。
function sum(num1 , num2){ returnnum1 + num2; } //这与下面使用函数表达式定义函数的方式几乎相差无几 var sum = function(num1 , num2){ returnnum1 + num2; }; //注意末尾有分号 alert(sum(10,15)) ; //25 var sum2 = sum ; alert(sum2(10,15)) ; //25 sum = null ; alert(sum2(10,15)) ; //25
- ECMAScript中没有函数重载的概念,声明多个同名的函数,即使传入的参数的个数不一样,该名字也只属于最后一个被解析的函数。
function sum(num1){ return num1 + 10; } function sum(num1 , num2){ return num1 + num2; } alert(sum(10)) ; //NaN alert(sum(10,30)); //40
- 解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
alert(sum(10 , 20));//30 function sum(num1 , num2){ return num1 + num2; } //alert(add(10 , 20)); //报错,停止向下解析执行 var add = function(sum1 , sum2){ return sum1 + sum2; }; alert(sum(10 , 20)); //30
- 因为ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。将函数作为返回值返回是一种极为有用的技术,例如在数组排序时需要项sort()方法中传入一个比较函数,如果想在传入的函数中指定排序的方式,则可以如下进行操作:
function createComparisonFunction(propertyName){ return function(object1,object2){ var value1 = object1[propertyName] ; var value2 = object2[propertyName] ; if(value1 < value2){ return -1 ; }else if(value1 > value2){ return 1 ; }else{ return 0 ; } } } var data = [{name:"Zachary", age:"23"}, {name:"Nicholas", age:"26"}] ; data.sort(createComparisonFunction("name")) ; alert(data[0].name) ; //Nicholas data.sort(createComparisonFunction("age")) ; alert(data[0].name) ; //Zachary
- 在函数内部,有两个特殊的对象:arguments和this。其中arguments是一个类数组对象,包含着函数中的所有参数。虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数,看下面的经典的阶乘函数:
function factorial(num){ if(num <=1){ return 1; }else{ return num*factorial(num-1); } } alert(factorial(5)); //120 //利用arguments的callee的属性 function factorial(num){ if(num <=1){ return 1; }else{ return num*arguments.callee(num-1); } } alert(factorial(5));//120
函数内部的另一个特殊对象是this,其行为与Java和C#中的this大致类似。换句话说,this引用的是函数执行的环境对象——或者也可以说是this值(当在网页的全局作用域中调用函数时this对象引用的就是winsow)。
- ECMAScript 5 也规范化了另一个函数对象的属性:caller。除了Opera的早期版本不支持,其他浏览器都支持这个ECMAScript3并没有定义的属性。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。
function outer(){ inner(); } function inner(){ alert(inner.caller); //代码会导致警告框中显示outer()函数的源代码。 //因为outer()调用了inner(),所以inner.caller就指向outer()。 } outer();
- ECMAScript中的函数是对象,因此函数也有属性和方法。每个函数都包含两个属性length和prototype。其中length属性表示函数希望接收的命名参数的个数。对于ECMAScript中的引用类型而言,proptotype是保存它们所有实例方法的真正所在。换句话说,诸如toString()和valueOf()等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型即实现继承时,prototype属性的作用是极为重要的。在ECMAScript5中,prototype属性是不可枚举的,因此使用for-in无法发现。
- 没个函数都包含两个非继承而来的方法:apply()和call(),这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。call()方法与apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都是直接传递给函数。换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来。事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。使用call()或apply()来扩充作用域的最大好处就是对象不需要与方法有任何耦合关系。
- ECMAScript5还定义了一个方法bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
- 每个函数继承的toLocaleString()和toString()方法始终都返回函数的代码。返回代码的格式因浏览器而异。
6、基本包装类型:为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean、Number和String。这些类型与其它引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。对于每个不同的包装类型都有很多对应的操作方法,我们可以通过一些API文档进行深入的学习和掌握。特别是Number和String类型的很多方法,我们会经常用到的。
7、单体内置类型:ECMA-262对内置对象的定义是“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”意思就是说,开发人员不必显式地实例化内置对象,因为它们已经实例化了。前面已经介绍了大多数内置对象,如Object、Array和String。ECMA-262还定义了两个单体内置对象Global和Math。
- Global(全局)对象可以说是ECMAScript中最特别的一个对象了,因为不管从什么角度上看,这个对象都是不存在的。ECMAScript中的Global对象在某种意义上是作为一个终极的“兜底对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。试试上,没有全局变量和全局函数;所有在全局作用域中定义的属性和函数,都是Global对象的属性。前面介绍过的那些函数,诸如isNaN()、isFinite()、parseInt()以及parseFloat(),实际上全都是Global对象的方法。除此之外,Global对象还包含其它一些方法。
- ECMAScript还为保存数学公式和信息提供了一个公共位置,即Math对象。与JavaScript直接编写的计算功能相比,Math对象提供的计算功能执行起来要快得多。Math对象中还提供了辅助完成这些计算的属性和方法。