[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 原生函數