參考基礎(chǔ)教程的整理,方便記憶
一酝掩、Object對象 (O大寫)
- 所有其他對象都繼承自這個對象屿笼。Object本身也是一個構(gòu)造函數(shù),可以直接通過它來生成新對象骚灸。
- 作為構(gòu)造函數(shù)使用時糟趾,可以接受一個參數(shù)。參數(shù)若為對象甚牲,則直接返回原對象义郑;若是一個原始類型的值,則返回該值對應(yīng)的包裝對象丈钙。
- Object.keys(只返回可枚舉的屬性)和Object.getOwnPropertyNames(返回不可枚舉的屬性名非驮。),一般用來遍歷對象的屬性雏赦。
- 參數(shù)都是一個對象劫笙,都返回一個數(shù)組,該數(shù)組的成員都是對象自身的(而不是繼承的)所有屬性名星岗。
- 一般都使用Object.keys方法填大,遍歷數(shù)組的屬性。
var a = ["Hello", "World"];
Object.keys(a)
// ["0", "1"]
Object.getOwnPropertyNames(a)
// ["0", "1", "length"]
-
對象屬性模型的相關(guān)方法
- Object.getOwnPropertyDescriptor():獲取某個屬性的attributes對象俏橘。
- Object.defineProperty():通過attributes對象允华,定義某個屬性。
- Object.defineProperties():多個屬性。
- Object.getOwnPropertyNames():返回直接定義在某個對象上面的全部屬性的名稱靴寂。
-
控制對象狀態(tài)的方法
- Object.preventExtensions():防止對象擴(kuò)展磷蜀。
- Object.isExtensible():判斷對象是否可擴(kuò)展。
- Object.seal():禁止對象配置榨汤。
- Object.isSealed():判斷一個對象是否可配置蠕搜。
- Object.freeze():凍結(jié)一個對象。
- Object.isFrozen():判斷一個對象是否被凍結(jié)收壕。
-
原型鏈相關(guān)方法
- Object.create():指定原型對象和屬性妓灌,返回一個新的對象。
- Object.getPrototypeOf():獲取對象的Prototype對象蜜宪。
-
Object實(shí)例對象的方法虫埂,主要有以下六個。
- valueOf():返回當(dāng)前對象對應(yīng)的值圃验。
- toString():返回當(dāng)前對象對應(yīng)的字符串形式掉伏。
- toLocaleString():本地字符串形式。
hasOwnProperty():判斷某個屬性是否為當(dāng)前對象自身的屬性澳窑,還是繼承自原型對象的屬性斧散。 - isPrototypeOf():判斷當(dāng)前對象是否為另一個對象的原型。
- propertyIsEnumerable():判斷某個屬性是否可枚舉摊聋。
Object.prototype.valueOf()作用是返回一個對象的“值”鸡捐,默認(rèn)情況下返回對象本身。
var o = new Object();
o.valueOf() === o // true
- Object.prototype.toString()作用是返回一個對象的字符串形式麻裁,默認(rèn)情況下返回類型字符串箍镜。也可判斷數(shù)據(jù)類型。
二煎源、Array 對象
- Array是JavaScript的內(nèi)置對象色迂,同時也是一個構(gòu)造函數(shù),可以用它生成新的數(shù)組手销。(不同的參數(shù)歇僧,會導(dǎo)致它的行為不一致。)
- Array.isArray()用來判斷一個值是否為數(shù)組锋拖。
var a = [1, 2, 3];
typeof a // "object"
Array.isArray(a) // true
//typeof運(yùn)算符只能顯示數(shù)組-的類型是Object馏慨,而Array.isArray方法可以對數(shù)組返回true。
- valueOf返回數(shù)組本身姑隅。toString返回數(shù)組的字符串形式写隶。
- push方法用于在數(shù)組的末端添加一個或多個元素,并返回添加新元素后的數(shù)組長度讲仰。會改變原數(shù)組慕趴。
var a = [];
a.push(1)
//合并兩個數(shù)組
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]
- 可向?qū)ο筇砑釉兀砑雍蟮膶ο笞兂深愃茢?shù)組的對象,即新加入元素的鍵對應(yīng)數(shù)組的索引冕房,并且對象有一個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方法用于刪除數(shù)組的最后一個元素,并返回該元素耙册。注意给僵,該方法會改變原數(shù)組。
- 對空數(shù)組使用pop方法详拙,不會報錯帝际,而是返回undefined。
- push和pop結(jié)合使用饶辙,就構(gòu)成了“后進(jìn)先出”的棧結(jié)構(gòu)(stack)蹲诀。
- join方法以參數(shù)作為分隔符,將所有數(shù)組成員組成一個字符串返回弃揽。如果不提供參數(shù)脯爪,默認(rèn)用逗號分隔
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方法用于多個數(shù)組的合并。它將新數(shù)組的成員矿微,添加到原數(shù)組的尾部痕慢,然后返回一個新數(shù)組,原數(shù)組不變涌矢。
-
shift用于刪除數(shù)組的第一個元素守屉,并返回該元素。注意蒿辙,該方法會改變原數(shù)組。
- shift可以遍歷并清空一個數(shù)組滨巴。
- push和shift結(jié)合使用思灌,就構(gòu)成了“先進(jìn)先出”的隊(duì)列結(jié)構(gòu)(queue)。
unshift方法用于在數(shù)組的第一個位置添加元素(可多個)恭取,并返回添加新元素后的數(shù)組長度泰偿。會改變原數(shù)組。
reverse用于顛倒數(shù)組中元素的順序蜈垮,返回改變后的數(shù)組耗跛。改變原數(shù)組。
-
slice(起始攒发,終止(不包含在內(nèi)))用于提取原數(shù)組的一部分调塌,返回一個新數(shù)組,原數(shù)組不變惠猿。
- 若參數(shù)是負(fù)數(shù)羔砾,則表示倒數(shù)計(jì)算的位置。
- 如果參數(shù)值大于數(shù)組成員的個數(shù),或者第二個參數(shù)小于第一個參數(shù)姜凄,則返回空數(shù)組政溃。
splice(起始,個數(shù)态秧,被插入數(shù)組的新元素(可有可無))刪除原數(shù)組的一部分成員董虱,并可以在被刪除的位置添加入新的數(shù)組成員,返回值是被刪除的元素申鱼。會改變原數(shù)組愤诱。
sort方法對數(shù)組成員進(jìn)行排序,默認(rèn)是按照字典順序排序润讥。排序后转锈,原數(shù)組將被改變。數(shù)值會被先轉(zhuǎn)成字符串楚殿。
-
map方法對數(shù)組的所有成員依次調(diào)用一個函數(shù)撮慨,根據(jù)函數(shù)結(jié)果返回一個新數(shù)組。原數(shù)組沒有變化脆粥。
- 遍歷字符串的每個字符要通過函數(shù)的call方法間接使用砌溺,或者先將字符串轉(zhuǎn)為數(shù)組。
- 接受一個函數(shù)作為參數(shù)变隔。該函數(shù)調(diào)用時规伐,map方法會將其傳入三個參數(shù),分別是當(dāng)前成員匣缘、當(dāng)前位置和數(shù)組本身猖闪。
- map方法不會跳過undefined和null,但是會跳過空位.
-
forEach與map很相似肌厨,但無返回值培慌。(可接受第二個參數(shù),用來綁定回調(diào)函數(shù)的this關(guān)鍵字柑爸。)
- forEach無法中斷執(zhí)行吵护,會將所有成員遍歷完。若需符合某種條件時表鳍,中斷遍歷馅而,用for循環(huán)。
filter的參數(shù)是一個函數(shù)譬圣,所有數(shù)組成員依次執(zhí)行該函數(shù)瓮恭,返回結(jié)果為true的成員組成一個新數(shù)組返回秀菱。該方法不會改變原數(shù)組讶请。
-
some(),every()用來判斷數(shù)組成員是否符合某種條件
- every則是所有數(shù)組成員的返回值都是true雕沉,才返回true。
- some是只要有一個數(shù)組成員的返回值是true則為ture颇玷。
-
reduce方法和reduceRight方法依次處理數(shù)組的每個成員笨农,最終累計(jì)為一個值。它們的差別是帖渠,reduce是從左到右處理谒亦,reduceRight相反
第一個參數(shù)都是一個函數(shù)。該函數(shù)接受以下四個參數(shù)空郊。- 累積變量份招,默認(rèn)為數(shù)組的第一個成員(必須)
- 當(dāng)前變量,默認(rèn)為數(shù)組的第二個成員(必須)
- 當(dāng)前位置(從0開始)(可選)
- 原數(shù)組(可選)
indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置狞甚,如果沒有出現(xiàn)則返回-1锁摔。indexOf方法還可以接受第二個參數(shù),表示搜索的開始位置哼审。
lastIndexOf方法返回給定元素在數(shù)組中最后一次出現(xiàn)的位置谐腰,如果沒有出現(xiàn)則返回-1。如果數(shù)組中包含NaN涩盾,這兩個方法不適用十气,即無法確定數(shù)組成員是否包含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方法返回包裝對象實(shí)例對應(yīng)的原始類型的值址儒。
new Number(123).valueOf() // 123
new String("abc").valueOf() // "abc"
new Boolean("true").valueOf() // tru
- toString方法返回實(shí)例對應(yīng)的字符串形式
- 原始類型的自動轉(zhuǎn)換
'abc'.length // 3
//abc是一個字符串芹枷,本身不是對象,不能調(diào)用length屬性莲趣。
//自動將其轉(zhuǎn)為包裝對象鸳慈,調(diào)用length屬性。
//調(diào)用結(jié)束后妖爷,這個臨時對象就會被銷毀。
//只讀的理朋,無法修改絮识。字符串無法添加新屬性。
'abc'.charAt === String.prototype.charAt
// true
- 如果包裝對象與原始類型值進(jìn)行混合運(yùn)算嗽上,包裝對象會轉(zhuǎn)化為原始類型(實(shí)際是調(diào)用自身的valueOf方法)次舌。
new Number(123) + 123 // 246
new String('abc') + 'abc' // "abcabc"
- Boolean 對象
if (new Boolean(false)) {
console.log('true');
} // true
// false對應(yīng)的包裝對象實(shí)例是一個對象,進(jìn)行邏輯運(yùn)算時兽愤,
//被自動轉(zhuǎn)化成布爾值true(所有對象對應(yīng)的布爾值都是true)
if (new Boolean(false).valueOf()) {
console.log('true');
} // 無輸出
//實(shí)例的valueOf方法彼念,則返回實(shí)例對應(yīng)的原始值挪圾,本例為false。
if (Boolean(null)) {
console.log('true');
} // 無輸出
if (new Boolean(null)) {
console.log('true');
} // true
//對于一些特殊值逐沙,Boolean對象前面加不加new
//會得到完全相反的結(jié)果
四哲思、 Number對象
- 數(shù)值對應(yīng)的包裝對象,可以作為構(gòu)造函數(shù)使用(用于生成值為數(shù)值的對象吩案。)棚赔,也可以作為工具函數(shù)使用。
var n = new Number(1);
typeof n // "object"
- Number對象的屬性
- Number.POSITIVE_INFINITY:正的無限徘郭,指向Infinity靠益。
- Number.NEGATIVE_INFINITY:負(fù)的無限,指向-Infinity残揉。
- Number.NaN:表示非數(shù)值胧后,指向NaN。
- Number.MAX_VALUE:最大的正數(shù)抱环,最小的負(fù)數(shù)為-Number.MAX_VALUE壳快。
- Number.MIN_VALUE:表示最小的正數(shù)(即最接近0的正數(shù),在64位浮點(diǎn)數(shù)體系中為5e-324)江醇,最接近0的負(fù)數(shù)為-Number.MIN_VALUE濒憋。
- Number.MAX_SAFE_INTEGER:表示能夠精確表示的最大整數(shù),即9007199254740991陶夜。
- Number.MIN_SAFE_INTEGER:最小整數(shù)凛驮,-9007199254740991。
- Number.prototype.toString()
接受一個參數(shù)条辟,表示輸出的進(jìn)制黔夭。如果省略這個參數(shù),默認(rèn)將數(shù)值先轉(zhuǎn)為十進(jìn)制羽嫡,再輸出字符串
(10).toString(2) // "1010"
(10).toString(8) // "12"
//前面的數(shù)值要加括號或加兩個點(diǎn)(即理解為10.0.)
10..toString(2)
10 .toString(2) // "1010"
10.0.toString(2) // "1010"
- Number.prototype.toFixed()
- 轉(zhuǎn)為指定位數(shù)的小數(shù)本姥,返回這個小數(shù)對應(yīng)的字符串。
參數(shù)為指定的小數(shù)位數(shù)杭棵,有效范圍為0到20婚惫,超出這個范圍將拋出RangeError錯誤。
- 轉(zhuǎn)為指定位數(shù)的小數(shù)本姥,返回這個小數(shù)對應(yīng)的字符串。
- Number.prototype.toExponential()
- 將一個數(shù)轉(zhuǎn)為科學(xué)計(jì)數(shù)法形式魂爪。
- 參數(shù)表示小數(shù)點(diǎn)后有效數(shù)字的位數(shù)先舷,范圍為0到20,超出這個范圍滓侍,會拋出一個RangeError蒋川。
- Number.prototype.toPrecision()
- 將一個數(shù)轉(zhuǎn)為指定位數(shù)的有效數(shù)字參數(shù)為有效數(shù)字的位數(shù),范圍是1到21撩笆,超出這個范圍會拋出RangeError錯誤(不太可靠捺球,跟浮點(diǎn)數(shù)不是精確儲存有關(guān)缸浦。)
- 自定義方法
五、String對象
- 生成字符串的包裝對象氮兵。
- 實(shí)際上裂逐,字符串的包裝對象是一個類似數(shù)組的對象(即很像數(shù)組,實(shí)質(zhì)上不是數(shù)組)胆剧。
new String("abc")
// String {0: "a", 1: "b", 2: "c", length: 3}
- String對象還可將任意類型的值轉(zhuǎn)為字符串絮姆。
- String.fromCharCode()
- String對象提供的靜態(tài)方法(即定義在對象本身,而非對象實(shí)例)秩霍,主要是fromCharCode()篙悯。參數(shù)是一系列Unicode碼點(diǎn)(傳入的參數(shù)不能大于0xFFFF),返回對應(yīng)的字符串铃绒。
- charAt()返回指定位置的字符鸽照,參數(shù)是從0開始編號的位置。
- charCodeAt方法返回給定位置字符的Unicode碼點(diǎn)(十進(jìn)制表示)颠悬,相當(dāng)于String.fromCharCode()的逆操作矮燎。
- charCodeAt方法返回的Unicode碼點(diǎn)不大于65536(0xFFFF)(兩個字節(jié)的字符的碼點(diǎn))。否則必需連續(xù)使用兩次charCodeAt赔癌,讀入charCodeAt(i)诞外,和charCodeAt(i+1),將兩個16字節(jié)放在一起灾票,才能得到準(zhǔn)確的字符峡谊。
- 如果參數(shù)為負(fù)數(shù),或大于等于字符串的長度刊苍,charCodeAt返回NaN既们。
- concat方法用于連接兩個字符串,返回一個新字符串正什,不改變原字符串啥纸。
'a'.concat('b', 'c') // "abc"
//可以接受多個參數(shù)
六、Math對象
該對象不是構(gòu)造函數(shù)婴氮,不能生成實(shí)例斯棒,所有的屬性和方法都必須在Math對象上調(diào)用。
-
屬性
- Math.E:常數(shù)e主经。
- Math.LN2:2的自然對數(shù)荣暮。
- Math.LN10:10的自然對數(shù)。
- Math.LOG2E:以2為底的e的對數(shù)旨怠。
- Math.LOG10E:以10為底的e的對數(shù)渠驼。
- Math.PI:常數(shù)Pi蜈块。
- Math.SQRT1_2:0.5的平方根鉴腻。
- Math.SQRT2:2的平方根迷扇。
-
方法
- Math.abs():絕對值
- Math.ceil():向上取整
- Math.floor():向下取整
- Math.max():最大值
- Math.min():最小值
- Math.pow():指數(shù)運(yùn)算
- Math.sqrt():平方根
- Math.log():自然對數(shù)
- Math.exp():e的指數(shù)
- Math.round():四舍五入
- Math.random():隨機(jī)數(shù)
-
三角函數(shù)方法
- Math.sin():返回參數(shù)的正弦
- Math.cos():返回參數(shù)的余弦
- Math.tan():返回參數(shù)的正切
- Math.asin():返回參數(shù)的反正弦(弧度值)
- Math.acos():返回參數(shù)的反余弦(弧度值)
- Math.atan():返回參數(shù)的反正切(弧度值)
七、Date對象
- 日期和時間的操作接口爽哎◎严可表示1970年1月1日00:00:00前后的各1億天(單位為毫秒)。
Date()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//可作為普通函數(shù)直接調(diào)用课锌,返回一個代表當(dāng)前時間的字符串厨内。
Date(2000, 1, 1)
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//即使帶有參數(shù),Date作為普通函數(shù)使用時渺贤,返回的還是當(dāng)前時間雏胃。
- 可當(dāng)構(gòu)造函數(shù)使用。使用new命令志鞍,會返回一個Date對象的實(shí)例瞭亮。不加參數(shù),生成代表當(dāng)前時間的對象固棚。
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實(shí)例對應(yīng)的字符串值统翩,就是當(dāng)前時間。
-
new Date(milliseconds)
- Date對象接受從1970年1月1日00:00:00 UTC開始計(jì)算的毫秒數(shù)作為參數(shù)此洲。Unix時間戳(單位為秒)作為參數(shù)厂汗,須將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構(gòu)造函數(shù)的參數(shù)可以是一個負(fù)數(shù)呜师,表示1970年1月1日之前的時間娶桦。
- new Date(datestring),(month day, year hours:minutes:seconds)接受一個日期字符串作為參數(shù),返回所對應(yīng)的時間匣掸。
new Date('January 6, 2013');
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
//省略了小時趟紊、分鐘或秒數(shù)會被設(shè)為0。
- 月份從0開始計(jì)算碰酝,但是霎匈,天數(shù)從1開始計(jì)算。另外送爸,除了日期默認(rèn)為1铛嘱,小時、分鐘袭厂、秒鐘和毫秒默認(rèn)都是0墨吓。
- 最少需要提供兩個參數(shù)(年和月),其他參數(shù)都是可選的纹磺,默認(rèn)等于0帖烘。
new Date(2013)
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
//只有一個參數(shù),2013被解釋為毫秒數(shù)橄杨,而不是年份秘症。
new Date(2013, 15)
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
//這些參數(shù)如果超出了正常范圍照卦,會被自動折算。
new Date(2013, 0, -1)
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
//參數(shù)還可以使用負(fù)數(shù)乡摹,表示扣去的時間役耕。
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聪廉。
//如果為負(fù)數(shù)瞬痘,則表示公元前。
- 類型轉(zhuǎn)換時板熊,Date對象的實(shí)例如果轉(zhuǎn)為數(shù)值框全,則等于對應(yīng)的毫秒數(shù);如果轉(zhuǎn)為字符串干签,則等于對應(yīng)的日期字符串竣况。
d1 = new Date(2000, 2, 1);
var d2 = new Date(2000, 3, 1);
d2 - d1
// 2678400000
//減法運(yùn)算,返回的就是它們間隔的毫秒數(shù)
d2 + d1
// "Sat Apr 01 2000 00:00:00 GMT
//+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"
//加法運(yùn)算筒严,返回的就是連接后的兩個字符串
- Date.now返回當(dāng)前距離1970年1月1日 00:00:00 UTC的毫秒數(shù)(Unix時間戳乘以1000)丹泉。
Date.now() // 1364026285194
- Date.parse方法用來解析日期字符串,返回距離1970年1月1日 00:00:00的毫秒數(shù)標(biāo)準(zhǔn)YYYY-MM-DDTHH:mm:ss.sssZ鸭蛙,其他格式也可以被解析摹恨。
- Date對象返回當(dāng)前時區(qū)的時間。Date.UTC可以返回UTC時間(世界標(biāo)準(zhǔn)時間)娶视。
// 格式
Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]])
// 用法
Date.UTC(2011, 0, 1, 2, 3, 4, 567)
// 1293847384567
- Date實(shí)例對象的方法
- to類:從Date對象返回一個字符串晒哄,表示指定的時間。
- Date.prototype.toString()返回一個完整的日期字符串
- Date.prototype.toUTCString()返回對應(yīng)的UTC時間肪获,比北京時間晚8個小時寝凌。
- Date.prototype.toISOString()返回對應(yīng)時間的ISO8601寫法。(UTC時區(qū))
- Date.prototype.toJSON()返回一個符合JSON格式的ISO格式的日期字符串孝赫,與toISOString相同较木。
- Date.prototype.toDateString()返回日期字符串。
- Date.prototype.toTimeString()返回時間字符串青柄。
- Date.prototype.toLocaleDateString()返回一個字符串伐债,代表日期的當(dāng)?shù)貙懛ā?/li>
- Date.prototype.toLocaleTimeString()返回一個字符串,代表時間的當(dāng)?shù)貙懛ā?/li>
- get類:獲取Date對象的日期和時間致开。
- getTime():返回距離1970年1月1日00:00:00的毫秒數(shù)峰锁,等同于valueOf方法。
- getDate():返回實(shí)例對象對應(yīng)每個月的幾號(從1開始)双戳。
- getDay():返回星期幾虹蒋,星期日為0,星期一為1,以此類推魄衅。
- getYear():返回距離1900的年數(shù)耍目。
- getFullYear():返回四位的年份。
- getMonth():返回月份(0表示1月徐绑,11表示12月)。
- getHours():返回小時(0-23)莫辨。
- getMilliseconds():返回毫秒(0-999)傲茄。
- getMinutes():返回分鐘(0-59)。
- getSeconds():返回秒(0-59)沮榜。
- getTimezoneOffset():返回當(dāng)前時間與UTC的時區(qū)差異盘榨,以分鐘表示,返回結(jié)果考慮到了夏令時因素蟆融。
這些get*方法返回的都是當(dāng)前時區(qū)的時間
- Date對象還提供了這些方法對應(yīng)的UTC版本草巡,用來返回UTC時間。
- getUTCDate()
- getUTCFullYear()
- getUTCMonth()
- getUTCDay()
- getUTCHours()
- getUTCMinutes()
- getUTCSeconds()
- getUTCMilliseconds()
- set類:設(shè)置Date對象的日期和時間型酥。
- setDate(date):設(shè)置實(shí)例對象對應(yīng)的每個月的幾號(1-31)山憨,返回改變后毫秒時間戳。
- setYear(year): 設(shè)置距離1900年的年數(shù)弥喉。
- setFullYear(year [, month, date]):設(shè)置四位年份郁竟。
- setHours(hour [, min, sec, ms]):設(shè)置小時(0-23)。
- setMilliseconds():設(shè)置毫秒(0-999)由境。
- setMinutes(min [, sec, ms]):設(shè)置分鐘(0-59)棚亩。
- setMonth(month [, date]):設(shè)置月份(0-11)。
- setSeconds(sec [, ms]):設(shè)置秒(0-59)虏杰。
- setTime(milliseconds):設(shè)置毫秒時間戳讥蟆。
這些跟get*方法一一對應(yīng)的,但是沒有setDay方法纺阔,因?yàn)樾瞧趲资怯?jì)算出來的瘸彤,而不是設(shè)置的。
var d2 = new Date ('January 6, 2013');
d2.setDate(-1) // 1356796800000
d2 // Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
//set*方法的參數(shù)都會自動折算
//參數(shù)超過當(dāng)月的最大天數(shù)笛钝,向下一個月順延
//參數(shù)是負(fù)數(shù)钧栖,從上個月的最后一天開始減去的天數(shù)。
- set*系列方法除了setTime()和setYear()婆翔,都有對應(yīng)的UTC版本拯杠,即設(shè)置UTC時區(qū)的時間。
- setUTCDate()
- setUTCFullYear()
- setUTCHours()
- setUTCMilliseconds()
- setUTCMinutes()
- setUTCMonth()
- setUTCSeconds()
- Date.prototype.valueOf()返回實(shí)例對象距離1970年1月1日00:00:00 UTC對應(yīng)的毫秒數(shù)啃奴,該方法等同于getTime方法潭陪。可以用于計(jì)算精確時間。
var d = new Date();
d.valueOf() // 1362790014817
d.getTime() // 1362790014817
八依溯、RegExp對象
- 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法老厌。
var regex = /xyz/;
//使用字面量,以斜杠表示開始和結(jié)束黎炉。編譯時新建正則表達(dá)式
var regex = new RegExp('xyz');
//使用 RegExp 構(gòu)造函數(shù)枝秤。運(yùn)行時新建正則表達(dá)式。
- 可以接受第二個參數(shù)慷嗜,表示修飾符
var regex = new RegExp('xyz', "i");
// 等價于
var regex = /xyz/i;
- 1.屬性
- 修飾符相關(guān)淀弹,返回布爾值,表示是否設(shè)置庆械。
- ignoreCase:i
- global:g
- multiline:m
返回布爾值薇溃,表示是否設(shè)置了i,g,m修飾符,該屬性只讀缭乘。
- 與修飾符無關(guān)的屬性沐序。
- lastIndex:返回下一次開始搜索的位置《榧ǎ可讀寫策幼,只在設(shè)置了g修飾符時有意義。
- source:返回正則表達(dá)式的字符串形式(不包括反斜杠)奴紧,只讀垄惧。
- test()返回一個布爾值,表示當(dāng)前模式是否能匹配參數(shù)字符串绰寞。
/cat/.test('cats and dogs') // true
- exec()返回匹配結(jié)果到逊。若匹配,返回一個數(shù)組(每一個匹配成功的子字符串)滤钱,否則返回null觉壶。
exec方法的返回數(shù)組包含屬性:- input:整個原字符串。
- index:整個模式匹配成功的開始位置(從0開始計(jì)數(shù))件缸。
- 字符串對象的方法
- match():返回一個數(shù)組(所有匹配的子字符串铜靶。)
- search():搜索,返回一個整數(shù)他炊,表示匹配開始的位置争剿。
- replace():替換,返回替換后的字符串痊末。
- split():分割蚕苇,返回一個數(shù)組(分割后的各個成員。)
- 如果正則表達(dá)式帶有g(shù)修飾符凿叠,則該方法與正則對象的exec方法行為不同涩笤,會一次性返回所有匹配成功的結(jié)果嚼吞。
- String.prototype.search(搜索模式,替換的內(nèi)容)蹬碧,返回第一個滿足條件的匹配結(jié)果在整個字符串中的位置舱禽,可替換。如果沒有任何匹配返回-1恩沽。
'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/a/, 'b') // "baa"
//不加g修飾符誊稚,就替換第一個匹配成功的值
'aaa'.replace(/a/g, 'b') // "bbb"
//否則替換所有匹配成功的值。
- replace方法的第二個參數(shù)可以使用美元符號$罗心,用來指代所替換的內(nèi)容里伯。
- $& 指代匹配的子字符串。
- $` 指代匹配結(jié)果前面的文本协屡。
- $' 指代匹配結(jié)果后面的文本。
- $n 指代匹配成功的第n(從1開始)組內(nèi)容全谤。
- $$ 指代美元符號$肤晓。
- String.prototype.split()按照正則規(guī)則分割字符串,返回一個由分割后的各個部分組成的數(shù)組认然。
- str.split(separator, [limit])(分隔規(guī)則补憾,返回數(shù)組的最大成員數(shù))
// 非正則分隔
'a, b,c, d'.split(',')
// [ 'a', ' b', 'c', ' d' ]
// 正則分隔,去除多余的空格
'a, b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]
// 指定返回數(shù)組的最大成員
'a, b,c, d'.split(/, */, 2)
[ 'a', 'b' ]
匹配規(guī)則
- 1.字面量字符(只表示它字面的含義)和元字符(有特殊含義卷员,不代表字面的意思)
- 元字符
- 點(diǎn)字符(.)匹配除回車(\r)盈匾、換行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符毕骡。
/c.t/
//c.t匹配c和t之間包含任意一個字符的情況
//只要這三個字符在同一行削饵,比如cat、c2t未巫、c-t等等窿撬,但是不匹配coot
- 位置字符用來提示字符所處的位置,主要有兩個字符叙凡。
- ^ 表示字符串的開始位置
- $ 表示字符串的結(jié)束位置
- 選擇符(|)
豎線符號(|)在正則表達(dá)式中表示“或關(guān)系”(OR)劈伴,即cat|dog表示匹配cat或dog。 - 轉(zhuǎn)義符
正則表達(dá)式中那些有特殊含義的字符握爷,如果要匹配它們本身跛璧,就需要在它們前面要加上反斜杠。比如要匹配加號新啼, \ +追城。
- 轉(zhuǎn)義符
/1+1/.test('1+1')
// false
/1\+1/.test('1+1')
// true
- 正則模式中,需要用斜杠轉(zhuǎn)義的燥撞,一共有12個字符:^漓柑、.、[、$辆布、(瞬矩、)、|锋玲、*景用、+、?惭蹂、{ 和 \ \伞插,需要特別注意的是,如果使用RegExp方法生成正則對象盾碗,轉(zhuǎn)義需要使用兩個斜杠媚污,因?yàn)樽址畠?nèi)部會先轉(zhuǎn)義一次。
(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 匹配一個以兩位十六進(jìn)制數(shù)(\x00-\xFF)表示的字符。
\uhhhh 匹配一個以四位十六進(jìn)制數(shù)(\u0000-\uFFFF)表示的unicode字符抠藕。
- 特殊字符
- 4.字符類(class)
- 表示有一系列字符可供選擇弃鸦,只要匹配其中一個就可以了。所有可供選擇的字符都放在方括號內(nèi)幢痘,如[xyz] 表示x唬格、y、z之中任選一個匹配颜说。
- 脫字符(^)
如果方括號內(nèi)的第一個字符是[ ^ ]购岗,則表示除了字符類之中的字符,其他字符都可以匹配门粪。比如喊积,[^xyz]表示除了x、y玄妈、z之外都可以匹配乾吻。- 脫字符只有在字符類的第一個位置才有特殊含義髓梅,否則就是字面含義
- 連字符(-)
表示字符的連續(xù)范圍。[abc]可以寫成[a-c] -
- 預(yù)定義模式
- \d [0-9]绎签。
- \D 0-9以外枯饿,[^0-9]。
- \w 任意的字母诡必、數(shù)字和下劃線奢方,[A-Za-z0-9_]。
- \W [^A-Za-z0-9_]爸舒。
- \s 匹配空格(包括制表符蟋字、空格符、斷行符等)扭勉,相等于[\t\r\n\v\f]鹊奖。
- \S [^\t\r\n\v\f]。
- \b 匹配詞的邊界涂炎。
- \B 匹配非詞邊界忠聚,即在詞的內(nèi)部。
正則表達(dá)式遇到換行符(\n)就會停止匹配璧尸。
- 6.重復(fù)類
模式的精確匹配次數(shù)咒林,使用大括號({ })表示熬拒。{n}恰好重復(fù)n次爷光,{n,}至少重復(fù)n次,{n,m}不少于n次澎粟,不多于m次蛀序。 -
- 量詞符用來設(shè)定某個模式出現(xiàn)的次數(shù)。
- ? 問號表示某個模式出現(xiàn)0次或1次活烙,等同于{0, 1}徐裸。
- *星號表示某個模式出現(xiàn)0次或多次,等同于{0,}啸盏。
- +加號表示某個模式出現(xiàn)1次或多次重贺,等同于{1,}。
- 8 .貪婪模式
回懦? * + 默認(rèn)情況下都是最大可能匹配气笙,即匹配直到下一個字符不滿足匹配規(guī)則為止。
var s = 'aaa';
s.match(/a+/) // ["aaa"]
//因?yàn)槟J(rèn)是貪婪模式怯晕,會一直匹配到字符a不出現(xiàn)為止潜圃,所以匹配結(jié)果是3個a
- 9.修飾符(modifier)
模式的附加規(guī)則,放在正則模式的最尾部舟茶。 可單個使用或多個一起使用谭期。- g修飾符
默認(rèn)情況下堵第,第一次匹配成功后,正則對象就停止向下匹配了隧出。g修飾符表示全局匹配(global)踏志,加上它以后,正則對象將匹配全部符合條件的結(jié)果鸳劳,主要用于搜索和替換狰贯。 - i修飾符
默認(rèn)情況下,正則對象區(qū)分字母的大小寫赏廓,加上i修飾符以后表示忽略大小寫(ignorecase)涵紊。 - m修飾符
表示多行模式(multiline),會修改 ^ 和$的行為幔摸。默認(rèn)情況下(即不加m修飾符時)摸柄,^ 和$匹配字符串的開始處和結(jié)尾處,加上m修飾符以后既忆,^ 和$還會匹配行首和行尾驱负,即識別換行符(\n)。
- g修飾符
- 組匹配
- 正則表達(dá)式的括號表示分組匹配患雇,括號中的模式可以用來匹配分組的內(nèi)容跃脊。
/fred+/.test('fredd') // true
//沒有括號,結(jié)果+只表示重復(fù)字母d
/(fred)+/.test('fredfred') // true
//有括號苛吱,結(jié)果+就表示匹配“fred”這個詞酪术。
- 使用組匹配時,不宜同時使用g修飾符翠储,否則match方法不會捕獲分組的內(nèi)容绘雁。
- 非捕獲組
(?:x)稱為非捕獲組(Non-capturing group),表示不返回該組匹配的內(nèi)容援所,即匹配的結(jié)果中不計(jì)入這個括號庐舟。
var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]
//第一個括號是非捕獲組,所以最后返回的結(jié)果中沒有第一個括號住拭,只有第二個括號匹配的內(nèi)容挪略。
- 先行斷言
x(?=y)稱為先行斷言(Positive look-ahead),x只有在y前面才匹配滔岳,y不會被計(jì)入返回結(jié)果杠娱。
var m = 'abc'.match(/b(?=c)/);
m // ["b"]
//括號里的部分是不會返回的。
- 先行否定斷言
x(?!y)稱為先行否定斷言(Negative look-ahead)澈蟆,x只有不在y前面才匹配墨辛,y不會被計(jì)入返回結(jié)果。
九趴俘、 JSON 格式
- 一種用于數(shù)據(jù)交換的文本格式目的是取代繁瑣笨重的 XML 格式睹簇。
- 每個 JSON 對象是簡單類型的值或復(fù)合類型的值例诀,只能是一個值衣厘,每個 JSON 文檔只能包含一個值。
- JSON 對值的類型和格式的嚴(yán)格規(guī)定。
- 復(fù)合類型的值只能是數(shù)組或?qū)ο蟛沂唬荒苁呛瘮?shù)俘种、正則表達(dá)式對象笼呆、日期對象挫鸽。
- 簡單類型的值只有四種:字符串、數(shù)值(十進(jìn)制)埃脏、布爾值和null(不能用NaN, Infinity, -Infinity和undefined)搪锣。
- 字符串必須使用雙引號表示,不能使用單引號彩掐。
- 對象的鍵名必須放在雙引號里面构舟。
- 數(shù)組或?qū)ο笞詈笠粋€成員的后面,不能加逗號堵幽。
- JSON.stringify()用于將一個值轉(zhuǎn)為字符串狗超。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原朴下。
- 如果原始對象中努咐,有一個成員的值是undefined、函數(shù)或 XML 對象殴胧,這個成員會被過濾渗稍。
- 正則對象會被轉(zhuǎn)成空對象。
JSON.stringify(/foo/) // "{}"
- JSON.stringify會忽略對象的不可遍歷屬性溃肪。
- JSON.stringify可接受一個數(shù)組作為第二個參數(shù)免胃,指定需要轉(zhuǎn)成字符串的屬性音五。第二個參數(shù)還可以是一個函數(shù)惫撰,用來更改JSON.stringify的默認(rèn)行為。
- 遞歸處理中躺涝,每一次處理的對象都是前一次返回的值厨钻。
- JSON.stringify還可接受第三個參數(shù),用于增加返回的JSON字符串的可讀性坚嗜。如果是數(shù)字夯膀,表示每個屬性前面添加的空格(最多不超過10個);如果是字符串(不超過10個字符)苍蔬,則該字符串會添加在每行前面诱建。
- 如果對象有自定義的toJSON方法,那么JSON.stringify會使用這個方法的返回值作為參數(shù)碟绑,而忽略原對象的其他屬性俺猿。
- toJSON將正則對象自動轉(zhuǎn)為字符串茎匠。JSON.stringify默認(rèn)不能轉(zhuǎn)換正則對象,設(shè)置了toJSON方法以后押袍,就可以轉(zhuǎn)換正則對象了诵冒。
- JSON.parse()方法用于將JSON字符串轉(zhuǎn)化成對象。
- 要求有效格式
- 為了處理解析錯誤谊惭,可以放在try...catch代碼塊中汽馋。
- JSON.parse方法可以接受一個處理函數(shù),與JSON.stringify方法類似圈盔。
十豹芯、console
Console面板(又稱為控制臺)
- 用途:
- 調(diào)試程序,顯示網(wǎng)頁代碼運(yùn)行時的錯誤信息驱敲。
- 提供了一個命令行接口告组,用來與網(wǎng)頁代碼互動
- 瀏覽器實(shí)現(xiàn)
- Elements:查看網(wǎng)頁的HTML源碼和CSS代碼。
- Resources:查看網(wǎng)頁加載的各種資源文件(比如代碼文件癌佩、字體文件木缝、css文件等),以及在硬盤上創(chuàng)建的各種內(nèi)容(比如本地緩存围辙、Cookie我碟、Local Storage等)。
- Network:查看網(wǎng)頁的 HTTP 通信情況姚建。
- Sources:查看網(wǎng)頁加載的所有源碼矫俺。
- Timeline:查看各種網(wǎng)頁行為隨時間變化的情況。
- Performance:查看網(wǎng)頁的性能情況掸冤,比如 CPU 和內(nèi)存消耗厘托。
- Console:用來運(yùn)行 JavaScript 命令。
- console 對象的方法
- 1.console.log()
- 在控制臺輸出信息稿湿∏ζィ可接受多個參數(shù),將結(jié)果連接起來輸出饺藤。
- 自動在每次輸出的結(jié)尾包斑,添加換行符。
- 如果第一個參數(shù)是格式字符串(使用了格式占位符)涕俗,將依次用后面的參數(shù)替換占位符再輸出罗丰。
- console.log方法支持以下占位符,不同格式的數(shù)據(jù)必須使用對應(yīng)格式的占位符再姑。
- %s 字符串
- %d 整數(shù)
- %i 整數(shù)
- %f 浮點(diǎn)數(shù)
- %o 對象的鏈接
- %c CSS格式字符串
- console.info()
- console.debug()
- 都是console.log方法的別名萌抵,用法完全一樣。console.info方法會在輸出信息的前面有藍(lán)色圖標(biāo)。
- console.warn()黃色三角绍填,console.error()紅色的叉
- 在控制臺輸出信息萎坷,表示出錯,會顯示錯誤發(fā)生的堆棧沐兰。其他與log都一樣哆档。
- log方法是寫入標(biāo)準(zhǔn)輸出(stdout),warn方法和error方法是寫入標(biāo)準(zhǔn)錯誤(stderr)住闯。
- console.table方法可以將某些復(fù)合類型的數(shù)據(jù)瓜浸,轉(zhuǎn)為表格顯示。
- 復(fù)合型數(shù)據(jù)轉(zhuǎn)為表格顯示的條件是比原,必須擁有主鍵插佛。數(shù)組->數(shù)字鍵、對象->最外層鍵量窘。
- console.count()用于計(jì)數(shù)雇寇,輸出它被調(diào)用了多少次。
- console.dir()用來對一個對象進(jìn)行檢查(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方法的輸出結(jié)果,比log方法更易讀冬殃,信息也更豐富囚痴。
//該方法對于輸出 DOM 對象非常有用,因?yàn)闀@示 DOM 對象的所有屬性审葬。
- console.dirxml()主要用于以目錄樹的形式深滚,顯示 DOM 節(jié)點(diǎn)。
console.dirxml([1, 2, 3])
// 等同于
console.dir([1, 2, 3])
//-如果參數(shù)不是 DOM 節(jié)點(diǎn)涣觉,而是普通的 JavaScript 對象痴荐,console.dirxml等同于console.dir。
- console.assert(表達(dá)式官册,字符串)
- 在程序運(yùn)行過程中進(jìn)行條件判斷生兆,若不滿足條件,顯示一個錯誤攀隔,但不會中斷程序執(zhí)行皂贩。相當(dāng)于提示用戶栖榨,內(nèi)部狀態(tài)不正確昆汹。
- 只有當(dāng)?shù)谝粋€參數(shù)為false,才會提示有錯誤婴栽,在控制臺輸出第二個參數(shù)满粗,否則不會有任何結(jié)果。
console.assert(false, '判斷條件不成立')
// Assertion failed: 判斷條件不成立
// 相當(dāng)于
try {
if (false) {
throw new Error('判斷條件不成立');
}
} catch(e) {
console.error(e);
}
- console.time()愚争,console.timeEnd()
這兩個方法用于計(jì)時映皆,可以算出一個操作所花費(fèi)的準(zhǔn)確時間挤聘。- time方法表示計(jì)時開始,timeEnd方法表示計(jì)時結(jié)束捅彻。它們的參數(shù)是計(jì)時器的名稱组去。調(diào)用timeEnd方法之后,console窗口會顯示“計(jì)時器名稱: 所耗費(fèi)的時間”步淹。
- console.profile()从隆,console.profileEnd()
- console.profile方法用來新建一個性能測試器(profile),它的參數(shù)是性能測試器的名字缭裆。
- console.profileEnd方法用來結(jié)束正在運(yùn)行的性能測試器键闺。
- console.group(),console.groupend()澈驼,console.groupCollapsed()
- console.group和console.groupend這兩個方法用于將顯示的信息分組辛燥。它只在輸出大量信息時有用,分在一組的信息缝其,可以用鼠標(biāo)折疊/展開挎塌。
- console.groupCollapsed方法與console.group方法相似,區(qū)別是該組的內(nèi)容在第一次顯示時是收起的(collapsed)内边。
- console.trace()勃蜘,console.clear()
- console.trace方法顯示當(dāng)前執(zhí)行的代碼在堆棧中的調(diào)用路徑。
- console.clear方法用于清除當(dāng)前控制臺的所有輸出假残,將光標(biāo)回置到第一行缭贡。如果用戶選中了控制臺的“Preserve log”選項(xiàng),網(wǎng)頁腳本調(diào)用console.log將不起作用辉懒,但手動在控制臺執(zhí)行該方法依然有效阳惹。
- 命令行 API
- $_屬性返回上一個表達(dá)式的值。
- $0 - $4眶俩,控制臺保存了最近5個在Elements面板選中的DOM元素莹汤,$0代表倒數(shù)第一個,$1代表倒數(shù)第二個,直到$4。
- $(selector)返回第一個匹配的元素,等同于document.querySelector()。如果頁面腳本對$有定義舆瘪,則會覆蓋原始的定義。
- $$(selector)返回一個選中的DOM對象某残,等同于document.querySelectorAll澳厢。
- $x(path)返回一個數(shù)組徐伐,包含匹配特定XPath表達(dá)式的所有DOM元素勺三。
- inspect(object)打開相關(guān)面板,并選中相應(yīng)的元素:DOM元素在Elements面板中顯示逃顶,JavaScript對象在Profiles面板中顯示盈蛮。
- getEventListeners(object)返回一個對象旁理,該對象的成員為登記了回調(diào)函數(shù)的各種事件,每個事件對應(yīng)一個數(shù)組烹植,數(shù)組的成員為該事件的回調(diào)函數(shù)愕贡。
- keys(object)草雕,values(object)
keys(object)方法返回一個數(shù)組,包含特定對象的所有鍵名固以。
values(object)方法返回一個數(shù)組墩虹,包含特定對象的所有鍵值嘱巾。 - monitorEvents(object[, events]) 監(jiān)聽特定對象上發(fā)生的特定事件。當(dāng)這種情況發(fā)生時诫钓,會返回一個Event對象旬昭,包含該事件的相關(guān)信息。
- unmonitorEvents(object[, events])用于停止監(jiān)聽菌湃。
允許監(jiān)聽同一大類的事件问拘。所有事件可以分成四個大類:- 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方法用于結(jié)束該性能測試骤坐。 - clear():清除控制臺的歷史。
copy(object):復(fù)制特定DOM元素到剪貼板下愈。
dir(object):顯示特定對象的所有屬性纽绍,是console.dir方法的別名。
dirxml(object):顯示特定對象的XML形式势似,是console.dirxml方法的別名拌夏。 - debugger用于除錯,設(shè)置斷點(diǎn)叫编。如果有正在運(yùn)行的除錯工具辖佣,程序運(yùn)行到debugger語句時會自動停下。沒有除錯工具搓逾,debugger語句不會產(chǎn)生任何結(jié)果卷谈,自動跳過這一句。
十一霞篡、屬性描述對象
- 一個內(nèi)部數(shù)據(jù)結(jié)構(gòu)世蔗,用來描述一個對象的屬性的行為,控制它的行為朗兵。每個屬性都有自己對應(yīng)的屬性描述對象污淋,保存該屬性的一些元信息。
- 6個元屬性余掖。
- value該屬性的屬性值寸爆,默認(rèn)為undefined。
- writable存放一個布爾值盐欺,表示屬性值(value)是否可改變赁豆,默認(rèn)為true。
- enumerable(可枚舉性)存放一個布爾值冗美,默認(rèn)為true魔种。如果設(shè)為false,會使得某些操作(比如for...in循環(huán)粉洼、Object.keys())跳過該屬性节预。
- configurable(可配置性)存放一個布爾值叶摄,默認(rèn)為true。false時將阻止某些操作改寫該屬性安拟。
- get(getter)蛤吓,默認(rèn)undefined。
- set(setter)去扣,默認(rèn)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這三個屬性的默認(rèn)值都為false。 - 可枚舉性(enumerable)
用來控制所描述的屬性脆炎,是否將被包括在for...in循環(huán)之中梅猿。如果為false- for..in(包括繼承自原型對象的屬性)
- Object.keys(只返回對象本身的屬性)
- JSON.stringify方法不會取到該屬性。
只有可枚舉的屬性秒裕,才會被for...in循環(huán)遍歷袱蚓,同時還規(guī)定原生繼承的屬性都是不可枚舉的。 - 如果需要獲取對象自身的所有屬性几蜻,不管是否可枚舉喇潘,可以使用Object.getOwnPropertyNames方法
- 可配置性(configurable)
決定了是否可以修改屬性描述對象。也就是說梭稚,當(dāng)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
返回直接定義在某個對象上面的全部屬性的名稱,而不管該屬性是否可枚舉忙迁。- 一般系統(tǒng)原生的屬性(非用戶自定義的屬性)都是不可枚舉的脐彩。
- Object.prototype.propertyIsEnumerable()用來判斷一個屬性是否可枚舉。
var o = {};
o.p = 123;
o.propertyIsEnumerable('p') // true
o.propertyIsEnumerable('toString') // false
//用戶自定義的p屬性是可枚舉的姊扔,而繼承自原型對象的toString屬性是不可枚舉的惠奸。
- 存取器(accessor)
- 除了直接定義,屬性還可以用存取器定義恰梢。get 和set佛南。
- 存取器提供的是虛擬屬性(實(shí)際不存在),是每次讀取時計(jì)算生成的嵌言⌒峄兀可實(shí)現(xiàn)每個屬性禁止賦值等。
- 存取器也可通過Object.defineProperty摧茴、Object.create定義绵载。
- 可以實(shí)現(xiàn)數(shù)據(jù)對象與DOM對象的雙向綁定。
- 對象的拷貝蓬蝶,可以通過Object.defineProperty方法來拷貝屬性尘分。
- 控制對象狀態(tài)
JavaScript提供了三種方法,精確控制一個對象的讀寫狀態(tài)丸氛,防止對象被改變培愁。最弱一層的保護(hù)是Object.preventExtensions,其次是Object.seal缓窜,最強(qiáng)的Object.freeze定续。- Object.preventExtensions方法可以使得一個對象無法再添加新的屬性。(可以用delete命令刪除它的現(xiàn)有屬性禾锤。)
- Object.isExtensible方法用于檢查一個對象是否使用了Object.preventExtensions方法私股。也就是說,檢查是否可以為一個對象添加屬性恩掷。
- Object.seal方法使得一個對象既無法添加新屬性倡鲸,也無法刪除舊屬性。
- Object.isSealed方法用于檢查一個對象是否使用了Object.seal方法黄娘。
- Object.freeze()可以使得一個對象無法添加新屬性峭状、無法刪除舊屬性克滴、也無法改變屬性的值,使得這個對象實(shí)際上變成了常量优床。
- Object.isFrozen方法用于檢查一個對象是否使用了Object.freeze()方法劝赔。
- 局限性
上面的方法鎖定對象的可寫性有一個漏洞,依然可以通過改變原型對象胆敞,來為對象增加屬性着帽。可把原型也凍結(jié)住解決移层。
另外一個局限是仍翰,如果屬性值是對象,上面這些方法只能凍結(jié)屬性指向的對象幽钢,而不能凍結(jié)對象本身的內(nèi)容歉备。