內建對象就好比是JDK中的類庫,開發人員可以直接拿來使用,這極大的方便了常見的編程任務。這篇文章就來瀏覽一下主要的內建對象,當然,我們並不是第一次接觸內建對象,前面已經接觸到的就有Object、Function、Boolean、Number、String,對於已經介紹過的,這裡再總結複習一下,沒有介紹過的,根據相關性來對比的總結,RegExp對象及Regex在下一篇中再單獨介紹。
1、內建全域單例對象
(1)內建全域單例對象:在整個執行環境中只有一個對象執行個體,這些對象沒有內部屬性[[Construct]]和[[Call]],因此不能使用new來建立,也不能作為函數來調用,而是直接使用對象名稱來引用其屬性和方法(對於全域對象,則可以直接使用屬性和方法名)。內建全域單例對象有Global、Math、JSON。
(2)內建常量:主要是指內建全域單例對象的屬性,這些屬性的[[Writable]]、[[Configurable]]、[[Enumerable]]特性全部為false,因此不能修改屬性值,不能刪除屬性,也不能在for-in迴圈中枚舉。這些內建常量有:
對象 |
名稱 |
常量值 |
說明 |
對象 |
名稱 |
常量值 |
說明 |
Global |
NaN |
NaN |
表示不是數值 |
Math |
E |
≈2.718 |
自然對數的底數 e |
Infinity |
+∞ |
正無窮 |
LN10 |
≈2.303 |
2 的自然對數 |
undefined |
undefined |
未定義 |
LN2 |
≈0.693 |
10的自然對數 |
LOG2E |
≈1.443 |
e 的以2 為底的對數 |
LOG10E |
≈0.434 |
e 的以10為底的對數 |
PI |
≈3.142 |
圓周率,即圓周長與直徑的比 |
SQRT1_2 |
≈0.707 |
2的平方根的倒數 |
SQRT2 |
≈1.414 |
2的平方根 |
註:Global對象中的常量可以使用名稱直接存取,Math對象中的常量需使用類似Math.PI的形式來訪問。
(3)內建靜態方法:
所屬對象 |
類別 |
方法 |
說明 |
Global |
全域解析方法 |
eval(x) |
解析Javascript字串,eval中定義的變數不會提升,在strict 模式下,外部不能訪問eval內定義的變數 |
字串解析為Number |
parseInt(string,radix) |
將字串解析為整數,可以傳入一個進位,會忽略前置空格 |
parseFloat(string) |
將字串解析為浮點數,會忽略前置的空格和前置0 |
Number判斷方法 |
isNaN(number) |
判斷是否為數字 |
isFinite(number) |
判斷是否為有限數 |
URI處理方法 |
encodeURI(uri) |
對URI編碼,用於整個URI,用特殊的UTF-8編碼替換所有無效字元,不會對本身屬於URI的特殊字元編碼,如冒號,正斜杠,問號,井號等。 |
decodeURI(ecodedURI) |
對使用ecnodeURI()編碼的字串解碼 |
encodeURIComponent(uriComponent) |
對URI編碼,用於URI中的某一段,會對發現的任何非標準字元進行解碼 |
decodeURIComponent(encodedURIComponent) |
對使用ecnodeURIComponent()編碼的字串解碼 |
內建物件建構器方法 |
Object、Function、Array、String、Number、Boolean、Date、RegExp Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError |
這裡每一個建構函式都構成了一個內建的物件類型 |
Math |
三角函數 |
sin(x)、cos(x)、tan(x) |
x的正弦、餘弦、正切 |
反三角函數 |
asin(x)、acos(x)、atan(x)、atan2(y,x) |
x的煩正弦、反餘弦、反正切、y/x的反正切 |
舍入函數 |
ceil(x)、floor(x)、round(x) |
向上舍入(大於該數的最小整數)、向下舍入(小於該數的最大整數)、四捨五入 |
最值函數 |
max([value1[value2[,...]]])、min([value1[,value2[,...]]]) |
最大值、最小值 |
隨機函數 |
random() |
返回介於0和1之間的隨機數,不包括0和1.隨機公式:隨機值=Math.floor(Math.random() * 可能值的個數 + 初始值) |
其它常見數學函數 |
abs(x)、exp(x)、log(x)、pow(x,y)、sqrt(x) |
絕對值、Math.E的x次冪、x的自然對數、x的y次冪、x的平方根 |
JSON |
解析 |
parse(text[,reviver]) |
把JSON字串解析外為Javascript值 |
序列化 |
stringify(value[,replacer[,space]]) |
把Javascript對象序號為JSON字串,預設情況下不包括空格和縮排,所有函數、原型成員以及值為undefined的屬性會被忽略 |
說明:
(1)全域對象中還有escape()/unescape()方法,由於這兩個方法只能正確編碼ASCII字元已經被廢棄,而使用上表中的encodeURI()等方法來替換。
(2)JSON.parse()可以接受一個可選的參數,這個參數是一個函數,被稱為還原函數,還原函數返回一個值,接受兩個參數:一個鍵和一個值。如果還原函數返回undefined,表示要從結果中刪除相應的鍵,返回其他值,則將該值插入到結果中。
(3)JSON.stringify()可以接受二個選擇性參數:
A、第一個選擇性參數是個過濾器,可以是一個數組,也可以是一個函數。如果是一個數組,那麼結果中只保留這個數組中列出的屬性;如果是一個函數,這個函數被稱為替換函數,接受兩個參數:一個鍵和一個值。替換函數返回undefined時會忽略這個鍵,否則就將傳回值作為這個鍵的值插入到相應位置。
B、第二個選擇性參數是個選項,表示是否在JSON字串中保留縮排。如果這個參數是數字,表示每個層級縮排的空格數(最大不能超過10,超過10時自動化佈建為10),如果這個參數是字串,則將作為縮排字元處理。
在調用JSON.stringify(obj)時,如果obj中有toJSON()方法並返回一個有效值時,會首先調用這個方法。
2、Object與Function
這兩個內建對象在前面已經重點討論過,這裡總結一下:
對象/建構函式/[[Class]] |
構造器屬性(靜態屬性) |
原型屬性 |
執行個體屬性 |
內部屬性 |
Object |
prototype |
constructor |
|
[[Prototype]] |
defineProperty() |
toString() |
[[Class]] |
defineProperties() |
toLocaleString() |
[[Extensible]] |
getOwnPropertyDescriptor() |
valueOf() |
[[Get]] |
preventExtensions() |
hasOwnProperty() |
[[GetOwnProperty]] |
seal() |
propertyIsEnumerable() |
[[GetProperty]] |
isSeal() |
isPrototypeOf() |
[[Put]] |
frozen() |
[[CanPut]] |
isFreeze() |
[[HasProperty]] |
create() |
[[Delete]] |
getOwnPropertyNames() |
[[DefaultValue]] |
getPrototypeOf() |
[[DefineOwnProperty]] |
keys() |
|
Function |
prototype |
call() |
prototype |
[[HasInstance]] |
length |
apply() |
length |
[[Scope]] |
bind() |
[[FormalParameters]] |
[複製代碼 代碼如下:] |
[[Construct]] |
[[Call]] |
說明:
(1)構造器屬性(靜態屬性)是直接定義在建構函式這個對象本身上的屬性,只能通過建構函式名來直接存取,原型屬性是定義在建構函式原型對象上的屬性,可以通過原型去訪問,但更重要的是可以通過建構函式的執行個體去訪問。比如上表Object對象的defineProperty()就只能以Object.defineProperty()的形式來調用,而hasOwnProperty()這可以在任意一個Object執行個體對象上調用。
(2)Object本身是一個(構造)函數,也就是Function類的一個執行個體,因此也就有了Function執行個體所具有的屬性prototype和length(===1,上表未列出),同時,由於Object還是一個建構函式,也就構成了一種(內建)類型Object,通過原型繼承,這個類型是ES中所有其它類型的基類,也就是說所有的對象都可以訪問上表中Object的原型屬性。這裡原型繼承是基於下面原理來實現的:Object原型的原型是null(即有Object.getPrototypeOf(Object.prototype)===null),其它對象的原型是Object的執行個體。
(3)Function是一個建構函式,因此構成了一種內建類型Function,同時,因為是函數,也就是一個對象,這個對象的原型對象是Object的一個執行個體,因而可以訪問Object的原型屬性(Function類中有些方法覆蓋了Object中的原型方法,上表未列出)。
(4)注意區分Function類中的構造器屬性和執行個體屬性,可以這樣來理解:首先Function類的所有執行個體都有屬性prototype(函數原型對象)和length(形式參數的個數),然後因為Function本身也是一個函數,是Function類的一個執行個體,因此有prototype和length屬性(屬性值已經確定了),而這屬性是直接定義在Function建構函式上的,也就是構造器屬性了。
(5)其它關於Object和Function中不理解的地方可以參考前面的文章,也可以自己查閱相關資料。
3、Array與String
將Array和String這兩種內建對象放在一起,主要是因為他們有一些方法比較類似,我自己就常常有搞不拎清的時候,於是借這個機會比較一下。
功能類似方法 |
Array對象專屬方法 |
String對象專屬方法 |
類別 |
Array方法 |
String方法 |
類別 |
方法 |
說明 |
類別 |
方法 |
說明 |
方法 |
說明 |
方法 |
說明 |
共有屬性 |
length |
數組項的個數,可以修改長度來實現添加或移除數組項的功能 |
length |
字串中字元的個數 |
棧和隊列 |
pop() |
移除數組最後一項,修改數組長度,返回被移除的項 |
去空格 |
trim() |
去掉字串前後的空格 |
對象建立 |
建構函式 |
1、new Array([item0[,item1[,...]]]) 2、new Array(len) 上面兩種方式的new可以省略 |
建構函式 |
new String([value]) 注意:上面的new省略時,則作為類型轉換函式調用 |
push() |
接受任意個參數,把它們逐個添加到數組末尾,並返回修改後數組的長度 |
比較 |
localeCompare() |
對象在參數前返回負數 相等返回0 後面返回正數 |
數組字面量 |
使用方括弧[] |
字串字面量 |
使用成對的單引號或成對的雙引號 |
shift() |
移除數組第一項並返回,修改數組長度 |
HTML方法 |
見附表 |
用於簡化常見HTML格式化任務的方法,已經不建議使用 |
轉換方法 |
toLocaleString() |
調用數組每一項的toLocaleString(),然後用逗號串連起來 |
toLocaleString() |
返回對象表示的字串 |
unshift() |
接受任意個參數,並添加到數組前面,返回新數組的長度 |
大小寫轉換 |
toLowerCase() |
轉小寫 |
toString() |
調用數組每一項的toString(),然後用逗號串連起來 |
toString() |
返回對象表示的字串 |
排序 |
reverse() |
反轉數組項的順序 |
toLocaleLowerCase() |
|
valueOf() |
返回數組本身,即有array === array.valueOf() |
valueOf() |
返回對象表示的字串 |
sort() |
預設按升序排序,可以接受一個比較函數 |
toUpperCase() |
轉大寫 |
串連方法 |
join() |
傳入一個參數作為分隔字元,將數組每一項串連起來,預設為逗號 |
+ |
字串相加 |
迭代方法 兩個參數: 1、執行函數(數組項的值,該項在數組中的位置,數組) 2、範圍 |
every() |
對數組中每一項運行執行函數,每一項都返回true時返回true |
toLocaleUpperCase() |
|
concat() |
建立一個原數組的副本,將傳入的參數壓入新數組並返回新數組 |
concat() |
拼接字串,更多情況是直接使用“+”拼接 |
some() |
對數組中每一項運行執行函數,如果有其中一項執行函數返回true就返回true |
字元方法 |
charAt() |
1個參數:基於0的字元位置 charAt()返回單字元字串,charCodeAt()返回字元編碼 |
截取方法 |
slice() |
接受1至2個參數,即要返回項的起始和結束位置 1、只有一個參數時,返回該參數位置開始到末尾的所有項 2、參數為負數時,加上數組長度使其變為正數 |
slice() |
參數:開始位置,最後一個字元後面的位置 |
forEach() |
對數組中每一項運行執行函數,沒有傳回值 |
charCodeAt() |
splice |
第1個參數:要刪除的起始項位置;第2個參數:要刪除的項數;第3個及之後的參數:要插入的項 1、刪除:指定2個參數,要刪除的第一項的位置和要刪除的項數 2、插入:提供3個參數,起始位置,0,要插入的項 3、替換:提供3個參數,起始位置,刪除的項數,要插入的項 |
substr() |
參數:開始位置,字元個數 |
map() |
對數組中每一項運行執行函數,返回每次調用的結果組成的數組 |
fromCharCode() |
這是String對象的靜態函數,將接受到的一或多個字元編碼轉變為字串 |
substring() |
參數:開始位置,最後一個字元後面的位置 |
filter() |
對數組中的每一項運行執行函數,返回執行函數返回true的項組成的數組 |
模式比對方法 |
match() |
與RegExp的exec()方法相同,接受一個參數,要麼是一個Regex,要麼是一個RegExp對象 |
位置方法 |
indexOf() |
接受兩個參數:要尋找的項和(可選)表示尋找起點位置的索引,indexOf()從數組的開頭向後尋找,lastIndexOf()則從數組末尾向前尋找 在比較項是否相等時,會使用全等比較,沒有找到返回-1 |
indexOf() |
從字串中尋找子字串,返回子字串的位置,沒有找到返回-1,indexOf()從前往後尋找,lastIndexOf()從後往前找 第二個選擇性參數表示從哪個位置開始搜尋 |
縮小方法 |
reduce() |
接受兩個參數: 1、執行函數(前一個值,當前值,項的索引,數組),這個函數的傳回值會作為第一個參數自動傳入下一項,第一次迭代發生在數組的第二項上 2、(可選)初始值 reduce()從數組第一項開始,遍曆至最後,reduceRight()從數組最後一項開始,遍曆至第一項 |
search() |
接受一個參數,和match()相同,返回字串中第一個匹配項的索引,沒有找到匹配項時返回-1,search()始終從字串開頭向後尋找 |
lastIndexOf() |
lastIndexOf() |
reduceRight() |
replace() |
接受兩個參數:一個RegExp對象或字串和一個字串或函數,若第一個參數為字串,則只會替換第一個字串,若想替換所有子字串,第一個參數必須為指定了全域標誌(g)的Regex |
|
|
|
|
|
判斷方法 |
isArray() |
靜態方法,接受一個參數,返回這個參數是否為Array |
split() |
基於指定的分隔字元將一個字串分割成多個字串,並將結果放在一個數組中返回,分隔字元可以是字串,也可以是Regex。可選的第二個參數用於指定數組的最大長度 |
說明:
(1)上表中紅色部分表示在ES5版本中新增的方法,藍色部分為個人認為比較常用的屬性和方法。
(2)ECMAScript中數組的每一項可以儲存任意類型的資料,並且數組的大小可以隨著資料的添加而自動的動態調整。
(3)使用Array建構函式建立數組時,如果傳入一個數實值型別的參數,則作為數組長度處理,如果這個數值小於0或者不是一個整數,會拋出RangeError異常(如果確實需要將這個數值作為數組第1項,可以使用數組字面量),其它數實值型別的參數,則作為數組的第一項值處理,並且數值的長度值為1。
[code]
try{
var a = new Array(-2);
}catch(e)
{
console.info(e);//RangeError
}
//var g = new Array(1.1);異常
var b = new Array(0);
var c = new Array(2);
var d = new Array('data');
var e = [-2];
var f = new Array(-1,-2);
console.info(b.length);//0
console.info(c.length);//2
console.info(d.length);//1
console.info(e.length);//1
console.info(f.length);//2