[TOC]
## 5.5 单体内置对象
.ECMA-262对内置对象的定义是:“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”即开发人员无需显式地实例化内置对象,因为它们已经实例化了。
### 5.7.1 Global对象
Global对象是一个**全局对象**,在浏览器环境下,Global对象是window对象的一部分。
所有在全局作用域中定义的属性和函数,都是Global对象的属性,比如:isNaN()、isFinite()、parseInt()以及parseFloat(),实际上都是Global对象的方法。
此外,Global对象还包含其他一些方法:
**1.URI编码方法**
Global对象的`encodeURI()`和`encodeURIComponent()`方法可以对URI(Uniform Resource Identifiers,通用资源标识符)进行编码,以便发送给服务器(在GET 请求中很重要的方法)。
有效的URI中不能包含某些字符,比如空格。
**encodeURI()和encodeURIComponent()的区别:**
* `encodeURI()`主要用于整个URI;`encodeURIComponent()`主要用于对URI中的某一段。
* `encodeURI()`不会对本身属于URI的特殊字符进行编码(比如冒号、正斜杠、问号和井字号);但`encodeURIComponent()`则会对它发现的任何非标准字符进行编码。
~~~
var uri = 'http://www.example.com/illegal value.html#start';
console.log(encodeURI(uri)); // http://www.example.com/illegal%20value.html#start
console.log(encodeURIComponent(uri)); // http%3A%2F%2Fwww.example.com%2Fillegal%20value.html%23start
~~~
与encodeURI()和encodeURIComponent()方法对应的是`decodeURI()`和`decodeURIComponent()`。
decodeURI()只能对使用encodeURI()替换的字符进行解码;decodeURIComponent()能够解码使用encodeURIComponent()编码的所有字符。
~~~
console.log(decodeURI('http://www.example.com/illegal%20value.html#start'));
// http://www.example.com/illegal value.html#start
console.log(decodeURIComponent('http%3A%2F%2Fwww.example.com%2Fillegal%20value.html%23start'));
// http://www.example.com/illegal value.html#start
~~~
**2. eval() 方法**
eval()方法类似一个完整的ECMAScript解析器,它接受一个参数,既要执行的JavaScript字符串。
~~~
eval("alert('hi')");
//等价于
alert('hi');
~~~
当解析器发现代码中调用eval()方法时,它会**将传入的参数当作实际的ECMAScript语句来解析**,然后把执行结果插入到原位置。
通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。
~~~
var name = 'tg';
eval("console.log(name)"); // "tg"
eval("function test() { console.log(1); }");
test(); // 1
~~~
注意:在eval()创建的任何变量或函数都不会被提升。而且在严格模式下,在外部是访问不到eval()中创建的任何变量或函数,且为eval复制也会导致错误。
**3. Global对象的属性**
~~~
undefined、NaN、Infinity、Object、Array、Function、Boolean、String、Number、
Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
~~~
**4. window对象**
ECMAScript并没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为**window对象**的一部分加以实现的。因此,**在全局作用域总声明的的所有变量和函数,都会成为window对象的属性。**
### 5.7.2 Math对象
Math对象中保存了数学公式和信息。
**1. 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的平方根 |
**2. Math.min()和Math.max()**
Math.min()和Math.max()分别用于确定一组数值中的最小值和最大值,这两个方法都可以接收任意个数值参数。
~~~
console.log(Math.max(3, 10, 2, 100)); // 100
console.log(Math.min(3, 10, 2, 100)); // 2
~~~
如果要找到数组中的最大或最小值,可以这样:
~~~
var arr = [3, 10, 2, 100];
var max = Math.max.apply(Math, arr);
console.log(max); // 100
~~~
apply()方法是用来改变一个函数内的this指向,第一个参数就是要this指向的对象,第二个参数是一个数组。
**3. 舍入方法**
`Math.ceil()`执行向上舍入,即它总是取最接近数值且大于数值的整数
~~~
console.log(Math.ceil(1.4)); // 2
console.log(Math.ceil(1.5)); // 2
~~~
Math.floor()执行向下舍入,即它总是取最近数值且小于数值的整数。
~~~
console.log(Math.floor(1.4)); // 1
console.log(Math.floor(1.5)); // 1
~~~
Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数。
~~~
console.log(Math.round(1.4)); // 1
console.log(Math.round(1.5)); // 2
~~~
**4. random() 方法**
`Math.random()`方法返回大于等于0和小于1之间的一个随机数。
~~~
console.log(Math.random()); // 介于0~1之间的值
~~~
取任意范围的随机值:
~~~
function getRandom(max, min) {
return Math.random() * (max - min + 1) + min ; // random*可能值总数 + 最小值
};
~~~
getRandom()方法接受两个参数:应该返回的最小值和最大值。
**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(x) | 返回x的反余弦值 |
| Math.asin(x) | 返回x的反正弦值 |
| Matn.atan(x) | 返回x的反正切值 |
| Math.atan2(y, x) | 返回y/x的反正切值 |
| Math.cos(x) | 返回x的余弦值 |
| Math.sin(x) | 返回x的正弦值 |
| Math.tan(x) | 返回x的正切值 |
- 前言
- 第一章 JavaScript简介
- 第三章 基本概念
- 3.1-3.3 语法、关键字和变量
- 3.4 数据类型
- 3.5-3.6 操作符、流控制语句(暂略)
- 3.7函数
- 第四章 变量的值、作用域与内存问题
- 第五章 引用类型
- 5.1 Object类型
- 5.2 Array类型
- 5.3 Date类型
- 5.4 基本包装类型
- 5.5 单体内置对象
- 第六章 面向对象的程序设计
- 6.1 理解对象
- 6.2 创建对象
- 6.3 继承
- 第七章 函数
- 7.1 函数概述
- 7.2 闭包
- 7.3 私有变量
- 第八章 BOM
- 8.1 window对象
- 8.2 location对象
- 8.3 navigator、screen与history对象
- 第九章 DOM
- 9.1 节点层次
- 9.2 DOM操作技术
- 9.3 DOM扩展
- 9.4 DOM2和DOM3
- 第十章 事件
- 10.1 事件流
- 10.2 事件处理程序
- 10.3 事件对象
- 10.4 事件类型
- 第十一章 JSON
- 11.1-11.2 语法与序列化选项
- 第十二章 正则表达式
- 12.1 创建正则表达式
- 12.2-12.3 模式匹配与RegExp对象
- 第十三章 Ajax
- 13.1 XMLHttpRequest对象
- 你不知道的JavaScript
- 一、作用域与闭包
- 1.1 作用域
- 1.2 词法作用域
- 1.3 函数作用域与块作用域
- 1.4 提升
- 1.5 作用域闭包
- 二、this与对象原型
- 2.1 关于this
- 2.2 全面解析this
- 2.3 对象
- 2.4 混合对象“类”
- 2.5 原型
- 2.6 行为委托
- 三、类型与语法
- 3.1 类型
- 3.2 值
- 3.3 原生函数