# javascript快速入門9--引用類型
引用類型通常叫做類(class),也就是說,遇到引用值,所處理的就是對象。
**注意:從傳統意義上來說,ECMAScript 并不真正具有類。事實上,除了說明不存在類,在 ECMA-262 中根本沒有出現“類”這個詞。ECMAScript 定義了“對象定義”,邏輯上等價于其他程序設計語言中的類**
## Object
對象是由 new 運算符加上要實例化的對象的名字創建的。例如,下面的代碼創建 Object 對象的實例:
```
var obj = new Object();
```
這種語法與 Java 語言的相似,不過當有不止一個參數時,ECMAScript 要求使用括號。如果沒有參數,如以下代碼所示,括號可以省略:
```
var o = new Object;
```
**注意:盡管括號不是必需的,但是為了避免混亂,最好使用括號。**
Object 對象自身用處不大,不過在了解其他類之前,還是應該了解它。因為 ECMAScript 中的 Object 對象與 Java 中的 java.lang.object 相似,ECMAScript 中的所有對象都由這個對象繼承而來,Object 對象中的所有屬性和方法都會出現在其他對象中,所以理解了 Object 對象,就可以更好地理解其他對象。
Object 對象具有下列屬性:
constructor
對創建對象的函數的引用(指針)。對于 Object 對象,該指針指向原始的 Object() 函數。
prototype
對該對象的對象原型的引用。對于所有的對象,它默認返回 Object 對象的一個實例。
Object 對象還具有幾個方法:
hasOwnProperty(property)
判斷對象是否有某個特定的屬性。必須用字符串指定該屬性。(例如,o.hasOwnProperty("name"))
isPrototypeOf(object)
判斷該對象是否為另一個對象的原型。
propertyIsEnumerable(property)
判斷給定的屬性是否可以用 for...in 語句進行枚舉。
toString()
返回對象的原始字符串表示。對于 Object 對象,ECMA-262 沒有定義這個值,所以不同的 ECMAScript 實現具有不同的值。
valueOf()
返回最適合該對象的原始值。對于許多對象,該方法返回的值都與 ToString() 的返回值相同。
**注意:上面列出的每種屬性和方法都會被其他對象覆蓋。**
## Boolean
Boolean 對象是 Boolean 原始類型的引用類型。要創建 Boolean 對象,只需要傳遞 Boolean 值作為參數:
```
var oBooleanObject = new Boolean(true);
```
Boolean 對象將覆蓋 Object 對象的 ValueOf() 方法,返回原始值,即 true 和 false。ToString() 方法也會被覆蓋,返回字符串 "true" 或 "false"。遺憾的是,在 ECMAScript 中很少使用 Boolean 對象,即使使用,也不易理解。問題通常出現在 Boolean 表達式中使用 Boolean 對象時。例如:
```
var oFalseObject = new Boolean(false); var bResult = oFalseObject && true; //輸出 true
```
在這段代碼中,用 false 值創建 Boolean 對象。然后用這個值與原始值 true 進行 AND 操作。在 Boolean 運算中,false 和 true 進行 AND 操作的結果是 false。不過,在這行代碼中,計算的是 oFalseObject,而不是它的值 false。正如前面討論過的,在 Boolean 表達式中,所有對象都會被自動轉換為 true,所以 oFalseObject 的值是 true。然后 true 再與 true 進行 AND 操作,結果為 true。
**注意:雖然你應該了解 Boolean 對象的可用性,不過最好還是使用 Boolean 原始值,避免發生這一節提到的問題。**
## Number
Number 對象是 Number 原始類型的引用類型。要創建 Number 對象,采用下列代碼:
```
var oNumberObject = new Number(68);
```
**Number.MAX_VALUE,Number.MIN_VALUE等特殊值都是 Number 對象的靜態屬性。**
要得到數字對象的 Number 原始值,只需要使用 valueOf() 方法:
```
var iNumber = oNumberObject.valueOf();
```
當然,Number 類也有 toString() 方法.除了從 Object 對象繼承的標準方法外,Number 對象還有幾個處理數值的專用方法:
toFixed() 方法返回的是具有指定位數小數的數字的字符串表示。例如:
```
var oNumberObject = new Number(68);
alert(oNumberObject.toFixed(2)); //輸出 "68.00"
```
在這里,toFixed() 方法的參數是 2,說明應該顯示兩位小數。該方法返回 "68.00",空的字符串位由 0 來補充。對于處理貨幣的應用程序,該方法非常有用。toFixed() 方法能表示具有 0 到 20 位小數的數字,超過這個范圍的值會引發錯誤。
與格式化數字相關的另一個方法是 toExponential(),它返回的是用科學計數法表示的數字的字符串形式。與 toFixed() 方法相似,toExponential() 方法也有一個參數,指定要輸出的小數的位數。例如:
```
var oNumberObject = new Number(68);
alert(oNumberObject.toExponential(1)); //輸出 "6.8e+1"
```
這段代碼的結果是 "6.8e+1",前面解釋過,它表示 6.8x101。問題是,如果不知道要用哪種形式(預定形式或指數形式)表示數字怎么辦?可以用 toPrecision() 方法。
toPrecision() 方法根據最有意義的形式來返回數字的預定形式或指數形式。它有一個參數,即用于表示數的數字總數(不包括指數)。例如:
```
var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(2)); //輸出 "68"
```
當然,輸出的是 "68",因為這正是該數的準確表示。不過,如果指定的位數多于需要的位數又如何呢?
```
var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(3)); //輸出 "68.0"
```
在這種情況下,toPrecision(3) 等價于 toFixed(1),輸出的是 "68.0"。toFixed()、toExponential() 和 toPrecision() 方法都會進行舍入操作,以便用正確的小數位數正確地表示一個數。
## String
String 對象是 String 原始類型的對象表示法,它是以下方式創建的:
```
var oStringObject = new String("hello world");
```
String 對象的 valueOf() 方法和 toString() 方法都會返回 String 類型的原始值:
```
alert(oStringObject.valueOf() == oStringObject.toString()); //輸出 "true"
```
String 對象具有屬性 length,它是字符串中的字符個數:
```
var oStringObject = new String("hello world");
alert(oStringObject.length); //輸出 "11"
```
**注意,即使字符串包含雙字節的字符(與 ASCII 字符相對,ASCII 字符只占用一個字節),每個字符也只算一個字符。**
String 對象還擁有大量的方法。
localeCompare() 方法,對字符串進行排序。該方法有一個參數 - 要進行比較的字符串,返回的是下列三個值之一:
* 如果 String 對象按照字母順序排在參數中的字符串之前,返回負數。
* 如果 String 對象等于參數中的字符串,返回 0
* 如果 String 對象按照字母順序排在參數中的字符串之后,返回正數。
**如果返回負數,那么最常見的是 -1,不過真正返回的是由實現決定的。如果返回正數,那么同樣的,最常見的是 1,不過真正返回的是由實現決定的。而且對于中文字符,雖然表面上看是按拼音排序的,但并不一定!事實上,它們按Unicode編碼排序,小的排在前面,大的排在后面**
示例如下:
```
var oStringObject = new String("yellow");
alert(oStringObject.localeCompare("brick")); //輸出 "1"
alert(oStringObject.localeCompare("yellow")); //輸出 "0"
alert(oStringObject.localeCompare("zoo")); //輸出 "-1"
```
再強調一次,由于返回的值是由實現決定的,所以最好以下面的方式調用 localeCompare() 方法:
```
var oStringObject1 = new String("yellow"); var oStringObject2 = new String("brick"); var iResult = oStringObject1.localeCompare(oStringObject2); if(iResult < 0) {
alert(oStringObject2 + " 排在字符串 " + oStringObject1 +"后面");
} else if (iResult > 0) {
alert(oStringObject2 + " 排在字符串 " + oStringObject1+"前面");
} else {
alert("兩個字符串排序是一樣的!");
}
```
localeCompare() 方法的獨特之處在于,實現所處的區域(locale,兼指國家/地區和語言)確切說明了這種方法運行的方式。在美國,英語是 ECMAScript 實現的標準語言,localeCompare() 是區分大小寫的,大寫字母在字母順序上排在小寫字母之后。不過,在其他區域,情況可能并非如此。
ECMAScript 提供了兩種方法從子串創建字符串值,即 slice() 和 substring()。這兩種方法返回的都是要處理的字符串的子串,都接受一個或兩個參數。第一個參數是要獲取的子串的起始位置,第二個參數(如果使用的話)是要獲取子串終止前的位置(也就是說,獲取終止位置處的字符不包括在返回的值內)。如果省略第二個參數,終止位就默認為字符串的長度。slice() 和 substring() 方法都不改變 String 對象自身的值。它們只返回原始的 String 值,保持 String 對象不變。
```
var oStringObject = new String("hello world");
alert(oStringObject.slice(3)); //輸出 "lo world"
alert(oStringObject.substring(3)); //輸出 "lo world"
alert(oStringObject.slice(3, 7)); //輸出 "lo w"
alert(oStringObject.substring(3, 7)); //輸出 "lo w"
```
為什么有兩個功能完全相同的方法呢?事實上,這兩個方法并不完全相同,不過只在參數為負數時,它們處理參數的方式才稍有不同。對于負數參數,slice() 方法會用字符串的長度加上參數,substring() 方法則將其作為 0 處理(也就是說將忽略它)。例如:
```
var oStringObject = new String("hello world");
alert(oStringObject.slice(-3)); //輸出 "rld"
alert(oStringObject.substring(-3)); //輸出 "hello world"
alert(oStringObject.slice(3, -4)); //輸出 "lo w"
alert(oStringObject.substring(3, -4)); //輸出 "hel"
```
最后一套要討論的方法涉及大小寫轉換。有 4 種方法用于執行大小寫轉換,即
* toLowerCase()
* toLocaleLowerCase()
* toUpperCase()
* toLocaleUpperCase()
從名字上可以看出它們的用途,前兩種方法用于把字符串轉換成全小寫的,后兩種方法用于把字符串轉換成全大寫的。toLowerCase() 和 toUpperCase() 方法是原始的,是以 java.lang.String 中相同方法為原型實現的。toLocaleLowerCase() 和 toLocaleUpperCase() 方法是基于特定的區域實現的(與 localeCompare() 方法相同)。在許多區域中,區域特定的方法都與通用的方法完全相同。不過,有幾種語言對 Unicode 大小寫轉換應用了特定的規則(例如土耳其語),因此必須使用區域特定的方法才能進行正確的轉換。
**String 對象的所有屬性和方法都可應用于 String 原始值上,因為它們是偽對象。**
String對象方法參考
| 方法 | 描述 |
| --- | --- |
| charAt() | 返回在指定位置的字符。 |
| charCodeAt() | 返回在指定的位置的字符的 Unicode 編碼。 |
| concat() | 連接字符串。 |
| fromCharCode() | 從字符編碼創建一個字符串。 |
| indexOf() | 檢索字符串。 |
| lastIndexOf() | 從后向前搜索字符串。 |
| localeCompare() | 用本地特定的順序來比較兩個字符串。 |
| match() | 找到一個或多個正則表達式的匹配。 |
| replace() | 替換與正則表達式匹配的子串。 |
| search() | 檢索與正則表達式相匹配的值。 |
| slice() | 提取字符串的片斷,并在新的字符串中返回被提取的部分。 |
| split() | 把字符串分割為字符串數組。 |
| substr() | 從起始索引號提取字符串中指定數目的字符。 |
| substring() | 提取字符串中兩個指定的索引號之間的字符。 |
| toLocaleLowerCase() | 把字符串轉換為小寫。 |
| toLocaleUpperCase() | 把字符串轉換為大寫。 |
| toLowerCase() | 把字符串轉換為小寫。 |
| toUpperCase() | 把字符串轉換為大寫。 |
| toString() | 返回字符串。 |
| valueOf() | 返回某個字符串對象的原始值。 |
## Global
Global是一個最為特殊的對象,因為它實際上根本不存在!如果嘗試輸出Global對象將出錯:
```
alert(Global);
```
但Global確實是一個對象,要理解這一點要先理解ECMAScript中一個概念,即在ECMAScript中不存在獨立的函數,所有的函數必須是某個對象的方法. 像之前所使用的isNaN(),parseInt()看上去像獨立的函數,其實它們都是Global對象的方法,Global對象的方法還不止這些,如用于編解碼URI的函數:encodeURI與decodeURI方法
```
var url = "http://www.g.cn/trend page";
alert(encodeURI(url));//該方法會將一些不能用在URI中的字符進行編碼
//上面的空格將會被替換成%20,與之對應的decodeURI則是用來解碼的
alert(decodeURI(encodeURI(url)));//原樣輸出
```
與encodeURI和decodeURI相似的encodeURIComponent和decodeURIComponent . 這兩個方法不但對空格之類的字符進行編碼,還對"/"和":"這些URL中的特殊字符進行編碼
```
var url = "http://www.g.cn";
alert(encodeURIComponent(url)); //輸出http://%3A%2F%2Fwww.g.cn
```
一般情況下要把一些字符串作為QueryString值添加到URL后面時,使用encodeURIComponent更安全些. encodeURI之類的方法代替了以前BOM提供的escape與unescape之類的方法,URI方法更可取,因為escape方法只能對ASCII字符進行編碼,而URI方法則可以對所有的Unicode字符進行編碼. 應該總是使用URI方法,避免使用escape方法!
Global對象不但有方法,還有一些屬性:如undefined,NaN,Infinity這些特殊值都是Global對象的屬性,還有所有的內置引用類型的構造函數(Array,Date等)都是的,只是不能通過Global.Array這樣方法輸出來,它們都被映射到了window對象上了.
- 介紹
- HTML/CSS 教程
- 第 1 章 HTML5 概述
- 第 2 章 基本格式
- 第 3 章 文本元素
- 第 4 章 超鏈接和路徑
- 第 5 章 分組元素
- 第 6 章 表格元素
- 第 7 章 文檔元素
- 第 8 章 嵌入元素
- 第 9 章 音頻和視頻
- 第 10 章 表單元素[上]
- 第 10 章 表單元素[中]
- 第 10 章 表單元素[下]
- 第 11 章 全局屬性和其他
- 第 12 章 CSS 入門
- 第 13 章 CSS 選擇器[上]
- 第 14 章 CSS 顏色與度量單位
- 第 15 章 CSS 文本樣式[上]
- 第 15 章 CSS 文本樣式[下]
- 第 16 章 CSS 盒模型[上]
- 第 16 章 CSS 盒模型[下]
- 第 17 章 CSS 邊框與背景[上]
- 第 17 章 CSS 邊框與背景[下]
- 第 18 章 CSS 表格與列表
- 第 19 章 CSS 其他樣式
- 第 20 章 CSS3 前綴和 rem
- 第 21 章 CSS3 文本效果
- 第 21 章 CSS3 文本效果
- 第 23 章 CSS3 邊框圖片效果
- 第 24 章 CSS3 變形效果[下]
- 第 25 章 CSS3 過渡效果
- 第 26 章 CSS3 動畫效果
- 第 27 章 CSS 傳統布局[上]
- 第 27 章 CSS 傳統布局[下]
- 第 28 章 CSS3 多列布局
- 第 29 章 CSS3 彈性伸縮布局[上]
- 第 29 章 CSS3 彈性伸縮布局[中]
- 第 29 章 CSS3 彈性伸縮布局[下]
- 第 30 章 使用 Emmet 插件
- Bootstrap 教程
- 第 1 章 Bootstrap 介紹
- 第 2 章 排版樣式
- 第 3 章 表格和按鈕
- 第 4 章 表單和圖片
- 第 5 章 柵格系統
- 第 6 章 輔組類和響應式工具
- 第 7 章 圖標菜單按鈕組件
- 第 8 章 輸入框和導航組件
- 第 9 章 路徑分頁標簽和徽章組件
- 第 10 章 巨幕頁頭縮略圖和警告框組件
- 第 11 章 進度條媒體對象和 Well 組件
- 第 12 章 列表組面板和嵌入組件
- 第 13 章 模態框插件
- 第 14 章 下拉菜單和滾動監聽插件
- 第 15 章 標簽頁和工具提示插件
- 第 16 章 彈出框和警告框插件
- 第 17 章 按鈕和折疊插件
- 第 18 章 輪播插件
- 第 19 章 附加導航插件
- 第 20 章 項目實戰--響應式導航[1]
- 第 20 章 項目實戰--響應式輪播圖[2]
- 第 20 章 項目實戰--首頁內容介紹[上][3]
- 第 20 章 項目實戰--首頁內容介紹[下][4]
- 第 20 章 項目實戰--資訊內容[5,6]
- 第 20 章 項目實戰--案例和關于[7]
- javaScript 教程
- javascript快速入門1--JavaScript前世今生,HelloWorld與開發環境
- javascript快速入門2--變量,小學生數學與簡單的交互
- javascript快速入門3--分支判斷與循環
- javascript快速入門4--函數與內置對象
- javascript快速入門5--數組與對象
- javascript快速入門6--Script標簽與訪問HTML頁面
- javascript快速入門7--ECMAScript語法基礎
- javascript快速入門8--值,類型與類型轉換
- javascript快速入門9--引用類型
- javascript快速入門10--運算符,語句
- javascript快速入門11--正則表達式
- javascript快速入門12--函數式與面向對象
- javascript快速入門13--BOM——瀏覽器對象模型(Browser Object Model)
- javascript快速入門14--DOM基礎
- javascript快速入門15--節點
- javascript快速入門15--表單
- javascript快速入門16--表格
- javascript快速入門17--事件
- javascript快速入門18--樣式
- javascript快速入門19--定位
- javascript快速入門20--Cookie
- javascript快速入門21--DOM總結
- javascript快速入門22--Ajax簡介
- javascript快速入門23--XHR—XMLHttpRequest對象
- javascript快速入門24--XML基礎
- javascript快速入門25--瀏覽器中的XML
- javascript快速入門26--XPath
- javascript快速入門27--XSLT基礎
- PHP 教程
- 第一章 如何加載運行已發布的PHP項目
- 第二章 PHP基礎
- 第三章 操作符與控制結構
- 第四章 數學運算
- 第五章 數組
- 第六章 目錄與文件
- 第七章 自定義函數
- 第八章 字符串處理
- 第九章 正則表達式
- 第十章 日期與時間
- 第十一章 表單與驗證
- 第十二章 會話控制
- 第十三章 上傳文件
- 第十四章 處理圖像
- 第十五章 MySQL 數據庫
- 第十六章 PHP 操作MySQL
- 第十七章 面向對象基礎
- 第十八章 面向對象的特性
- 第十九章 面向對象的工具