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中定義的變量不會提升,在嚴格模式下,外部不能訪問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()方法相同,接受一個參數,要麼是一個正則表達式,要麼是一個RegExp對象 位置方法 indexOf()接受兩個參數:要查找的項和(可選)表示查找起點位置的索引,indexOf()從數組的開頭向後查找,lastIndexOf()則從數組末尾向前查找
在比較項是否相等時,會使用全等比較,沒有找到返回-1
從字符串中查找子字符串,返回子字符串的位置,沒有找到返回-1,indexOf()從前往後查找,lastIndexOf()從後往前找
第二個可選參數表示從哪個位置開始搜索
縮小方法 reduce()接受兩個參數:
1、執行函數(前一個值,當前值,項的索引,數組),這個函數的返回值會作為第一個參數自動傳入下一項,第一次迭代發生在數組的第二項上
2、(可選)初始值
reduce()從數組第一項開始,遍歷至最後,reduceRight()從數組最後一項開始,遍歷至第一項
search() 接受一個參數,和match()相同,返回字符串中第一個匹配項的索引,沒有找到匹配項時返回-1,search()始終從字符串開頭向後查找 lastIndexOf() lastIndexOf() reduceRight() replace() 接受兩個參數:一個RegExp對象或字符串和一個字符串或函數,若第一個參數為字符串,則只會替換第一個字符串,若想替換所有子字符串,第一個參數必須為指定了全局標志(g)的正則表達式 判斷方法 isArray() 靜態方法,接受一個參數,返回這個參數是否為Array split()基於指定的分隔符將一個字符串分割成多個字符串,並將結果放在一個數組中返回,分隔符可以是字符串,也可以是正則表達式。可選的第二個參數用於指定數組的最大長度
說明:
(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
(4)判斷一個對象是否為數組時,在ES5中可以直接使用Array.isArray(obj), 在不支持isArray方法的環境中時,可以使用obj instanceof Array來判斷只有一個作用域的情況,但是更加穩妥的判斷方法是利用Array對象的內部屬性[[Class]]來判斷:
復制代碼 代碼如下:
function isArray(obj){
return Object.prototype.toString.call(obj) == '[object Array]';
}
(5)關於String的slice()、sbustr()、substring(),如果只傳入了第一個參數,則截取從第一個參數至末尾。當傳入負參數時:
A、slice()會將負參數加上字符串長度,使參數為正
B、substr()會將負的第一個參數加上字符串的長度,將負的第二個參數轉換為0
C、substring()會將所有負參數轉換為0,如果第2個參數小於第1個參數,會互換兩個參數
(6)關於String對象replace()方法的第二個參數
如果是字符串,可以使用一些特殊字符將正則表達式操作得到的值插入到結果字符串中,這些特殊字符有:
字符序列
替換文本
$$
$
$&
匹配整個模式的字符串,與RegExp.lastMatch的值相同
$'
匹配的子字符串之前的子字符串,與RegExp.leftContext的值相同
$`
匹配的子字符串之後的子字符串,與RegExp.rightContext的值相同
$n
匹配第n個捕獲組的子字符串,其中n等於1~9,如果正則表達式中沒有定義捕獲組,則使用空字符串
$nn
匹配第nn個捕獲組的子字符串,其中n等於01~99,如果正則表達式中沒有定義捕獲組,則使用空字符串
如果是函數,這個函數接受的參數:模式的匹配項,第一個捕獲組的匹配項,...,第n個捕獲組的匹配項,模式的匹配項在字符串中的位置,原始字符串。函數應該返回一個字符串,表示應該被替換的匹配項。
(7)String對象的HTML方法
方法 輸出結果 方法 輸出結果 anchor(name) <a name="name">string</a> italics() <i>string</i> big() <big>string</big> link(url) <a href="url">url</a> bold() <b>string</b> small() <small>string</small> fixed() <tt>string</tt> strike() <strike>string</strike> fontcolor(color) <font color="color">string</font> sub() <sub>string</sub> fontsize(size) <font size="size">string</font> sup() <sup>string</sup>
4、Number與Boolean
String、Number和Boolean對象是相應簡單數據類型的包裝對象,他們都有一個共同的特征:作為構造函數調用時是創建一個對象,作為一般函數調用時則是類型轉換。由於所有對象相應的Boolean類型值都是true,所以需要特別注意的是new Boolean(false)在布爾運算中會作為true去處理,這裡的建議就是永遠不要使用Boolean對象。
復制代碼 代碼如下:
var falseValue = false;
var falseObject = new Boolean(false);
console.info(typeof falseValue);//boolean
console.info(typeof falseObject);//object
console.info(falseValue instanceof Boolean);//false
console.info(falseObject instanceof Boolean);//true
console.info(falseValue && true);//false
console.info(falseObject && true);//true
String、Number和Boolean類型的變量可以直接調用相應包裝對象的方法,實際上在後台會自動轉換為相應包裝對象,然後調用方法。String和Boolean類型的字面量也可以直接調用包裝對象的方法,但是Number類型的字面量不能直接調用Number對象的方法。
復制代碼 代碼如下:
var num = 10;
console.info(num.toFixed(2));//10.00
//console.info(10.toFixed(2));//異常
console.info(false.toString());//false
console.info('abcdefg'.substr(3));//defg
關於包裝對象的屬性和方法,String對象已經在上一小節列出,Boolean對象除覆蓋了Object的toString()和valueOf()外沒什麼特別需要注意的,下面再總結一下Number對象的屬性和方法。
靜態屬性(常量)
說明
方法
說明
Number.MAX_VALUE
Number類型能夠表示的最大值
valueOf()
返回對象表示的基本類型的數值
Number.MIN_VALUE
Number類型能夠表示的最小值
toLocaleString()
返回對象表示的數值的字符串形式
Number.NaN
NaN
toString()
返回對象表示的數值的字符串形式,可以接受一個表示進制的參數
Number.NEGAIVE_INFINITY
負無窮
toFixed()
按照指定的小數位返回數值的字符串表示,如果數值比指定的小數位多,會進行四捨五入處理
Number.POSITIVE_INFINITY
正無窮
toExponential()
返回以指數表示法表示的數值的字符串形式,接受一個表示小數個數的參數
toPrecision()
接受一個表示數值的所有數字的位數(不包括指數部分),可能返回固定大小格式,也可能返回指數形式
5、Date
ECMAScript中的Date對象和Java中的java.util.Date一樣,采用UTC(Coordinated Universal Time,國際協調時間)1970年1月1日午夜(零時)開始經過的毫秒數來保存日期。
(1)創建日期對象
A、構造函數:可以通過new Date()創建對象自動獲取當前日期和時間,也可以傳入表示日期的毫秒數來創建日期,還可以傳入和下面的Date.parse()與Date.UTC()相同的參數(在後台會先調用Date.parse()或Date.UTC(),後台調用Date.UTC()時是基於系統本地時區而非GMT創建的)來創建日期。
B、Date.parse():接受一個表示日期的字符串參數,然後嘗試根據這個字符串返回相應日期的毫秒數。日期格式和具體的實現及地區有關。如果傳入的字符串不能表示日期,返回NaN。
C、Date.UTC():返回表示日期的毫秒數,參數分別是年份、基於0的月份、月中的哪一天(1~31)、小時(0~23)、分鐘、秒以及毫秒數,這些參數中,前面兩個參數(年月)是必須的,沒有提供天數時默認為1,其它參數沒有提供時默認為0。
D、Date.now():在ES5中新增,返回表示調用這個方法的日期和時間的毫秒數。這可以用來分析代碼執行的時間:
復制代碼 代碼如下:
//支持Date.now()時 //不支持Date.now()的情況下
var start = Date.now(); var start = +new Date();
//doSomething(); //doSomething();
var end = Date.now(); var end = +new Date();
var time = end -start; var time = end - start;
(2)方法列表
方法 說明 getter/setter方法 說明 toLocaleString() 按照與浏覽器設置的地區相適應的格式返回日期和時間,其中時間一般以12小時制表示(通常含AM或PM) setTime(毫秒) 沒有對應的UTC方法 toString() 通常返回帶有時區信息的日期和時間,其中時間一般以24小時制表示 setFullYear(年) 4位數的年份 valueOf() 返回日期的毫秒表示,這為日期的比較提供了便利 setMonth(月) 0~11,0表示一月,11表示十二月,超過11增加年份 toDateString() 以特定於實現的格式顯示星期幾、月、日和年 setDate(日) 超過范圍時會增加月份 toTimeString() 以特定於實現的格式顯示時、分、秒和時區 setHours(時) 傳入值超過了23會增加天數 toLocaleDateString() 以特定於實現的格式顯示星期幾、月、日和年 setMinutes(分) 傳入值超過了59會增加小時數 toLocaleTimeString() 以特定於實現的格式顯示時、分、秒 setSeconds(秒) 傳入值超過了59會增加分鐘數 toUTCString() 以特定於實現的格式顯示完整的UTC日期 setMilliseconds(毫秒) toGMTString() 和toUTCString()等價,主要是為了向後兼容而保留的 getDay() 沒有對應的setter方法,0表示星期日,6為星期六 getTimezoneOfSet() 返回本地時間與UTC時間相差的毫秒數
說明:上表getter/setter列中,除了setTime()外,均有一套相應UTC方法,比如對應setFullYear()有getFullYear()、setUTCFullYear()、getUTCFullYear()方法。
6、Error
(1)從ES3開始引入了try-catch語句,用於捕獲異常,結構和Java中的異常處理類似。這裡需要注意的是,在使用finally子句時,如果裡面有return語句,由於finally語句無論怎樣都會執行,因此會覆蓋之前的return語句。
復制代碼 代碼如下:
function testFinally(){
try{
return 2;
}catch(error){
return 1;
}finally{
return 0;
}
}
console.info(testFinally());//0
說明:按照規范,catch和finally子句只要有一個即可,但是在IE7的實現中有一個bug,沒有catch子句時就不會執行finally子句,所以為了保證兼容性,每一個try都加上catch子句(如果需要在外層處理,可以把捕獲的異常使用throw向外拋出)。
(2)錯誤類型
錯誤類型 說明 Error Error是所有錯誤類型的父類,因此所有錯誤類型共享了一組相同的屬性和方法,這個基類型的主要作用是供開發人員拋出自定義錯誤 EvalError 在使用eval()函數而發生異常時拋出,簡單的說,如果沒有把eval()當成函數調用,就會拋出錯誤 RangeError 在數值超出范圍時拋出,如定義數組時傳入負參數就會拋出RangeError ReferenceError 找不到對象的情況下拋出 SyntaxError 把語法錯誤的字符串傳入eval()時拋出 TypeError 在變量中保存著意外的類型,或者訪問不存在的方法時,會導致這種錯誤 URIError 在使用encodeURI()或decodeURI(),URI格式不正確時拋出
注:這裡只是簡要列舉了一些內建的錯誤對象,沒有對錯誤處理以及調試技術做過多的闡述,感興趣的朋友可以自行查找相關資料。