这些对象在ECMAScript 程序执行之前就已经存在了。
1 Global对象
所有在全局作用域中定义的属性和函数,都是Global 对象的属性。
1.1 URI 编码方法
encodeURI()和encodeURIComponent()方法可以对URI(Uniform ResourceIdentifiers,通用资源标识符)进行编码,以便发送给浏览器。
- encodeURI()主要用于整个URI(例如,http://www.wrox.com/illegal value.htm),而encode-
URIComponent()主要用于对URI 中某一段(例如前面URI 中的illegal value.htm)进行编码。 - encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了
%20。而encodeURIComponent()方法则会使用对应的编码替换所有非字母数字字符。 - decodeURI()只能对使用encodeURI()替换的字符进行解码。decodeURIComponent()能够解码使用encodeURIComponent()编码。
//编码
var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));
//解码
var uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start";
//http%3A%2F%2Fwww.wrox.com%2Fillegal value.htm%23start
alert(decodeURI(uri));
//http://www.wrox.com/illegal value.htm#start
alert(decodeURIComponent(uri));
1.2. eval()方法
eval()方法就像是一个完整的ECMAScript 解析器。
- 在eval()中创建的任何变量或函数都不会被提升
- 严格模式下,在外部访问不到eval()中创建的任何变量或函数
- 对eval()的调用最终会被替换成定义函数的实际代码
//等价
eval("alert('hi')");
alert("hi");
1.3 属性
1.4 window 对象
在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。
ES5 之中,顶层对象的属性与全局变量是等价的。在浏览器环境指的是window
对象,在 Node 指的是global
对象。Web Worker 里面,指的是self
对象。任何环境下,globalThis
都是存在的,都可以从它拿到顶层对象,指向全局环境下的this
。
ES6 为了保持兼容性,var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。
var a = 1;
// 如果在 Node 的 REPL 环境,可以写成 global.a
// 或者采用通用方法,写成 this.a
window.a // 1
let b = 1;
window.b // undefined
问题:
没法在编译时就报出变量未声明的错误,只有运行时才能知道。属性的创造是动态的
程序员很容易不知不觉地就创建了全局变量,顶层对象的属性是到处可以读写的
window
对象有实体含义,指的是浏览器的窗口对象,也是不合适的。
2 Math对象
2.1 属性
2.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);
2.3 舍入方法
alert(Math.ceil(25.9)); //26:向上取整
alert(Math.floor(25.9)); //25:向下取整
alert(Math.round(25.5)); //26:四舍五入
2.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);
aler t(num); // 介于 2 和10 之间(包括 2 和 10)的一个数值