參考基礎教程的整理,方便記憶
一、Object對象 (O大寫)
- 所有其他對象都繼承自這個對象。Object本身也是一個構造函數,可以直接通過它來生成新對象。
- 作為構造函數使用時,可以接受一個參數。參數若為對象,則直接返回原對象;若是一個原始類型的值,則返回該值對應的包裝對象。
- Object.keys(只返回可枚舉的屬性)和Object.getOwnPropertyNames(返回不可枚舉的屬性名。),一般用來遍歷對象的屬性。
- 參數都是一個對象,都返回一個數組,該數組的成員都是對象自身的(而不是繼承的)所有屬性名。
- 一般都使用Object.keys方法,遍歷數組的屬性。
var a = ["Hello", "World"];
Object.keys(a)
// ["0", "1"]
Object.getOwnPropertyNames(a)
// ["0", "1", "length"]
-
對象屬性模型的相關方法
- Object.getOwnPropertyDescriptor():獲取某個屬性的attributes對象。
- Object.defineProperty():通過attributes對象,定義某個屬性。
- Object.defineProperties():多個屬性。
- Object.getOwnPropertyNames():返回直接定義在某個對象上面的全部屬性的名稱。
-
控制對象狀態的方法
- Object.preventExtensions():防止對象擴展。
- Object.isExtensible():判斷對象是否可擴展。
- Object.seal():禁止對象配置。
- Object.isSealed():判斷一個對象是否可配置。
- Object.freeze():凍結一個對象。
- Object.isFrozen():判斷一個對象是否被凍結。
-
原型鏈相關方法
- Object.create():指定原型對象和屬性,返回一個新的對象。
- Object.getPrototypeOf():獲取對象的Prototype對象。
-
Object實例對象的方法,主要有以下六個。
- valueOf():返回當前對象對應的值。
- toString():返回當前對象對應的字符串形式。
- toLocaleString():本地字符串形式。
hasOwnProperty():判斷某個屬性是否為當前對象自身的屬性,還是繼承自原型對象的屬性。 - isPrototypeOf():判斷當前對象是否為另一個對象的原型。
- propertyIsEnumerable():判斷某個屬性是否可枚舉。
Object.prototype.valueOf()作用是返回一個對象的“值”,默認情況下返回對象本身。
var o = new Object();
o.valueOf() === o // true
- Object.prototype.toString()作用是返回一個對象的字符串形式,默認情況下返回類型字符串。也可判斷數據類型。
二、Array 對象
- Array是JavaScript的內置對象,同時也是一個構造函數,可以用它生成新的數組。(不同的參數,會導致它的行為不一致。)
- Array.isArray()用來判斷一個值是否為數組。
var a = [1, 2, 3];
typeof a // "object"
Array.isArray(a) // true
//typeof運算符只能顯示數組-的類型是Object,而Array.isArray方法可以對數組返回true。
- valueOf返回數組本身。toString返回數組的字符串形式。
- push方法用于在數組的末端添加一個或多個元素,并返回添加新元素后的數組長度。會改變原數組。
var a = [];
a.push(1)
//合并兩個數組
var a = [1, 2, 3];
var b = [4, 5, 6];
Array.prototype.push.apply(a, b)
// 或者
a.push.apply(a, b)
// 等同于
a.push(4, 5, 6)
a // [1, 2, 3, 4, 5, 6]
- 可向對象添加元素,添加后的對象變成類似數組的對象,即新加入元素的鍵對應數組的索引,并且對象有一個length屬性。
var a = {a: 1};
[].push.call(a, 2);
a // {a:1, 0:2, length: 1}
[].push.call(a, [3]);
a // {a:1, 0:2, 1:[3], length: 2}
- pop方法用于刪除數組的最后一個元素,并返回該元素。注意,該方法會改變原數組。
- 對空數組使用pop方法,不會報錯,而是返回undefined。
- push和pop結合使用,就構成了“后進先出”的棧結構(stack)。
- join方法以參數作為分隔符,將所有數組成員組成一個字符串返回。如果不提供參數,默認用逗號分隔
var a = [1, 2, 3, 4];
a.join(' ') // '1 2 3 4'
a.join(' | ') // "1 | 2 | 3 | 4"
a.join() // "1,2,3,4"
concat方法用于多個數組的合并。它將新數組的成員,添加到原數組的尾部,然后返回一個新數組,原數組不變。
-
shift用于刪除數組的第一個元素,并返回該元素。注意,該方法會改變原數組。
- shift可以遍歷并清空一個數組。
- push和shift結合使用,就構成了“先進先出”的隊列結構(queue)。
unshift方法用于在數組的第一個位置添加元素(可多個),并返回添加新元素后的數組長度。會改變原數組。
reverse用于顛倒數組中元素的順序,返回改變后的數組。改變原數組。
-
slice(起始,終止(不包含在內))用于提取原數組的一部分,返回一個新數組,原數組不變。
- 若參數是負數,則表示倒數計算的位置。
- 如果參數值大于數組成員的個數,或者第二個參數小于第一個參數,則返回空數組。
splice(起始,個數,被插入數組的新元素(可有可無))刪除原數組的一部分成員,并可以在被刪除的位置添加入新的數組成員,返回值是被刪除的元素。會改變原數組。
sort方法對數組成員進行排序,默認是按照字典順序排序。排序后,原數組將被改變。數值會被先轉成字符串。
-
map方法對數組的所有成員依次調用一個函數,根據函數結果返回一個新數組。原數組沒有變化。
- 遍歷字符串的每個字符要通過函數的call方法間接使用,或者先將字符串轉為數組。
- 接受一個函數作為參數。該函數調用時,map方法會將其傳入三個參數,分別是當前成員、當前位置和數組本身。
- map方法不會跳過undefined和null,但是會跳過空位.
-
forEach與map很相似,但無返回值。(可接受第二個參數,用來綁定回調函數的this關鍵字。)
- forEach無法中斷執行,會將所有成員遍歷完。若需符合某種條件時,中斷遍歷,用for循環。
filter的參數是一個函數,所有數組成員依次執行該函數,返回結果為true的成員組成一個新數組返回。該方法不會改變原數組。
-
some(),every()用來判斷數組成員是否符合某種條件
- every則是所有數組成員的返回值都是true,才返回true。
- some是只要有一個數組成員的返回值是true則為ture。
-
reduce方法和reduceRight方法依次處理數組的每個成員,最終累計為一個值。它們的差別是,reduce是從左到右處理,reduceRight相反
第一個參數都是一個函數。該函數接受以下四個參數。- 累積變量,默認為數組的第一個成員(必須)
- 當前變量,默認為數組的第二個成員(必須)
- 當前位置(從0開始)(可選)
- 原數組(可選)
indexOf方法返回給定元素在數組中第一次出現的位置,如果沒有出現則返回-1。indexOf方法還可以接受第二個參數,表示搜索的開始位置。
lastIndexOf方法返回給定元素在數組中最后一次出現的位置,如果沒有出現則返回-1。如果數組中包含NaN,這兩個方法不適用,即無法確定數組成員是否包含NaN。
三、包裝對象
var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);
//生成了三個對象,與原始值的類型不同。
typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"
v1 === 123 // false
v2 === 'abc' // false
v3 === true // false
- valueOf方法返回包裝對象實例對應的原始類型的值。
new Number(123).valueOf() // 123
new String("abc").valueOf() // "abc"
new Boolean("true").valueOf() // tru
- toString方法返回實例對應的字符串形式
- 原始類型的自動轉換
'abc'.length // 3
//abc是一個字符串,本身不是對象,不能調用length屬性。
//自動將其轉為包裝對象,調用length屬性。
//調用結束后,這個臨時對象就會被銷毀。
//只讀的,無法修改。字符串無法添加新屬性。
'abc'.charAt === String.prototype.charAt
// true
- 如果包裝對象與原始類型值進行混合運算,包裝對象會轉化為原始類型(實際是調用自身的valueOf方法)。
new Number(123) + 123 // 246
new String('abc') + 'abc' // "abcabc"
- Boolean 對象
if (new Boolean(false)) {
console.log('true');
} // true
// false對應的包裝對象實例是一個對象,進行邏輯運算時,
//被自動轉化成布爾值true(所有對象對應的布爾值都是true)
if (new Boolean(false).valueOf()) {
console.log('true');
} // 無輸出
//實例的valueOf方法,則返回實例對應的原始值,本例為false。
if (Boolean(null)) {
console.log('true');
} // 無輸出
if (new Boolean(null)) {
console.log('true');
} // true
//對于一些特殊值,Boolean對象前面加不加new
//會得到完全相反的結果
四、 Number對象
- 數值對應的包裝對象,可以作為構造函數使用(用于生成值為數值的對象。),也可以作為工具函數使用。
var n = new Number(1);
typeof n // "object"
- Number對象的屬性
- Number.POSITIVE_INFINITY:正的無限,指向Infinity。
- Number.NEGATIVE_INFINITY:負的無限,指向-Infinity。
- Number.NaN:表示非數值,指向NaN。
- Number.MAX_VALUE:最大的正數,最小的負數為-Number.MAX_VALUE。
- Number.MIN_VALUE:表示最小的正數(即最接近0的正數,在64位浮點數體系中為5e-324),最接近0的負數為-Number.MIN_VALUE。
- Number.MAX_SAFE_INTEGER:表示能夠精確表示的最大整數,即9007199254740991。
- Number.MIN_SAFE_INTEGER:最小整數,-9007199254740991。
- Number.prototype.toString()
接受一個參數,表示輸出的進制。如果省略這個參數,默認將數值先轉為十進制,再輸出字符串
(10).toString(2) // "1010"
(10).toString(8) // "12"
//前面的數值要加括號或加兩個點(即理解為10.0.)
10..toString(2)
10 .toString(2) // "1010"
10.0.toString(2) // "1010"
- Number.prototype.toFixed()
- 轉為指定位數的小數,返回這個小數對應的字符串。
參數為指定的小數位數,有效范圍為0到20,超出這個范圍將拋出RangeError錯誤。
- 轉為指定位數的小數,返回這個小數對應的字符串。
- Number.prototype.toExponential()
- 將一個數轉為科學計數法形式。
- 參數表示小數點后有效數字的位數,范圍為0到20,超出這個范圍,會拋出一個RangeError。
- Number.prototype.toPrecision()
- 將一個數轉為指定位數的有效數字參數為有效數字的位數,范圍是1到21,超出這個范圍會拋出RangeError錯誤(不太可靠,跟浮點數不是精確儲存有關。)
- 自定義方法
五、String對象
- 生成字符串的包裝對象。
- 實際上,字符串的包裝對象是一個類似數組的對象(即很像數組,實質上不是數組)。
new String("abc")
// String {0: "a", 1: "b", 2: "c", length: 3}
- String對象還可將任意類型的值轉為字符串。
- String.fromCharCode()
- String對象提供的靜態方法(即定義在對象本身,而非對象實例),主要是fromCharCode()。參數是一系列Unicode碼點(傳入的參數不能大于0xFFFF),返回對應的字符串。
- charAt()返回指定位置的字符,參數是從0開始編號的位置。
- charCodeAt方法返回給定位置字符的Unicode碼點(十進制表示),相當于String.fromCharCode()的逆操作。
- charCodeAt方法返回的Unicode碼點不大于65536(0xFFFF)(兩個字節的字符的碼點)。否則必需連續使用兩次charCodeAt,讀入charCodeAt(i),和charCodeAt(i+1),將兩個16字節放在一起,才能得到準確的字符。
- 如果參數為負數,或大于等于字符串的長度,charCodeAt返回NaN。
- concat方法用于連接兩個字符串,返回一個新字符串,不改變原字符串。
'a'.concat('b', 'c') // "abc"
//可以接受多個參數
六、Math對象
該對象不是構造函數,不能生成實例,所有的屬性和方法都必須在Math對象上調用。
-
屬性
- Math.E:常數e。
- Math.LN2:2的自然對數。
- Math.LN10:10的自然對數。
- Math.LOG2E:以2為底的e的對數。
- Math.LOG10E:以10為底的e的對數。
- Math.PI:常數Pi。
- Math.SQRT1_2:0.5的平方根。
- Math.SQRT2:2的平方根。
-
方法
- Math.abs():絕對值
- Math.ceil():向上取整
- Math.floor():向下取整
- Math.max():最大值
- Math.min():最小值
- Math.pow():指數運算
- Math.sqrt():平方根
- Math.log():自然對數
- Math.exp():e的指數
- Math.round():四舍五入
- Math.random():隨機數
-
三角函數方法
- Math.sin():返回參數的正弦
- Math.cos():返回參數的余弦
- Math.tan():返回參數的正切
- Math.asin():返回參數的反正弦(弧度值)
- Math.acos():返回參數的反余弦(弧度值)
- Math.atan():返回參數的反正切(弧度值)
七、Date對象
- 日期和時間的操作接口??杀硎?970年1月1日00:00:00前后的各1億天(單位為毫秒)。
Date()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//可作為普通函數直接調用,返回一個代表當前時間的字符串。
Date(2000, 1, 1)
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//即使帶有參數,Date作為普通函數使用時,返回的還是當前時間。
- 可當構造函數使用。使用new命令,會返回一個Date對象的實例。不加參數,生成代表當前時間的對象。
var today = new Date();
var today = new Date();
today
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
// 等同于
today.toString()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//這個Date實例對應的字符串值,就是當前時間。
-
new Date(milliseconds)
- Date對象接受從1970年1月1日00:00:00 UTC開始計算的毫秒數作為參數。Unix時間戳(單位為秒)作為參數,須將Unix時間戳乘以1000。
new Date(1378218728000)
// Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
// 1970年1月2日的零時
var Jan02_1970 = new Date(3600 * 24 * 1000);
// Fri Jan 02 1970 08:00:00 GMT+0800 (CST)
// 1969年12月31日的零時
var Dec31_1969 = new Date(-3600 * 24 * 1000);
// Wed Dec 31 1969 08:00:00 GMT+0800 (CST)
//Date構造函數的參數可以是一個負數,表示1970年1月1日之前的時間。
- new Date(datestring),(month day, year hours:minutes:seconds)接受一個日期字符串作為參數,返回所對應的時間。
new Date('January 6, 2013');
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
//省略了小時、分鐘或秒數會被設為0。
- 月份從0開始計算,但是,天數從1開始計算。另外,除了日期默認為1,小時、分鐘、秒鐘和毫秒默認都是0。
- 最少需要提供兩個參數(年和月),其他參數都是可選的,默認等于0。
new Date(2013)
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
//只有一個參數,2013被解釋為毫秒數,而不是年份。
new Date(2013, 15)
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
//這些參數如果超出了正常范圍,會被自動折算。
new Date(2013, 0, -1)
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
//參數還可以使用負數,表示扣去的時間。
new Date(1, 0)
// Tue Jan 01 1901 00:00:00 GMT+0800 (CST)
new Date(-1, 0)
// Fri Jan 01 -1 00:00:00 GMT+0800 (CST)
//年份如果是0到99,會自動加上1900。
//如果為負數,則表示公元前。
- 類型轉換時,Date對象的實例如果轉為數值,則等于對應的毫秒數;如果轉為字符串,則等于對應的日期字符串。
d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
d2 - d1
// 2678400000
//減法運算,返回的就是它們間隔的毫秒數
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT
//+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"
//加法運算,返回的就是連接后的兩個字符串
- Date.now返回當前距離1970年1月1日 00:00:00 UTC的毫秒數(Unix時間戳乘以1000)。
Date.now() // 1364026285194
- Date.parse方法用來解析日期字符串,返回距離1970年1月1日 00:00:00的毫秒數標準YYYY-MM-DDTHH:mm:ss.sssZ,其他格式也可以被解析。
- Date對象返回當前時區的時間。Date.UTC可以返回UTC時間(世界標準時間)。
// 格式
Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]])
// 用法
Date.UTC(2011, 0, 1, 2, 3, 4, 567)
// 1293847384567
- Date實例對象的方法
- to類:從Date對象返回一個字符串,表示指定的時間。
- Date.prototype.toString()返回一個完整的日期字符串
- Date.prototype.toUTCString()返回對應的UTC時間,比北京時間晚8個小時。
- Date.prototype.toISOString()返回對應時間的ISO8601寫法。(UTC時區)
- Date.prototype.toJSON()返回一個符合JSON格式的ISO格式的日期字符串,與toISOString相同。
- Date.prototype.toDateString()返回日期字符串。
- Date.prototype.toTimeString()返回時間字符串。
- Date.prototype.toLocaleDateString()返回一個字符串,代表日期的當地寫法。
- Date.prototype.toLocaleTimeString()返回一個字符串,代表時間的當地寫法。
- get類:獲取Date對象的日期和時間。
- getTime():返回距離1970年1月1日00:00:00的毫秒數,等同于valueOf方法。
- getDate():返回實例對象對應每個月的幾號(從1開始)。
- getDay():返回星期幾,星期日為0,星期一為1,以此類推。
- getYear():返回距離1900的年數。
- getFullYear():返回四位的年份。
- getMonth():返回月份(0表示1月,11表示12月)。
- getHours():返回小時(0-23)。
- getMilliseconds():返回毫秒(0-999)。
- getMinutes():返回分鐘(0-59)。
- getSeconds():返回秒(0-59)。
- getTimezoneOffset():返回當前時間與UTC的時區差異,以分鐘表示,返回結果考慮到了夏令時因素。
這些get*方法返回的都是當前時區的時間
- Date對象還提供了這些方法對應的UTC版本,用來返回UTC時間。
- getUTCDate()
- getUTCFullYear()
- getUTCMonth()
- getUTCDay()
- getUTCHours()
- getUTCMinutes()
- getUTCSeconds()
- getUTCMilliseconds()
- set類:設置Date對象的日期和時間。
- setDate(date):設置實例對象對應的每個月的幾號(1-31),返回改變后毫秒時間戳。
- setYear(year): 設置距離1900年的年數。
- setFullYear(year [, month, date]):設置四位年份。
- setHours(hour [, min, sec, ms]):設置小時(0-23)。
- setMilliseconds():設置毫秒(0-999)。
- setMinutes(min [, sec, ms]):設置分鐘(0-59)。
- setMonth(month [, date]):設置月份(0-11)。
- setSeconds(sec [, ms]):設置秒(0-59)。
- setTime(milliseconds):設置毫秒時間戳。
這些跟get*方法一一對應的,但是沒有setDay方法,因為星期幾是計算出來的,而不是設置的。
var d2 = new Date ('January 6, 2013');
d2.setDate(-1) // 1356796800000
d2 // Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
//set*方法的參數都會自動折算
//參數超過當月的最大天數,向下一個月順延
//參數是負數,從上個月的最后一天開始減去的天數。
- set*系列方法除了setTime()和setYear(),都有對應的UTC版本,即設置UTC時區的時間。
- setUTCDate()
- setUTCFullYear()
- setUTCHours()
- setUTCMilliseconds()
- setUTCMinutes()
- setUTCMonth()
- setUTCSeconds()
- Date.prototype.valueOf()返回實例對象距離1970年1月1日00:00:00 UTC對應的毫秒數,該方法等同于getTime方法??梢杂糜谟嬎憔_時間。
var d = new Date();
d.valueOf() // 1362790014817
d.getTime() // 1362790014817
八、RegExp對象
- 正則表達式(regular expression)是一種表達文本模式(即字符串結構)的方法。
var regex = /xyz/;
//使用字面量,以斜杠表示開始和結束。編譯時新建正則表達式
var regex = new RegExp('xyz');
//使用 RegExp 構造函數。運行時新建正則表達式。
- 可以接受第二個參數,表示修飾符
var regex = new RegExp('xyz', "i");
// 等價于
var regex = /xyz/i;
- 1.屬性
- 修飾符相關,返回布爾值,表示是否設置。
- ignoreCase:i
- global:g
- multiline:m
返回布爾值,表示是否設置了i,g,m修飾符,該屬性只讀。
- 與修飾符無關的屬性。
- lastIndex:返回下一次開始搜索的位置。可讀寫,只在設置了g修飾符時有意義。
- source:返回正則表達式的字符串形式(不包括反斜杠),只讀。
- test()返回一個布爾值,表示當前模式是否能匹配參數字符串。
/cat/.test('cats and dogs') // true
- exec()返回匹配結果。若匹配,返回一個數組(每一個匹配成功的子字符串),否則返回null。
exec方法的返回數組包含屬性:- input:整個原字符串。
- index:整個模式匹配成功的開始位置(從0開始計數)。
- 字符串對象的方法
- match():返回一個數組(所有匹配的子字符串。)
- search():搜索,返回一個整數,表示匹配開始的位置。
- replace():替換,返回替換后的字符串。
- split():分割,返回一個數組(分割后的各個成員。)
- 如果正則表達式帶有g修飾符,則該方法與正則對象的exec方法行為不同,會一次性返回所有匹配成功的結果。
- String.prototype.search(搜索模式,替換的內容),返回第一個滿足條件的匹配結果在整個字符串中的位置,可替換。如果沒有任何匹配返回-1。
'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/a/, 'b') // "baa"
//不加g修飾符,就替換第一個匹配成功的值
'aaa'.replace(/a/g, 'b') // "bbb"
//否則替換所有匹配成功的值。
- replace方法的第二個參數可以使用美元符號$,用來指代所替換的內容。
- $& 指代匹配的子字符串。
- $` 指代匹配結果前面的文本。
- $' 指代匹配結果后面的文本。
- $n 指代匹配成功的第n(從1開始)組內容。
- $$ 指代美元符號$。
- String.prototype.split()按照正則規則分割字符串,返回一個由分割后的各個部分組成的數組。
- str.split(separator, [limit])(分隔規則,返回數組的最大成員數)
// 非正則分隔
'a, b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ]
// 正則分隔,去除多余的空格
'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]
// 指定返回數組的最大成員
'a, b,c, d'.split(/, */, 2)
[ 'a', 'b' ]
匹配規則
- 1.字面量字符(只表示它字面的含義)和元字符(有特殊含義,不代表字面的意思)
- 元字符
- 點字符(.)匹配除回車(\r)、換行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
/c.t/
//c.t匹配c和t之間包含任意一個字符的情況
//只要這三個字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot
- 位置字符用來提示字符所處的位置,主要有兩個字符。
- ^ 表示字符串的開始位置
- $ 表示字符串的結束位置
- 選擇符(|)
豎線符號(|)在正則表達式中表示“或關系”(OR),即cat|dog表示匹配cat或dog。 - 轉義符
正則表達式中那些有特殊含義的字符,如果要匹配它們本身,就需要在它們前面要加上反斜杠。比如要匹配加號, \ +。
- 轉義符
/1+1/.test('1+1')
// false
/1\+1/.test('1+1')
// true
- 正則模式中,需要用斜杠轉義的,一共有12個字符:^、.、[、$、(、)、|、*、+、?、{ 和 \ \,需要特別注意的是,如果使用RegExp方法生成正則對象,轉義需要使用兩個斜杠,因為字符串內部會先轉義一次。
(new RegExp('1\+1')).test('1+1')
// false
(new RegExp('1\\+1')).test('1+1')
// true
- 特殊字符
\cX 表示Ctrl-[X],其中的X是A-Z之中任一個英文字母,用來匹配控制字符。
[\b] 退格鍵(U+0008),不要與\b混淆。
\n 換行鍵。
\r 回車鍵。
\t 制表符tab(U+0009)。
\v 垂直制表符(U+000B)。
\f 換頁符(U+000C)。
\0 null字符(U+0000)。
\xhh 匹配一個以兩位十六進制數(\x00-\xFF)表示的字符。
\uhhhh 匹配一個以四位十六進制數(\u0000-\uFFFF)表示的unicode字符。
- 特殊字符
- 4.字符類(class)
- 表示有一系列字符可供選擇,只要匹配其中一個就可以了。所有可供選擇的字符都放在方括號內,如[xyz] 表示x、y、z之中任選一個匹配。
- 脫字符(^)
如果方括號內的第一個字符是[ ^ ],則表示除了字符類之中的字符,其他字符都可以匹配。比如,[^xyz]表示除了x、y、z之外都可以匹配。- 脫字符只有在字符類的第一個位置才有特殊含義,否則就是字面含義
- 連字符(-)
表示字符的連續范圍。[abc]可以寫成[a-c] -
- 預定義模式
- \d [0-9]。
- \D 0-9以外,[^0-9]。
- \w 任意的字母、數字和下劃線,[A-Za-z0-9_]。
- \W [^A-Za-z0-9_]。
- \s 匹配空格(包括制表符、空格符、斷行符等),相等于[\t\r\n\v\f]。
- \S [^\t\r\n\v\f]。
- \b 匹配詞的邊界。
- \B 匹配非詞邊界,即在詞的內部。
正則表達式遇到換行符(\n)就會停止匹配。
- 6.重復類
模式的精確匹配次數,使用大括號({ })表示。{n}恰好重復n次,{n,}至少重復n次,{n,m}不少于n次,不多于m次。 -
- 量詞符用來設定某個模式出現的次數。
- ? 問號表示某個模式出現0次或1次,等同于{0, 1}。
- *星號表示某個模式出現0次或多次,等同于{0,}。
- +加號表示某個模式出現1次或多次,等同于{1,}。
- 8 .貪婪模式
? * + 默認情況下都是最大可能匹配,即匹配直到下一個字符不滿足匹配規則為止。
var s = 'aaa';
s.match(/a+/) // ["aaa"]
//因為默認是貪婪模式,會一直匹配到字符a不出現為止,所以匹配結果是3個a
- 9.修飾符(modifier)
模式的附加規則,放在正則模式的最尾部。 可單個使用或多個一起使用。- g修飾符
默認情況下,第一次匹配成功后,正則對象就停止向下匹配了。g修飾符表示全局匹配(global),加上它以后,正則對象將匹配全部符合條件的結果,主要用于搜索和替換。 - i修飾符
默認情況下,正則對象區分字母的大小寫,加上i修飾符以后表示忽略大小寫(ignorecase)。 - m修飾符
表示多行模式(multiline),會修改 ^ 和$的行為。默認情況下(即不加m修飾符時),^ 和$匹配字符串的開始處和結尾處,加上m修飾符以后,^ 和$還會匹配行首和行尾,即識別換行符(\n)。
- g修飾符
- 組匹配
- 正則表達式的括號表示分組匹配,括號中的模式可以用來匹配分組的內容。
/fred+/.test('fredd') // true
//沒有括號,結果+只表示重復字母d
/(fred)+/.test('fredfred') // true
//有括號,結果+就表示匹配“fred”這個詞。
- 使用組匹配時,不宜同時使用g修飾符,否則match方法不會捕獲分組的內容。
- 非捕獲組
(?:x)稱為非捕獲組(Non-capturing group),表示不返回該組匹配的內容,即匹配的結果中不計入這個括號。
var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]
//第一個括號是非捕獲組,所以最后返回的結果中沒有第一個括號,只有第二個括號匹配的內容。
- 先行斷言
x(?=y)稱為先行斷言(Positive look-ahead),x只有在y前面才匹配,y不會被計入返回結果。
var m = 'abc'.match(/b(?=c)/);
m // ["b"]
//括號里的部分是不會返回的。
- 先行否定斷言
x(?!y)稱為先行否定斷言(Negative look-ahead),x只有不在y前面才匹配,y不會被計入返回結果。
九、 JSON 格式
- 一種用于數據交換的文本格式目的是取代繁瑣笨重的 XML 格式。
- 每個 JSON 對象是簡單類型的值或復合類型的值,只能是一個值,每個 JSON 文檔只能包含一個值。
- JSON 對值的類型和格式的嚴格規定。
- 復合類型的值只能是數組或對象,不能是函數、正則表達式對象、日期對象。
- 簡單類型的值只有四種:字符串、數值(十進制)、布爾值和null(不能用NaN, Infinity, -Infinity和undefined)。
- 字符串必須使用雙引號表示,不能使用單引號。
- 對象的鍵名必須放在雙引號里面。
- 數組或對象最后一個成員的后面,不能加逗號。
- JSON.stringify()用于將一個值轉為字符串。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原。
- 如果原始對象中,有一個成員的值是undefined、函數或 XML 對象,這個成員會被過濾。
- 正則對象會被轉成空對象。
JSON.stringify(/foo/) // "{}"
- JSON.stringify會忽略對象的不可遍歷屬性。
- JSON.stringify可接受一個數組作為第二個參數,指定需要轉成字符串的屬性。第二個參數還可以是一個函數,用來更改JSON.stringify的默認行為。
- 遞歸處理中,每一次處理的對象都是前一次返回的值。
- JSON.stringify還可接受第三個參數,用于增加返回的JSON字符串的可讀性。如果是數字,表示每個屬性前面添加的空格(最多不超過10個);如果是字符串(不超過10個字符),則該字符串會添加在每行前面。
- 如果對象有自定義的toJSON方法,那么JSON.stringify會使用這個方法的返回值作為參數,而忽略原對象的其他屬性。
- toJSON將正則對象自動轉為字符串。JSON.stringify默認不能轉換正則對象,設置了toJSON方法以后,就可以轉換正則對象了。
- JSON.parse()方法用于將JSON字符串轉化成對象。
- 要求有效格式
- 為了處理解析錯誤,可以放在try...catch代碼塊中。
- JSON.parse方法可以接受一個處理函數,與JSON.stringify方法類似。
十、console
Console面板(又稱為控制臺)
- 用途:
- 調試程序,顯示網頁代碼運行時的錯誤信息。
- 提供了一個命令行接口,用來與網頁代碼互動
- 瀏覽器實現
- Elements:查看網頁的HTML源碼和CSS代碼。
- Resources:查看網頁加載的各種資源文件(比如代碼文件、字體文件、css文件等),以及在硬盤上創建的各種內容(比如本地緩存、Cookie、Local Storage等)。
- Network:查看網頁的 HTTP 通信情況。
- Sources:查看網頁加載的所有源碼。
- Timeline:查看各種網頁行為隨時間變化的情況。
- Performance:查看網頁的性能情況,比如 CPU 和內存消耗。
- Console:用來運行 JavaScript 命令。
- console 對象的方法
- 1.console.log()
- 在控制臺輸出信息。可接受多個參數,將結果連接起來輸出。
- 自動在每次輸出的結尾,添加換行符。
- 如果第一個參數是格式字符串(使用了格式占位符),將依次用后面的參數替換占位符再輸出。
- console.log方法支持以下占位符,不同格式的數據必須使用對應格式的占位符。
- %s 字符串
- %d 整數
- %i 整數
- %f 浮點數
- %o 對象的鏈接
- %c CSS格式字符串
- console.info()
- console.debug()
- 都是console.log方法的別名,用法完全一樣。console.info方法會在輸出信息的前面有藍色圖標。
- console.warn()黃色三角,console.error()紅色的叉
- 在控制臺輸出信息,表示出錯,會顯示錯誤發生的堆棧。其他與log都一樣。
- log方法是寫入標準輸出(stdout),warn方法和error方法是寫入標準錯誤(stderr)。
- console.table方法可以將某些復合類型的數據,轉為表格顯示。
- 復合型數據轉為表格顯示的條件是,必須擁有主鍵。數組->數字鍵、對象->最外層鍵。
- console.count()用于計數,輸出它被調用了多少次。
- console.dir()用來對一個對象進行檢查(inspect),并以易于閱讀和打印的格式顯示。
console.log({f1: 'foo', f2: 'bar'})
// Object {f1: "foo", f2: "bar"}
console.dir({f1: 'foo', f2: 'bar'})
// Object
// f1: "foo"
// f2: "bar"
// __proto__: Object
//顯示dir方法的輸出結果,比log方法更易讀,信息也更豐富。
//該方法對于輸出 DOM 對象非常有用,因為會顯示 DOM 對象的所有屬性。
- console.dirxml()主要用于以目錄樹的形式,顯示 DOM 節點。
console.dirxml([1, 2, 3])
// 等同于
console.dir([1, 2, 3])
//-如果參數不是 DOM 節點,而是普通的 JavaScript 對象,console.dirxml等同于console.dir。
- console.assert(表達式,字符串)
- 在程序運行過程中進行條件判斷,若不滿足條件,顯示一個錯誤,但不會中斷程序執行。相當于提示用戶,內部狀態不正確。
- 只有當第一個參數為false,才會提示有錯誤,在控制臺輸出第二個參數,否則不會有任何結果。
console.assert(false, '判斷條件不成立')
// Assertion failed: 判斷條件不成立
// 相當于
try {
if (false) {
throw new Error('判斷條件不成立');
}
} catch(e) {
console.error(e);
}
- console.time(),console.timeEnd()
這兩個方法用于計時,可以算出一個操作所花費的準確時間。- time方法表示計時開始,timeEnd方法表示計時結束。它們的參數是計時器的名稱。調用timeEnd方法之后,console窗口會顯示“計時器名稱: 所耗費的時間”。
- console.profile(),console.profileEnd()
- console.profile方法用來新建一個性能測試器(profile),它的參數是性能測試器的名字。
- console.profileEnd方法用來結束正在運行的性能測試器。
- console.group(),console.groupend(),console.groupCollapsed()
- console.group和console.groupend這兩個方法用于將顯示的信息分組。它只在輸出大量信息時有用,分在一組的信息,可以用鼠標折疊/展開。
- console.groupCollapsed方法與console.group方法相似,區別是該組的內容在第一次顯示時是收起的(collapsed)。
- console.trace(),console.clear()
- console.trace方法顯示當前執行的代碼在堆棧中的調用路徑。
- console.clear方法用于清除當前控制臺的所有輸出,將光標回置到第一行。如果用戶選中了控制臺的“Preserve log”選項,網頁腳本調用console.log將不起作用,但手動在控制臺執行該方法依然有效。
- 命令行 API
- $_屬性返回上一個表達式的值。
- $0 - $4,控制臺保存了最近5個在Elements面板選中的DOM元素,$0代表倒數第一個,$1代表倒數第二個,直到$4。
- $(selector)返回第一個匹配的元素,等同于document.querySelector()。如果頁面腳本對$有定義,則會覆蓋原始的定義。
- $$(selector)返回一個選中的DOM對象,等同于document.querySelectorAll。
- $x(path)返回一個數組,包含匹配特定XPath表達式的所有DOM元素。
- inspect(object)打開相關面板,并選中相應的元素:DOM元素在Elements面板中顯示,JavaScript對象在Profiles面板中顯示。
- getEventListeners(object)返回一個對象,該對象的成員為登記了回調函數的各種事件,每個事件對應一個數組,數組的成員為該事件的回調函數。
- keys(object),values(object)
keys(object)方法返回一個數組,包含特定對象的所有鍵名。
values(object)方法返回一個數組,包含特定對象的所有鍵值。 - monitorEvents(object[, events]) 監聽特定對象上發生的特定事件。當這種情況發生時,會返回一個Event對象,包含該事件的相關信息。
- unmonitorEvents(object[, events])用于停止監聽。
允許監聽同一大類的事件。所有事件可以分成四個大類:- mouse:”mousedown”, “mouseup”, “click”, “dblclick”, “mousemove”, “mouseover”, “mouseout”, “mousewheel”
- key:”keydown”, “keyup”, “keypress”, “textInput”
- touch:”touchstart”, “touchmove”, “touchend”, “touchcancel”
- control:”resize”, “scroll”, “zoom”, “focus”, “blur”, “select”, “change”, “submit”, “reset”
- profile([name]),profileEnd()
profile方法用于啟動一個特定名稱的CPU性能測試,profileEnd方法用于結束該性能測試。 - clear():清除控制臺的歷史。
copy(object):復制特定DOM元素到剪貼板。
dir(object):顯示特定對象的所有屬性,是console.dir方法的別名。
dirxml(object):顯示特定對象的XML形式,是console.dirxml方法的別名。 - debugger用于除錯,設置斷點。如果有正在運行的除錯工具,程序運行到debugger語句時會自動停下。沒有除錯工具,debugger語句不會產生任何結果,自動跳過這一句。
十一、屬性描述對象
- 一個內部數據結構,用來描述一個對象的屬性的行為,控制它的行為。每個屬性都有自己對應的屬性描述對象,保存該屬性的一些元信息。
- 6個元屬性。
- value該屬性的屬性值,默認為undefined。
- writable存放一個布爾值,表示屬性值(value)是否可改變,默認為true。
- enumerable(可枚舉性)存放一個布爾值,默認為true。如果設為false,會使得某些操作(比如for...in循環、Object.keys())跳過該屬性。
- configurable(可配置性)存放一個布爾值,默認為true。false時將阻止某些操作改寫該屬性。
- get(getter),默認undefined。
- set(setter),默認undefined。
- Object.getOwnPropertyDescriptor方法可以讀出對象自身屬性的屬性描述對象。
var o = { p: 'a' };
Object.getOwnPropertyDescriptor(o, 'p')
// Object { value: "a",
// writable: true,
// enumerable: true,
// configurable: true
// }
- Object.defineProperty(),Object.defineProperties()
允許通過定義屬性描述對象,來定義或修改一個屬性,然后返回修改后的對象。格式:Object.defineProperty(object, propertyName, attributesObject),它的writable、configurable、enumerable這三個屬性的默認值都為false。 - 可枚舉性(enumerable)
用來控制所描述的屬性,是否將被包括在for...in循環之中。如果為false- for..in(包括繼承自原型對象的屬性)
- Object.keys(只返回對象本身的屬性)
- JSON.stringify方法不會取到該屬性。
只有可枚舉的屬性,才會被for...in循環遍歷,同時還規定原生繼承的屬性都是不可枚舉的。 - 如果需要獲取對象自身的所有屬性,不管是否可枚舉,可以使用Object.getOwnPropertyNames方法
- 可配置性(configurable)
決定了是否可以修改屬性描述對象。也就是說,當configurable為false的時候,value、writable、enumerable和configurable都不能被修改了。- writable只有在從false改為true會報錯,從true改為false則是允許的。
- value,只要writable和configurable有一個為true,就允許改動。
- configurable為false時,若直接對該屬性賦值,不報錯但不會成功。
- 可配置性決定了一個變量是否可以被刪除(delete)。
- var聲明變量時其configurable為false。否則(或者使用屬性賦值的方式聲明變量),變量的可配置性為true。
- 如果一個變量是使用var命令生成的,就無法用delete命令刪除。也就是說,delete只能刪除對象的屬性。
- 可寫性(writable)
決定了屬性的值(value)是否可以被改變 - Object.getOwnPropertyNames
返回直接定義在某個對象上面的全部屬性的名稱,而不管該屬性是否可枚舉。- 一般系統原生的屬性(非用戶自定義的屬性)都是不可枚舉的。
- Object.prototype.propertyIsEnumerable()用來判斷一個屬性是否可枚舉。
var o = {};
o.p = 123;
o.propertyIsEnumerable('p') // true
o.propertyIsEnumerable('toString') // false
//用戶自定義的p屬性是可枚舉的,而繼承自原型對象的toString屬性是不可枚舉的。
- 存取器(accessor)
- 除了直接定義,屬性還可以用存取器定義。get 和set。
- 存取器提供的是虛擬屬性(實際不存在),是每次讀取時計算生成的??蓪崿F每個屬性禁止賦值等。
- 存取器也可通過Object.defineProperty、Object.create定義。
- 可以實現數據對象與DOM對象的雙向綁定。
- 對象的拷貝,可以通過Object.defineProperty方法來拷貝屬性。
- 控制對象狀態
JavaScript提供了三種方法,精確控制一個對象的讀寫狀態,防止對象被改變。最弱一層的保護是Object.preventExtensions,其次是Object.seal,最強的Object.freeze。- Object.preventExtensions方法可以使得一個對象無法再添加新的屬性。(可以用delete命令刪除它的現有屬性。)
- Object.isExtensible方法用于檢查一個對象是否使用了Object.preventExtensions方法。也就是說,檢查是否可以為一個對象添加屬性。
- Object.seal方法使得一個對象既無法添加新屬性,也無法刪除舊屬性。
- Object.isSealed方法用于檢查一個對象是否使用了Object.seal方法。
- Object.freeze()可以使得一個對象無法添加新屬性、無法刪除舊屬性、也無法改變屬性的值,使得這個對象實際上變成了常量。
- Object.isFrozen方法用于檢查一個對象是否使用了Object.freeze()方法。
- 局限性
上面的方法鎖定對象的可寫性有一個漏洞,依然可以通過改變原型對象,來為對象增加屬性??砂言鸵矁鼋Y住解決。
另外一個局限是,如果屬性值是對象,上面這些方法只能凍結屬性指向的對象,而不能凍結對象本身的內容。