JS引用类型(6)——单体内置对象类型
【7】单体内置对象
内置对象:由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。
(1)Global对象
在所有代码执行前,作用域中就已经存在两个内置对象:Global和Math。在大多数ECMAScript实现中都不能直接访问Global对象;不过,web浏览器实现了承担该角色的window对象。全局变量和函数都是Global对象的属性。
不属于任何其他对象的属性和方法,最终都是它的属性和方法;所有在全局作用域中定义的属性和函数,都是Global对象的属性;诸如isNaN()、isFinite()、parseInt()以及parseFloat(),都是Global对象的方法。
1》URL编码方法
Global对象的encodeURL()和encodeURLComponent()方法可以对URI(通用资源标识符)进行编码,以便发送给浏览器。有效的URI中不能包含某些字符,例如空格。而这两个URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。
其中,encodeURL()主要用于整个URI,而encodeURLComponent()主要用于对URI中的某一段进行编码。它们的主要区别在于,encodeURL()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURLComponent()则会对它发现的任何非标准字符进行编码。
与其对应的两个解码方法分别是:decodeURI()和decodeURIComponent()。其中,decodeURI()只能对使用encodeURL()替换的字符进行解码;同样地,decodeURIComponent()只能对使用encodeURLComponent()替换的字符进行解码。
2》eval()方法
eval()方法就像一个完整的ECMAScript解析器,它只接受一个参数,即要执行的JavaScript字符串。
eval("alert('hi')"); == eval("hi");
当解析器发现代码中调用eval()方法,它会将传入的参数当作实际的ECMAScript语句来解析,然后把执行结果插入到原位置。通过eval()执行的代码会被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量。
var msg = "hello world"; eval("alert(msg)"); //hello world eval("function sayHi(){alert('hi')}"); sayHi(); //hi eval("var msg = 'hello world';"); alert(msg); //hello world
在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只有在eval()执行的时候创建。
严格模式下,在外部访问不到eval()中创建的任何变量或函数,因此前面两个例子都会导致错误。同样,在严格模式下,为eval赋值也会导致错误
能够解释代码字符串的能力非常强大,但也非常危险。因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)。
3》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赋值,这样做即使在非严格模式下也会导致错误。
4》window对象
web浏览器将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。
另一种取得Global对象的方法是通过返回this来获取Global对象。
var global = function(){ return this; }();
(2)Math对象
1》Math对象的属性
属性 | 说明 | 属性 | 说明 |
Math.E | 自然对数的底数,即常量e的值 | Math.LOG10E | 以10为底e的对数 |
Math.LN10 | 10的自然对数 | Math.PI | π的值 |
Math.LN2 | 2的自然对数 | Math.SQRT1_2 | 1/2的平方根(即2的平方根的倒数) |
Math.LOG2E | 以2为底e的对数 | Math.SQRT2 | 2的平方根 |
2》min()和max()方法
min()和max()方法用于确定一组数值中的最大值和最小值。这两个方法都可以接受任意多个数值参数。
//使用apply()方法找到数组中的最大或最小值 var values = [1,2,3,4,5,6,7,8]; var max = Math.max.apply(Math,values);
3》舍入方法
- Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数;
- Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数;
- Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数。
alert(Math.ceil(25.9)); //26 alert(Math.ceil(25.5)); //26 alert(Math.ceil(25.1)); //26 alert(Math.floor(25.9)); //25 alert(Math.floor(25.5)); //25 alert(Math.floor(25.1)); //25 alert(Math.round(25.9)); //26 alert(Math.round(25.5)); //26 alert(Math.round(25.1)); //26
4》random()方法
Math.random()方法返回大于等于0小于1的一个随机数。
值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值)
function selectFrom(lowerValue,upperValue){ var choices = upperValue - lowerValue + 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); //数组中包含的任意字符串
5》其他方法
方法 | 说明 | 方法 | 说明 |
Math.abs(num) | 返回num的绝对值 | Math.asin(x) | 返回x的反正弦值 |
Math.exp(num) | 返回Math.E的num次幂 | Math.atan(x) | 返回x的反正切值 |
Math.log(num) | 返回num的自然对数 | Math.atan2(y,x) | 返回y/x的反正切值 |
Math.pow(num,power) | 返回num的power次幂 | Math.cos(x) | 返回x的余弦值 |
Math.sqrt(num) | 返回num的平方根 | Math.sin(x) | 返回x的正弦值 |
Math.acos(x) | 返回x的反余弦值 | Math.tan(x) | 返回x的正切值 |