JavaScript高级程序设计第5章读书笔记(19)
Global对象的属性
Global对象包含一些特殊的属性,比如: 特殊值undefined、NaN、Infinity都是Global对象的属性。此外,所有原生引用类型的构造函数,像Object和Function,也都是Global对象的属性。以下列出了Global对象的所有属性。
属性 | 说明 |
---|---|
undefined | 特殊值undefined |
NaN | 特殊值NaN |
Infinity | 特殊值Infinity |
Object | 构造函数Object |
Array | 构造函数Array |
Function | 构造函数Function |
Boolean | 构造函数Boolean |
String | 构造函数String |
Number | 构造函数Number |
Date | 构造函数Date |
RegExp | 构造函数RegExp |
Error | 构造函数Error |
EvalError | 构造函数EvalError |
RangeError | 构造函数RangeError |
ReferenceError | 构造函数ReferenceError |
SyntaxError | 构造函数SyntaxError |
TypeError | 构造函数TypeError |
URIError | 构造函数URIError |
ECMAScript 5明确禁止给undefined、NaN、Infinity赋值,这样做即使在非严格模式下也会报错。
window对象
ECMAScript虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,就都成为了window对象的属性。
1 2 3 4 5 6 7 |
var color = "red"; function sayColor(){ alert(window.color); } window.sayColor(); // "red" |
本例,定义了全局变量color和全局函数sayColor()。在sayColor()内部可以通过window.color来访问color变量,说明全局变量是window对象的属性。
JavaScript中的window对象扮演了ECMAScript规定的Global对象。
另一种取得Global对象的方法如下:
1 2 3 4 |
var global = function(){ return this; }(); |
在没有给函数明确指定this值的情况下,this值等于Global对象。像这样通过简单地返回this来取得Global对象,在任何执行环境下都是可行的。
Math对象
与直接用JavaScript编写计算功能相比,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()方法
min()和max()方法用于确定一组数值中的最小值和最大值。它们都可以接收任意多个数值参数,比如:
1 2 3 4 5 6 |
var max = Math.max(3, 54, 32, 16); alert(max); // 54 var min = Math.min(3, 54, 32, 16); alert(min); // 3 |
要找到数组中的最大或最小值,可以像下面这样使用apply()方法
1 2 3 |
var values = [1,2,3,4,5,6,7,8]; var max = Math.max.apply(Math, values); |
这里的关键在于,把Math对象作为apply()方法的第一个参数,从而正确地设置this值。由于apply()方法的第二个参数是一个数组,接着,就可以将数组作为参数传入。
舍入方法
- Math.ceil() 执行向上舍入,即它总是将数值向上舍入为最接近的整数
- Math.floor() 执行向下舍入,即它总是将数值向下舍入为最接近的整数
- Math.round() 执行标准舍入,即它总是将数值四舍五入为最接近的整数。与数学上的四舍五入规则相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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()从某个整数范围内随机选择一个值。
1 2 3 4 5 6 7 8 9 10 |
// 值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能值) // 1到10之间的整数 var num = Math.floor(Math.random() * 10 + 1); // 2到10之间的整数 var num2 = Math.floor(Math.random() * 9 + 2); |
多数情况下,都可以通过一个函数计算可能值的总数和第一个可能的值,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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)的一个整数 // 利用selectFrom()函数,可以方便地从数组中随机取出一项 var colors = ["red", "green", "blue", "black"]; var color = colors[selectFrom(0, colors.length -1)]; alert(color); |
Math对象的其他方法
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.acos(x) | 返回x的反余弦值 |
Math.asin(x) | 返回x的反正弦值 |
Math.atan(x) | 返回x的反正切值 |
Math.atan2(y, x) | 返回y/x的反正切值 |
Math.cos(x) | 返回x的余弦值 |
Math.sin(x) | 返回x的正弦值 |
Math.tan(x) | 返回x的正切值 |
虽然ECMA-262规定了这些方法,但是,不同的实现可能会对这些方法采用不同的算法。毕竟,计算某个值的正弦、余弦和正切的方法有很多种。也正因为如此,这些方法在不同的实现中可能会有不同的精度。
本章小结
对象在JavaScript中被称为引用类型的值,而且有一些内置的引用类型可以用来创建特定的对象。
- 引用类型与传统面向对象程序设计中的类型相似,但实现不同
- Object是一个基础类型,其他所有类型都从Object继承了基本的行为
- Array类型是一组值的有序列表,同时还提供了操作和转换这些值的功能
- Date类型提供了有关日期和时间的信息,包括当前日期和时间以及相关的计算功能
- RegExp类型是ECMAScript支持正则表达式的一个接口,提供了最基本的和一些高级的正则表达式功能
函数,实际上是Function类型的实例,因此,函数也是对象。这一点是JavaScript最特别的地方。由于函数是对象,所以函数也拥有方法,可以用来增强其行为。
因为有了基本包装类型,所以JavaScript中的基本类型值可以被当作对象来访问。三种基本包装类型分别是: Boolean
、Number
和String
。它们的共同特征是:
- 每个包装类型都映射到同名的基本类型
- 在读取模式下访问基本类型值的时候,会创建对应的基本包装类型的一个对象,从而方便了数据操作。
- 操作基本类型值的语句一经执行完毕,就会立即销毁新创建的包装对象。
在所有代码执行之前,作用域中就已经存在两个内置对象: Global
和Math
。大多数ECMAScript实现中不能直接访问Global对象,不过,Web浏览器实现了承担该角色的window对象。全局变量和函数都是Global对象的属性。