所谓的内置对象就是不必显式实例化内置对象,因为在程序执行之前已经被实例化,直接可用了。
1 Global 对象
不属于任何其他对象的属性和方法,都是 Global 对象的属性和方法。 所有在全局作用域中定义的属性和方法,也都是它的属性和方法。
1.1 URI 编码方法
这两个方法可以对 URI(Uniform Resource Identifier,通用资源标识符)进行编码,以便发送给服务器。它们用 UTF-8 编码替换所有无效的字符。
encodeURI() 用于整个 URI 进行编码,她不会对本身属于 URI 中的特殊字符进行编码。
encodeURIComponent() 对 URI 中的某一段进行编码,她会对任何非标准字符进行编码。
var uri = "http://www.163.com/illegal value.html#start";
console.log(encodeURI(uri));//http://www.163.com/illegal%20value.html#start
console.log(encodeURIComponent(uri));//http%3A%2F%2Fwww.163.com%2Fillegal%20value.html%23start
注意: 一般来讲,encodeURIComponent() 用的比较多,因为在实践中更常对查询字符串进行编码。
encodeURI() 对应的解码方法是 decodeURI()。
encodeURIComponent() 对应的解码方法是 decodeURIComponent()。
var uri = "http%3A%2F%2Fwww.163.com%2Fillegal%20value.html%23start";
console.log(decodeURI(uri));//http%3A%2F%2Fwww.163.com%2Fillegal value.html%23start
console.log(decodeURIComponent(uri));//http://www.163.com/illegal value.html#start
注意: escape() 和 unescape() 方法已被废弃,所以在产品级的代码中,请一定使用 URI 方法。
1.2 eval() 方法
她只接受一个参数,即要执行的 ECMAScript 字符串:
eval("alert('hi')");
等价于
alert('hi');
通过 eval() 执行的代码具有与该执行环境相同的作用域链,即这些代码可以引用在包含环境中定义的变量:
var msg = "hello world";
eval("alert(msg)");//hello world
也可以在 eval() 中定义的一个函数,然后在该调用的外部代码中引用她:
eval("function sayHi() {alert('hi');}");
sayHi();
严格模式下,在外部访问不到 eval() 中创建的任何变量或函数,而且为 eval 赋值也会导致错误。
注意: 因为 eval() 很强大,所以在使用时要非常谨慎,特别是在用它执行用户输入数据的情况下,因为可能会发生代码注入的安全问题。
1.3 Global 对象的属性
属性 | 说明 |
---|---|
undefined | 特殊值 |
NaN | 特殊值 |
Infinity | 特殊值 |
Object | 构造函数 |
Array | 构造函数 |
Function | 构造函数 |
Boolean | 构造函数 |
String | 构造函数 |
Number | 构造函数 |
Date | 构造函数 |
RepExp | 构造函数 |
Error | 构造函数 |
EvalError | 构造函数 |
RangeError | 构造函数 |
ReferenceError | 构造函数 |
SyntaxError | 构造函数 |
TypeError | 构造函数 |
URIError | 构造函数 |
ECMAScript 5 禁止给 undefined、NaN 和 Infinity 赋值。
1.4 window 对象
ECMAScript 没有定义如何直接访问 Global 对象,但浏览器都将这个全局对象作为 window 对象的一部分加以实现。因此在全局作用域中定义的属性和方法,都成为这个 window 对象的属性和方法:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>在全局作用域中声明的所有变量和函数,都成为 window 对象的属性</title>
</head>
<body>
<script type="text/javascript">
var color = "red";
function sayColor() {
console.log(window.color);
}
window.sayColor();//red
</script>
</body>
</html>
注意: window 对象除了作为 Global 对象的角色外,还承担了很多任务,以后讲到浏览器对象模型时,会详细说明。
另一种取得 Global 对象的方法是:
var global = function(){
return this;
}();
因为在没有给函数明确指定 this 值的情况下,this 值等于 Global 对象。
2 Math 对象
Math 对象提供的计算功能与直接编码相比,执行速度会快很多。
2.1 Math 对象的属性
属性 | 说明 |
---|---|
Math.E | 自然对数的底数,即常量 e |
Math.LN10 | 10 的自然对数 |
Math.LN2 | 2 的自然对数 |
Math.LOG2E | 以 2 为底的对数 |
Math.LOG10E | 以 10 为底的对数 |
Math.PI | π |
Math.SQRT1_2 | 1/2 的平方根 |
Math.SQRT2 | 2 的平方根 |
2.2 min() 和 max()
她们能够确定一组数值中的最大值和最小值,接受任意多个数值参数:
var max = Math.max(3, 54, 32, 16);
console.log(max);//54
console.log(Math.min(3, 54, 32, 16));//3
要找到数组中的最大值和最小值,可以使用 apply() 方法:
var values = [1, 2, 3, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);//Math 作为 apply() 的第一个参数,从而正确地设置 this 值。
console.log(max);//8
2.3 舍入方法
- Math.ceil():向上舍入。
- Math.floor():向下舍入。
- Math.round():四舍五入。
console.log(Math.ceil(25.9));//26
console.log(Math.ceil(25.5));//26
console.log(Math.ceil(25.1));//26
console.log(Math.round(25.9));//26
console.log(Math.round(25.5));//26
console.log(Math.round(25.1));//25
console.log(Math.floor(25.9));//25
console.log(Math.floor(25.5));//25
console.log(Math.floor(25.1));//25
2.4 random() 方法
她返回 0 与 1 之间的随机数,不包括 0 和 1。
下面的这个公式可以从某个整数范围内随机选择一个值:
值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值)
比如,想选择 1 到 10 之间的数值:
console.log(Math.floor(Math.random() * 10 + 1));//1-10
想选择 2 到 10 之间的数值:
console.log(Math.floor(Math.random() * 9 + 2));//2-10
可以通过一个函数来计算可能值的总数以及第一个可能的值:
function selectFrom(lowerValue, upperVAlue) {
var choices = upperVAlue - lowerValue + 1;
return Math.floor(Math.random() * choices + lowerValue);
}
var num = selectFrom(2, 10);
console.log(num);//2-10
利用上面这个函数,可以方便地从数组中随机取出一项:
var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length - 1)];
console.log(color);//colors 数组中随机取出任意颜色
2.5 其他方法
方法 | 说明 |
---|---|
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(num) | num 的反余弦值 |
Math.asin(num) | num 的反正弦值 |
Math.atan(num) | num 的反正切值 |
Math.atan2(y,x) | y/x 的反正切值 |
Math.cos(num) | num 的余弦值 |
Math.sin(num) | num 的正弦值 |
Math.tan(num) | num 的正切值 |
ECMA-262 只规定了这些方法,但不同的实现会采用不同的算法,因此也可能会有不同的精度。