Global对象
Global(全局)对象可以说是 ECMAScript 中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的。
ECMAScript 中的 Global 对象在某种意义上是作为一个终极的"兜底儿对象"来定义的。
换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。
事实上没有全局变量或全局函数;所有在全局作用域中定义的属性和函数,都是 Global 对象的属性。
例如:isNan()、isFinite()、parseInt()...等,除此之外,Global 对象还包含其他一些方法。
URI编码方法
encodeURI() 和 encodeURIComponent() 方法可以对 URI(Uniform Resource Identifiers,通用资源表示符)进行编码,以便发送给浏览器。有效的 URI 中不能包含某些字符,例如空格。而这两个 URI 编码方法就可以对 URI 进行编码,它们用特殊的 UTF-8 编码替换所有无效的字符,从而让浏览器能够接受和理解。
encodeURI() 主要用于整个 URI(例如,http://www.xxx.com/iii.html
), 而 encodeURIComponent() 主要用于对 URI 中的某一段(例如前面 URL 中的 xxx.html)进行编码。
它们的主要区别在于, encodeURI() 不会对本身属于 URI 的特殊字符进行编码,例如冒号、正斜杠、问好和井字号;
而 encodeURIComponent() 则会对它发现的任何非标准字符进行编码。
var uri = "http://www.xxx.com/iii.html";
alert(encodeURI(uri)); // http://www.xxx.com/iii.html
alert(encodeURIComponent(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html
使用 encodeURI() 编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了 %20。而encodeURIComponent() 方法则会使用对应的编码替换所有非字符字母字符串。
一般来说,我们使用 encodeURIComponent() 方法的时候要比使用 encodeURI() 更多,因为在实践中更常见的是对查询字符串参数而不是对基础 URI 编码
与 encodeURI() 和 encodeURIComponent() 方法对应的两个方法分别是 decodeURI() 和 decodeURIComponent()。其中, decodeURI() 只能堆使用 encodeURI() 替换的字符进行解码。 decodeURIComponent() 能够解码使用 encodeURIComponent() 编码的所有字符,即它可以解码任何特殊字符的编码。
var uri = "http%3A%2F%2Fwww.xxx.com%2Fiii.html";
alert(decodeURI(uri)); // http%3A%2F%2Fwww.xxx.com%2Fiii.html
alert(decodeURIComponent(uri)); // http://www.xxx.com/iii.html
URI 方法 encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent() 用于代替已经被 ECMA-262第三版飞起的 escape() 和 unescape() 方法。
URI 方法能够编码所有 Unicode 字符,而原来的方法只能正切地编码 ASCLL 字符。因此在开发实践中,特别是在产品级的代码中,一定要使用 URI 方法,不要使用 escape() 和 unescape() 方法。
eval() 方法
eval() 方法就像是一个完整的 ECMAScript 解析器,它只接受一个参数,即要执行的 ECMAScript (或 JavaScript) 字符串。
eval("alert('hi')");
这段代码的作用等价于下面这行代码:
alert("hi");
当解析器发现代码中调用 eval() 方法时,他会将传入的参数当做实际的 ECMAScript 语句来解析, 然后把执行结果插入到原位置。
通过 eval() 执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。
这意味着通过 eval() 执行的代码可以引用在包含环境中定义的变量。
var msg = "hello world";
eval("alert(msg)"); // hello world
eval("function sayHi() { alert('hi'); }");
sayHi()
严格模式下,在外部访问不到 eval() 中创建的任何变量或函数,因此上面例子都会导致错误。同样,在严格模式下,为 eval() 赋值也会导致错误:
"use strict"
eval = "hi" // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
能够解释代码字符串的能力非常强大,但也非常危险。
因此在使用 eval() 时必须谨慎,特别是用在执行用户输入的数据的情况下。
否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)
Global对象的属性
Global 对象还包含一些属性,例如,特殊的值 undefined、 NaN 以及 Infinity 都是 Global 对象的属性。 此外,所有原生引用类型的构造函数,像 Object 和 Function,也都是 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 |
ECMAScript 5 明确禁止给 undefined、NaN 和 Infinity 赋值,这样做即使在非严格模式下也会导致错误。
window 对象
ECMAScript 虽然没有指出如何直接访问Global 对象,但 Web浏览器都是讲这个全局对象作为 window 对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了 window 对象的属性。
var color = "red";
function sayColor() {
alert(window.color);
}
window.sayColor(); // red
在 sayColor() 内部,通过 window.color 来访问 color 变量,说明变量是 window 对象的属性。
使用 window.sayColor() 来直接通过 window 对象调用这个函数,说明 sayColor() 也是绑定在 window 对象下的。
var global = function() {
return this;
}
通过简单地返回 this 来取得 Global 对象,在任何环境下都是可行的。
Math对象
ECMAScript 还为保存数学公式和信息提供了一个公共位置,即 Math 对象。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的平方根(即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
要找到数组中的最大或最小值可以使用下面方法:
var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);
alert(max) // 8
舍入方法
将小数舍入为整数的方法:
- 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.round(25.9)); // 26
alert(Math.round(25.5)); // 26
alert(Math.round(25.1)); // 25
alert(Math.floor(25.9)); // 25
alert(Math.floor(25.5)); // 25
alert(Math.floor(25.1)); // 25
random() 方法
Math.random() 方法返回介于 0 和 1 之间一个随机数,不包括 0 和 1.
Math.random() 可以用于随机显示一些名人名言或新闻事件。
值 = Math.floor(Math.random()) * 可能值的总数 + 第一个可能的值)
公式中用到了 Math.floor() 方法,这是因为 Math.random() 总返回一个小数值。而用这个小数值乘以一个整数,然后在加上一个整数,最终结果仍然还是一个小数。
如果想选择一个 1 到 10 之间的数值,可以像下面例子这样实现:
var num = Math.floor(Math.random() * 10 + 1);
如果想要选择一个介于 2 到 10 之间的值:
var num = Math.floor(Math.random() * 9 + 2);
从 2 数到 10 要数9个数,因此可能值的总数就是 9,而第一个可能的值就是 2.多数情况下,其实都可以通过一个函数来计算可能值的总数和第一个可能值:
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);
其他方法
Math 对象中还包含其他一些与完成各种简单或复杂计算有关的方法:
方法 | 说明 | 方法 | 说明 |
---|---|---|---|
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) | 返回num的power次幂 | Math.cos(x) | 返回x的余弦值 |
Math.sqrt(num) | 返回num的平方根 | Math.sin(x) | 返回x的正炫值 |
Math.acos(x) | 返回num的反余弦值 | Math.tan(x) | 返回x的正切值 |