首页 > 代码库 > JS基础知识回顾:引用类型(六)

JS基础知识回顾:引用类型(六)

ECMA-262对内置对象的定义是:由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。

开发人员不必显式的实例化内置对象,因为他们已经实例化了。

前面我们已经介绍了大多数内置对象,如Object、Array、String,ECMA-262还定义了两个单体内置对象:Global和Math。

 

Global对象可以说是ECMAScript中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。

实际上并没有全局变量或全局属性,所有在全局作用域中定义的属性和函数,都是Global对象的属性。

换句话说,不属于任何其他对象的属性和方法,最终都是全局对象的属性和方法。

例如isNaN()、isFinite()、parseInt()、parseFloat()实际上都是Global对象的方法,除此之外,它还包含其他一些方法。

 

encodeURI()和encodeURIComponent()方法可以对URI(Uniform Resoure Identifiers,通用资源标识符)进行编码,以便发送给浏览器。

有效的URI中不能包含某些字符,例如空格,而这两个编码方法可以对URI进行编码,用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。

encodeURI()主要用于整个URI,而encodeURIComponent()主要用于对URI中的某一段进行编码。

他们的主要区别在于,encodeURI()不会对本身属于URI的特殊字符进行编码,而encodeURIComponent()则会对它发现的任何非标准字符进行编码(非字母数字)。

与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和decodeURIComponent()。

其中decodeURI()只能对使用encodeURI()替换的字符进行解码,decodeURIComponent()能够对使用encodeURIComponent()替换的字符进行解码。

以上四种方法用于替换已经被ECMA-262废弃的escape()和unescape()方法。URI方法能够编码所有Unicode字符,而原来的方法只能正确的编码ASCII字符,因此开发时一定要用以上四种方法。

 

eval()方法类似于一个完整的ECMAScript解析器,它接收一个参数,即要执行的ECMAScript字符串。

当解析器发代码中调用eval()方法时,它会将传入的参数当做实际的ECMAScript语句来解析,然后把执行结果插入到原位置。

通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。

这就意味着通过eval()执行的代码可以引用在包含环境中定义的变量。

var msg="hello world";

eval("alert(msg)");//"hello world",此处在eval()方法中调用在其环境之外定义的变量msg

eval("function sayHi(){alert(‘lalala‘);}");

sayHi();//"lalala",此处调用在eval()方法中定义的函数

eval("var msg=‘aaa‘;");

alert(msg);//"aaa",此处访问在eval()方法中定义的变量

在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,他们被包含在一个字符串中,它们只在eval()执行的时候创建。

严格模式下,在外部访问不到eval()中创建的变量或者函数,因此前面两个例子都会导致错误,同样在严格模式下,为eval赋值也会导致错误。

为了防止代码注入,在使用此方法时应格外谨慎。

 

所有的特殊值以及原生引用类型的构造函数都是Global对象的属性。

undefined     特殊值undefined               Date                 构造函数Date

NaN             特殊值NaN                       RegExp             构造函数RegExp

Infinity         特殊值Infinity                   Error                 构造函数Error

Object          构造函数Object                EvalError           构造函数EvalError

Array           构造函数Array                  RangeError        构造函数RangeError

Function       构造函数Function             ReferenceError   构造函数ReferenceError

Boolean        构造函数Boolean              SyntaxError      构造函数SyntaxError

String           构造函数String                TypeError         构造函数TypeError

Number         构造函数Number             URIError           构造函数URIError

ECMAScript5明确禁止给undefined、NaN、Infinity赋值,这样做即使在非严格模式下也会导致错误。

 

ECMAScript中虽然没有明确指出如何访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。

因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。

var color="red";

function sayColor(){alert(window.color);}

window.sayColor();//"red"

另一种取得Global对象的方法是使用以下代码:

var global=function(){return this;}();

在没有给函数明确指定this值的情况下,this值等于Global对象。而像这样通过简单的返回this取得Global对象,在任何执行环境下都是可行的。

 

ECMAScript还为保存数学公式和信息提供了一个公共位置,即Math对象。

与我们在JavaScript直接编写的计算功能相比,Math对象提供的计算功能执行起来要快得多。

 

Math对象包含的属性大都是数学计算中可能会用到的特殊值:

Math.E               自然对数的底数,即常量e的值

Math.LN10         10的自然对数

Math.LN2           2的自然对数

Math.LOG2E       以2为底e的对数

Math.LOG10E     以10为底e的对数

Math.PI              ∏的值

Math.SQRT1_2   1/2的平方根

Math.SQRT2       2的平方根

 

min()和max()方法用于确定一组数值中的最小值和最大值,这两个方法都可以接收任意多个数值参数。

var max=Math.max(3,54,32,16);

alert(max);//54

var min=Math.min(3,54,32,16);

alert(min);//3

要找到数组中的最大或最小值,可以使用apply()方法。

var values=[1,2,3,4,5,6,7,8];

var max=Math.max.apply(Math,values);

这个技巧的关键是把Math对象作为apply()的第一个参数,从而正确的设置this值,然后可以将任何数组作为第二个参数。

 

Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数

Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数

Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数(数学中的舍入规则)

Math.random()方法返回大于等于0小于1的一个随机数,对于某些站点来讲,这是一个非常实用的方法,因为可以利用它来随机显示一些名人名言和新闻事件。

套用下面的公式,就可以利用Math.random()从某个整数范围内随机选择一个值。

值=Math.floor(Math.random()*可能值的总数+第一个可能的值)

如果想要选择一个1到10之间的数值,可以像下面这样编写代码:

var num=Math.floor(Math.random()*10+1);//总共有10个可能的值,而第一个可能的值是1

var num=Math.floor(Math.random()*9+2);//总共有9个可能的值,第一个可能的值是2

function selectForm(lowerValue,upperValue){//接受两个参数,应该返回的最大值和最小值

  var choices=upperValue-lowerValue+1;//最大值减去最小值加上1得到可能值的总数

  return Math.floor(Math.random()*choices+lowerValue);

}

var num=selectFrom(2,10);

alert(num);//介于2到10之间的一个数值(包括2和10)

var colors=["red","green","blue","yellow","black","purple","brown"];

var color=colors[selectFrom(0,colors.length-1)];

alert(color);//数组中包含的任意字符串

 

Math对象中还包含其他一些与完成各种简单或复杂计算有关的方法。

Math.abs(num)             返回num的绝对值

Math.exp(num)             返回Math.E的num次幂

Math.log(num)              返回num的自然对数

Math.pow(num,power)   返回num的power次幂

Math.sqrt(num)             返回num的平方根

Math.sin(x)                   返回x的正弦值

Math.cos(x)                  返回x的余弦值

Math.tan(x)                  返回x的正切值

Math.asin(x)                 返回x的反正弦值

Math.acos(x)                返回x的反余弦值

Math.atan(x)                返回x的反正切值

Math.atan2(x,y)            返回y/x的反正切值