JavaScript 標(biāo)準(zhǔn)庫(kù)

參考基礎(chǔ)教程的整理,方便記憶

一、Object對(duì)象 (O大寫(xiě))

  • 所有其他對(duì)象都繼承自這個(gè)對(duì)象。Object本身也是一個(gè)構(gòu)造函數(shù),可以直接通過(guò)它來(lái)生成新對(duì)象。
    • 作為構(gòu)造函數(shù)使用時(shí),可以接受一個(gè)參數(shù)。參數(shù)若為對(duì)象,則直接返回原對(duì)象;若是一個(gè)原始類(lèi)型的值,則返回該值對(duì)應(yīng)的包裝對(duì)象。
  • Object.keys(只返回可枚舉的屬性)和Object.getOwnPropertyNames(返回不可枚舉的屬性名。),一般用來(lái)遍歷對(duì)象的屬性。
    • 參數(shù)都是一個(gè)對(duì)象,都返回一個(gè)數(shù)組,該數(shù)組的成員都是對(duì)象自身的(而不是繼承的)所有屬性名。
    • 一般都使用Object.keys方法,遍歷數(shù)組的屬性。
var a = ["Hello", "World"];

Object.keys(a)
// ["0", "1"]

Object.getOwnPropertyNames(a)
// ["0", "1", "length"]
  • 對(duì)象屬性模型的相關(guān)方法

    • Object.getOwnPropertyDescriptor():獲取某個(gè)屬性的attributes對(duì)象。
    • Object.defineProperty():通過(guò)attributes對(duì)象,定義某個(gè)屬性。
    • Object.defineProperties():多個(gè)屬性。
    • Object.getOwnPropertyNames():返回直接定義在某個(gè)對(duì)象上面的全部屬性的名稱(chēng)。
  • 控制對(duì)象狀態(tài)的方法

    • Object.preventExtensions():防止對(duì)象擴(kuò)展。
    • Object.isExtensible():判斷對(duì)象是否可擴(kuò)展。
    • Object.seal():禁止對(duì)象配置。
    • Object.isSealed():判斷一個(gè)對(duì)象是否可配置。
    • Object.freeze():凍結(jié)一個(gè)對(duì)象。
    • Object.isFrozen():判斷一個(gè)對(duì)象是否被凍結(jié)。
  • 原型鏈相關(guān)方法

    • Object.create():指定原型對(duì)象和屬性,返回一個(gè)新的對(duì)象。
    • Object.getPrototypeOf():獲取對(duì)象的Prototype對(duì)象。
  • Object實(shí)例對(duì)象的方法,主要有以下六個(gè)。

    • valueOf():返回當(dāng)前對(duì)象對(duì)應(yīng)的值。
    • toString():返回當(dāng)前對(duì)象對(duì)應(yīng)的字符串形式。
    • toLocaleString():本地字符串形式。
      hasOwnProperty():判斷某個(gè)屬性是否為當(dāng)前對(duì)象自身的屬性,還是繼承自原型對(duì)象的屬性。
    • isPrototypeOf():判斷當(dāng)前對(duì)象是否為另一個(gè)對(duì)象的原型。
    • propertyIsEnumerable():判斷某個(gè)屬性是否可枚舉。
  • Object.prototype.valueOf()作用是返回一個(gè)對(duì)象的“值”,默認(rèn)情況下返回對(duì)象本身。

var o = new Object();
o.valueOf() === o // true
  • Object.prototype.toString()作用是返回一個(gè)對(duì)象的字符串形式,默認(rèn)情況下返回類(lèi)型字符串。也可判斷數(shù)據(jù)類(lèi)型。

二、Array 對(duì)象

  • Array是JavaScript的內(nèi)置對(duì)象,同時(shí)也是一個(gè)構(gòu)造函數(shù),可以用它生成新的數(shù)組。(不同的參數(shù),會(huì)導(dǎo)致它的行為不一致。)
  • Array.isArray()用來(lái)判斷一個(gè)值是否為數(shù)組。
var a = [1, 2, 3];

typeof a // "object"
Array.isArray(a) // true
//typeof運(yùn)算符只能顯示數(shù)組-的類(lèi)型是Object,而Array.isArray方法可以對(duì)數(shù)組返回true。
  • valueOf返回?cái)?shù)組本身。toString返回?cái)?shù)組的字符串形式。
  • push方法用于在數(shù)組的末端添加一個(gè)或多個(gè)元素,并返回添加新元素后的數(shù)組長(zhǎng)度。會(huì)改變?cè)瓟?shù)組。
var a = [];
a.push(1) 
//合并兩個(gè)數(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ū)ο筇砑釉?,添加后的?duì)象變成類(lèi)似數(shù)組的對(duì)象,即新加入元素的鍵對(duì)應(yīng)數(shù)組的索引,并且對(duì)象有一個(gè)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ù)組的最后一個(gè)元素,并返回該元素。注意,該方法會(huì)改變?cè)瓟?shù)組。
    • 對(duì)空數(shù)組使用pop方法,不會(huì)報(bào)錯(cuò),而是返回undefined。
    • push和pop結(jié)合使用,就構(gòu)成了“后進(jìn)先出”的棧結(jié)構(gòu)(stack)。
  • join方法以參數(shù)作為分隔符,將所有數(shù)組成員組成一個(gè)字符串返回。如果不提供參數(shù),默認(rèn)用逗號(hào)分隔
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方法用于多個(gè)數(shù)組的合并。它將新數(shù)組的成員,添加到原數(shù)組的尾部,然后返回一個(gè)新數(shù)組,原數(shù)組不變。

  • shift用于刪除數(shù)組的第一個(gè)元素,并返回該元素。注意,該方法會(huì)改變?cè)瓟?shù)組。

    • shift可以遍歷并清空一個(gè)數(shù)組。
    • push和shift結(jié)合使用,就構(gòu)成了“先進(jìn)先出”的隊(duì)列結(jié)構(gòu)(queue)。
  • unshift方法用于在數(shù)組的第一個(gè)位置添加元素(可多個(gè)),并返回添加新元素后的數(shù)組長(zhǎng)度。會(huì)改變?cè)瓟?shù)組。

  • reverse用于顛倒數(shù)組中元素的順序,返回改變后的數(shù)組。改變?cè)瓟?shù)組。

  • slice(起始,終止(不包含在內(nèi)))用于提取原數(shù)組的一部分,返回一個(gè)新數(shù)組,原數(shù)組不變。

    • 若參數(shù)是負(fù)數(shù),則表示倒數(shù)計(jì)算的位置。
    • 如果參數(shù)值大于數(shù)組成員的個(gè)數(shù),或者第二個(gè)參數(shù)小于第一個(gè)參數(shù),則返回空數(shù)組。
  • splice(起始,個(gè)數(shù),被插入數(shù)組的新元素(可有可無(wú)))刪除原數(shù)組的一部分成員,并可以在被刪除的位置添加入新的數(shù)組成員,返回值是被刪除的元素。會(huì)改變?cè)瓟?shù)組。

  • sort方法對(duì)數(shù)組成員進(jìn)行排序,默認(rèn)是按照字典順序排序。排序后,原數(shù)組將被改變。數(shù)值會(huì)被先轉(zhuǎn)成字符串。

  • map方法對(duì)數(shù)組的所有成員依次調(diào)用一個(gè)函數(shù),根據(jù)函數(shù)結(jié)果返回一個(gè)新數(shù)組。原數(shù)組沒(méi)有變化。

    • 遍歷字符串的每個(gè)字符要通過(guò)函數(shù)的call方法間接使用,或者先將字符串轉(zhuǎn)為數(shù)組。
    • 接受一個(gè)函數(shù)作為參數(shù)。該函數(shù)調(diào)用時(shí),map方法會(huì)將其傳入三個(gè)參數(shù),分別是當(dāng)前成員、當(dāng)前位置和數(shù)組本身。
    • map方法不會(huì)跳過(guò)undefined和null,但是會(huì)跳過(guò)空位.
  • forEach與map很相似,但無(wú)返回值。(可接受第二個(gè)參數(shù),用來(lái)綁定回調(diào)函數(shù)的this關(guān)鍵字。)

    • forEach無(wú)法中斷執(zhí)行,會(huì)將所有成員遍歷完。若需符合某種條件時(shí),中斷遍歷,用for循環(huán)。
  • filter的參數(shù)是一個(gè)函數(shù),所有數(shù)組成員依次執(zhí)行該函數(shù),返回結(jié)果為true的成員組成一個(gè)新數(shù)組返回。該方法不會(huì)改變?cè)瓟?shù)組。

  • some(),every()用來(lái)判斷數(shù)組成員是否符合某種條件

    • every則是所有數(shù)組成員的返回值都是true,才返回true。
    • some是只要有一個(gè)數(shù)組成員的返回值是true則為ture。
  • reduce方法和reduceRight方法依次處理數(shù)組的每個(gè)成員,最終累計(jì)為一個(gè)值。它們的差別是,reduce是從左到右處理,reduceRight相反
    第一個(gè)參數(shù)都是一個(gè)函數(shù)。該函數(shù)接受以下四個(gè)參數(shù)。

    • 累積變量,默認(rèn)為數(shù)組的第一個(gè)成員(必須)
    • 當(dāng)前變量,默認(rèn)為數(shù)組的第二個(gè)成員(必須)
    • 當(dāng)前位置(從0開(kāi)始)(可選)
    • 原數(shù)組(可選)
  • indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置,如果沒(méi)有出現(xiàn)則返回-1。indexOf方法還可以接受第二個(gè)參數(shù),表示搜索的開(kāi)始位置。

  • lastIndexOf方法返回給定元素在數(shù)組中最后一次出現(xiàn)的位置,如果沒(méi)有出現(xiàn)則返回-1。如果數(shù)組中包含NaN,這兩個(gè)方法不適用,即無(wú)法確定數(shù)組成員是否包含NaN。

三、包裝對(duì)象

var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);
//生成了三個(gè)對(duì)象,與原始值的類(lèi)型不同。

typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"

v1 === 123 // false
v2 === 'abc' // false
v3 === true // false
  • valueOf方法返回包裝對(duì)象實(shí)例對(duì)應(yīng)的原始類(lèi)型的值。
new Number(123).valueOf()  // 123
new String("abc").valueOf() // "abc"
new Boolean("true").valueOf() // tru
  • toString方法返回實(shí)例對(duì)應(yīng)的字符串形式
  • 原始類(lèi)型的自動(dòng)轉(zhuǎn)換
'abc'.length // 3
//abc是一個(gè)字符串,本身不是對(duì)象,不能調(diào)用length屬性。
//自動(dòng)將其轉(zhuǎn)為包裝對(duì)象,調(diào)用length屬性。
//調(diào)用結(jié)束后,這個(gè)臨時(shí)對(duì)象就會(huì)被銷(xiāo)毀。
//只讀的,無(wú)法修改。字符串無(wú)法添加新屬性。
'abc'.charAt === String.prototype.charAt
// true
  • 如果包裝對(duì)象與原始類(lèi)型值進(jìn)行混合運(yùn)算,包裝對(duì)象會(huì)轉(zhuǎn)化為原始類(lèi)型(實(shí)際是調(diào)用自身的valueOf方法)。
new Number(123) + 123 // 246
new String('abc') + 'abc' // "abcabc"
  • Boolean 對(duì)象
if (new Boolean(false)) {
  console.log('true');
} // true
// false對(duì)應(yīng)的包裝對(duì)象實(shí)例是一個(gè)對(duì)象,進(jìn)行邏輯運(yùn)算時(shí),
//被自動(dòng)轉(zhuǎn)化成布爾值true(所有對(duì)象對(duì)應(yīng)的布爾值都是true)
if (new Boolean(false).valueOf()) {
  console.log('true');
} // 無(wú)輸出
//實(shí)例的valueOf方法,則返回實(shí)例對(duì)應(yīng)的原始值,本例為false。
if (Boolean(null)) {
  console.log('true');
} // 無(wú)輸出

if (new Boolean(null)) {
  console.log('true');
} // true
//對(duì)于一些特殊值,Boolean對(duì)象前面加不加new
//會(huì)得到完全相反的結(jié)果

四、 Number對(duì)象

  • 數(shù)值對(duì)應(yīng)的包裝對(duì)象,可以作為構(gòu)造函數(shù)使用(用于生成值為數(shù)值的對(duì)象。),也可以作為工具函數(shù)使用。
var n = new Number(1);
typeof n // "object"
  • Number對(duì)象的屬性
    • Number.POSITIVE_INFINITY:正的無(wú)限,指向Infinity。
    • Number.NEGATIVE_INFINITY:負(fù)的無(wú)限,指向-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()
    接受一個(gè)參數(shù),表示輸出的進(jìn)制。如果省略這個(gè)參數(shù),默認(rèn)將數(shù)值先轉(zhuǎn)為十進(jìn)制,再輸出字符串
(10).toString(2) // "1010"
(10).toString(8) // "12"
//前面的數(shù)值要加括號(hào)或加兩個(gè)點(diǎn)(即理解為10.0.)
10..toString(2)
10 .toString(2) // "1010"
10.0.toString(2) // "1010"
  • Number.prototype.toFixed()
    • 轉(zhuǎn)為指定位數(shù)的小數(shù),返回這個(gè)小數(shù)對(duì)應(yīng)的字符串。
      參數(shù)為指定的小數(shù)位數(shù),有效范圍為0到20,超出這個(gè)范圍將拋出RangeError錯(cuò)誤。
  • Number.prototype.toExponential()
    • 將一個(gè)數(shù)轉(zhuǎn)為科學(xué)計(jì)數(shù)法形式。
    • 參數(shù)表示小數(shù)點(diǎn)后有效數(shù)字的位數(shù),范圍為0到20,超出這個(gè)范圍,會(huì)拋出一個(gè)RangeError。
  • Number.prototype.toPrecision()
    • 將一個(gè)數(shù)轉(zhuǎn)為指定位數(shù)的有效數(shù)字參數(shù)為有效數(shù)字的位數(shù),范圍是1到21,超出這個(gè)范圍會(huì)拋出RangeError錯(cuò)誤(不太可靠,跟浮點(diǎn)數(shù)不是精確儲(chǔ)存有關(guān)。)
  • 自定義方法

五、String對(duì)象

  • 生成字符串的包裝對(duì)象。
  • 實(shí)際上,字符串的包裝對(duì)象是一個(gè)類(lèi)似數(shù)組的對(duì)象(即很像數(shù)組,實(shí)質(zhì)上不是數(shù)組)。
new String("abc")
// String {0: "a", 1: "b", 2: "c", length: 3}
  • String對(duì)象還可將任意類(lèi)型的值轉(zhuǎn)為字符串。
  • String.fromCharCode()
    • String對(duì)象提供的靜態(tài)方法(即定義在對(duì)象本身,而非對(duì)象實(shí)例),主要是fromCharCode()。參數(shù)是一系列Unicode碼點(diǎn)(傳入的參數(shù)不能大于0xFFFF),返回對(duì)應(yīng)的字符串。
  • charAt()返回指定位置的字符,參數(shù)是從0開(kāi)始編號(hào)的位置。
  • charCodeAt方法返回給定位置字符的Unicode碼點(diǎn)(十進(jìn)制表示),相當(dāng)于String.fromCharCode()的逆操作。
    • charCodeAt方法返回的Unicode碼點(diǎn)不大于65536(0xFFFF)(兩個(gè)字節(jié)的字符的碼點(diǎn))。否則必需連續(xù)使用兩次charCodeAt,讀入charCodeAt(i),和charCodeAt(i+1),將兩個(gè)16字節(jié)放在一起,才能得到準(zhǔn)確的字符。
    • 如果參數(shù)為負(fù)數(shù),或大于等于字符串的長(zhǎng)度,charCodeAt返回NaN。
  • concat方法用于連接兩個(gè)字符串,返回一個(gè)新字符串,不改變?cè)址?/li>
'a'.concat('b', 'c') // "abc"
//可以接受多個(gè)參數(shù)

六、Math對(duì)象

  • 該對(duì)象不是構(gòu)造函數(shù),不能生成實(shí)例,所有的屬性和方法都必須在Math對(duì)象上調(diào)用。

  • 屬性

    • Math.E:常數(shù)e。
    • Math.LN2:2的自然對(duì)數(shù)。
    • Math.LN10:10的自然對(duì)數(shù)。
    • Math.LOG2E:以2為底的e的對(duì)數(shù)。
    • Math.LOG10E:以10為底的e的對(duì)數(shù)。
    • Math.PI:常數(shù)Pi。
    • Math.SQRT1_2:0.5的平方根。
    • Math.SQRT2:2的平方根。
  • 方法

    • Math.abs():絕對(duì)值
    • Math.ceil():向上取整
    • Math.floor():向下取整
    • Math.max():最大值
    • Math.min():最小值
    • Math.pow():指數(shù)運(yùn)算
    • Math.sqrt():平方根
    • Math.log():自然對(duì)數(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對(duì)象

  • 日期和時(shí)間的操作接口??杀硎?970年1月1日00:00:00前后的各1億天(單位為毫秒)。
Date()
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//可作為普通函數(shù)直接調(diào)用,返回一個(gè)代表當(dāng)前時(shí)間的字符串。
Date(2000, 1, 1)
// "Tue Dec 01 2015 09:34:43 GMT+0800 (CST)"
//即使帶有參數(shù),Date作為普通函數(shù)使用時(shí),返回的還是當(dāng)前時(shí)間。
  • 可當(dāng)構(gòu)造函數(shù)使用。使用new命令,會(huì)返回一個(gè)Date對(duì)象的實(shí)例。不加參數(shù),生成代表當(dāng)前時(shí)間的對(duì)象。
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)"
//這個(gè)Date實(shí)例對(duì)應(yīng)的字符串值,就是當(dāng)前時(shí)間。
  • new Date(milliseconds)

    • Date對(duì)象接受從1970年1月1日00:00:00 UTC開(kāi)始計(jì)算的毫秒數(shù)作為參數(shù)。Unix時(shí)間戳(單位為秒)作為參數(shù),須將Unix時(shí)間戳乘以1000。
new Date(1378218728000)
// Tue Sep 03 2013 22:32:08 GMT+0800 (CST)

// 1970年1月2日的零時(shí)
var Jan02_1970 = new Date(3600 * 24 * 1000);
// Fri Jan 02 1970 08:00:00 GMT+0800 (CST)

// 1969年12月31日的零時(shí)
var Dec31_1969 = new Date(-3600 * 24 * 1000);
// Wed Dec 31 1969 08:00:00 GMT+0800 (CST)
//Date構(gòu)造函數(shù)的參數(shù)可以是一個(gè)負(fù)數(shù),表示1970年1月1日之前的時(shí)間。
  • new Date(datestring),(month day, year hours:minutes:seconds)接受一個(gè)日期字符串作為參數(shù),返回所對(duì)應(yīng)的時(shí)間。
new Date('January 6, 2013');
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)
//省略了小時(shí)、分鐘或秒數(shù)會(huì)被設(shè)為0。
  • 月份從0開(kāi)始計(jì)算,但是,天數(shù)從1開(kāi)始計(jì)算。另外,除了日期默認(rèn)為1,小時(shí)、分鐘、秒鐘和毫秒默認(rèn)都是0。
  • 最少需要提供兩個(gè)參數(shù)(年和月),其他參數(shù)都是可選的,默認(rèn)等于0。
new Date(2013)
// Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
//只有一個(gè)參數(shù),2013被解釋為毫秒數(shù),而不是年份。
new Date(2013, 15)
// Tue Apr 01 2014 00:00:00 GMT+0800 (CST)
//這些參數(shù)如果超出了正常范圍,會(huì)被自動(dòng)折算。
new Date(2013, 0, -1)
// Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
//參數(shù)還可以使用負(fù)數(shù),表示扣去的時(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,會(huì)自動(dòng)加上1900。
//如果為負(fù)數(shù),則表示公元前。
  • 類(lèi)型轉(zhuǎn)換時(shí),Date對(duì)象的實(shí)例如果轉(zhuǎn)為數(shù)值,則等于對(duì)應(yīng)的毫秒數(shù);如果轉(zhuǎn)為字符串,則等于對(duì)應(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)算,返回的就是連接后的兩個(gè)字符串
  • Date.now返回當(dāng)前距離1970年1月1日 00:00:00 UTC的毫秒數(shù)(Unix時(shí)間戳乘以1000)。
Date.now() // 1364026285194
  • Date.parse方法用來(lái)解析日期字符串,返回距離1970年1月1日 00:00:00的毫秒數(shù)標(biāo)準(zhǔn)YYYY-MM-DDTHH:mm:ss.sssZ,其他格式也可以被解析。
  • Date對(duì)象返回當(dāng)前時(shí)區(qū)的時(shí)間。Date.UTC可以返回UTC時(shí)間(世界標(biāo)準(zhǔn)時(shí)間)。
// 格式
Date.UTC(year, month[, date[, hrs[, min[, sec[, ms]]]]])

// 用法
Date.UTC(2011, 0, 1, 2, 3, 4, 567)
// 1293847384567
  • Date實(shí)例對(duì)象的方法
  • to類(lèi):從Date對(duì)象返回一個(gè)字符串,表示指定的時(shí)間。
    • Date.prototype.toString()返回一個(gè)完整的日期字符串
    • Date.prototype.toUTCString()返回對(duì)應(yīng)的UTC時(shí)間,比北京時(shí)間晚8個(gè)小時(shí)。
    • Date.prototype.toISOString()返回對(duì)應(yīng)時(shí)間的ISO8601寫(xiě)法。(UTC時(shí)區(qū))
    • Date.prototype.toJSON()返回一個(gè)符合JSON格式的ISO格式的日期字符串,與toISOString相同。
    • Date.prototype.toDateString()返回日期字符串。
    • Date.prototype.toTimeString()返回時(shí)間字符串。
    • Date.prototype.toLocaleDateString()返回一個(gè)字符串,代表日期的當(dāng)?shù)貙?xiě)法。
    • Date.prototype.toLocaleTimeString()返回一個(gè)字符串,代表時(shí)間的當(dāng)?shù)貙?xiě)法。
  • get類(lèi):獲取Date對(duì)象的日期和時(shí)間。
    • getTime():返回距離1970年1月1日00:00:00的毫秒數(shù),等同于valueOf方法。
    • getDate():返回實(shí)例對(duì)象對(duì)應(yīng)每個(gè)月的幾號(hào)(從1開(kāi)始)。
    • getDay():返回星期幾,星期日為0,星期一為1,以此類(lèi)推。
    • getYear():返回距離1900的年數(shù)。
    • getFullYear():返回四位的年份。
    • getMonth():返回月份(0表示1月,11表示12月)。
    • getHours():返回小時(shí)(0-23)。
    • getMilliseconds():返回毫秒(0-999)。
    • getMinutes():返回分鐘(0-59)。
    • getSeconds():返回秒(0-59)。
    • getTimezoneOffset():返回當(dāng)前時(shí)間與UTC的時(shí)區(qū)差異,以分鐘表示,返回結(jié)果考慮到了夏令時(shí)因素。
      這些get*方法返回的都是當(dāng)前時(shí)區(qū)的時(shí)間
  • Date對(duì)象還提供了這些方法對(duì)應(yīng)的UTC版本,用來(lái)返回UTC時(shí)間。
    • getUTCDate()
    • getUTCFullYear()
    • getUTCMonth()
    • getUTCDay()
    • getUTCHours()
    • getUTCMinutes()
    • getUTCSeconds()
    • getUTCMilliseconds()
  • set類(lèi):設(shè)置Date對(duì)象的日期和時(shí)間。
    • setDate(date):設(shè)置實(shí)例對(duì)象對(duì)應(yīng)的每個(gè)月的幾號(hào)(1-31),返回改變后毫秒時(shí)間戳。
    • setYear(year): 設(shè)置距離1900年的年數(shù)。
    • setFullYear(year [, month, date]):設(shè)置四位年份。
    • setHours(hour [, min, sec, ms]):設(shè)置小時(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è)置毫秒時(shí)間戳。
      這些跟get*方法一一對(duì)應(yīng)的,但是沒(méi)有setDay方法,因?yàn)樾瞧趲资怯?jì)算出來(lái)的,而不是設(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ù)都會(huì)自動(dòng)折算
//參數(shù)超過(guò)當(dāng)月的最大天數(shù),向下一個(gè)月順延
//參數(shù)是負(fù)數(shù),從上個(gè)月的最后一天開(kāi)始減去的天數(shù)。
  • set*系列方法除了setTime()和setYear(),都有對(duì)應(yīng)的UTC版本,即設(shè)置UTC時(shí)區(qū)的時(shí)間。
    • setUTCDate()
    • setUTCFullYear()
    • setUTCHours()
    • setUTCMilliseconds()
    • setUTCMinutes()
    • setUTCMonth()
    • setUTCSeconds()
  • Date.prototype.valueOf()返回實(shí)例對(duì)象距離1970年1月1日00:00:00 UTC對(duì)應(yīng)的毫秒數(shù),該方法等同于getTime方法??梢杂糜谟?jì)算精確時(shí)間。
var d = new Date();
d.valueOf() // 1362790014817
d.getTime() // 1362790014817

八、RegExp對(duì)象

  • 正則表達(dá)式(regular expression)是一種表達(dá)文本模式(即字符串結(jié)構(gòu))的方法。
var regex = /xyz/;
//使用字面量,以斜杠表示開(kāi)始和結(jié)束。編譯時(shí)新建正則表達(dá)式
var regex = new RegExp('xyz');
//使用 RegExp 構(gòu)造函數(shù)。運(yùn)行時(shí)新建正則表達(dá)式。
  • 可以接受第二個(gè)參數(shù),表示修飾符
var regex = new RegExp('xyz', "i");
// 等價(jià)于
var regex = /xyz/i;
  • 1.屬性
  • 修飾符相關(guān),返回布爾值,表示是否設(shè)置。
    • ignoreCase:i
    • global:g
    • multiline:m
      返回布爾值,表示是否設(shè)置了i,g,m修飾符,該屬性只讀。
  • 與修飾符無(wú)關(guān)的屬性。
    • lastIndex:返回下一次開(kāi)始搜索的位置。可讀寫(xiě),只在設(shè)置了g修飾符時(shí)有意義。
    • source:返回正則表達(dá)式的字符串形式(不包括反斜杠),只讀。
  • test()返回一個(gè)布爾值,表示當(dāng)前模式是否能匹配參數(shù)字符串。
/cat/.test('cats and dogs') // true
  • exec()返回匹配結(jié)果。若匹配,返回一個(gè)數(shù)組(每一個(gè)匹配成功的子字符串),否則返回null。
    exec方法的返回?cái)?shù)組包含屬性:
    • input:整個(gè)原字符串。
    • index:整個(gè)模式匹配成功的開(kāi)始位置(從0開(kāi)始計(jì)數(shù))。
  • 字符串對(duì)象的方法
    • match():返回一個(gè)數(shù)組(所有匹配的子字符串。)
    • search():搜索,返回一個(gè)整數(shù),表示匹配開(kāi)始的位置。
    • replace():替換,返回替換后的字符串。
    • split():分割,返回一個(gè)數(shù)組(分割后的各個(gè)成員。)
  • 如果正則表達(dá)式帶有g(shù)修飾符,則該方法與正則對(duì)象的exec方法行為不同,會(huì)一次性返回所有匹配成功的結(jié)果。
  • String.prototype.search(搜索模式,替換的內(nèi)容),返回第一個(gè)滿(mǎn)足條件的匹配結(jié)果在整個(gè)字符串中的位置,可替換。如果沒(méi)有任何匹配返回-1。
'aaa'.replace('a', 'b') // "baa"
'aaa'.replace(/a/, 'b') // "baa"
//不加g修飾符,就替換第一個(gè)匹配成功的值
'aaa'.replace(/a/g, 'b') // "bbb"
//否則替換所有匹配成功的值。
  • replace方法的第二個(gè)參數(shù)可以使用美元符號(hào)$,用來(lái)指代所替換的內(nèi)容。
    • $& 指代匹配的子字符串。
    • $` 指代匹配結(jié)果前面的文本。
    • $' 指代匹配結(jié)果后面的文本。
    • $n 指代匹配成功的第n(從1開(kāi)始)組內(nèi)容。
    • $$ 指代美元符號(hào)$。
  • String.prototype.split()按照正則規(guī)則分割字符串,返回一個(gè)由分割后的各個(gè)部分組成的數(shù)組。
    • str.split(separator, [limit])(分隔規(guī)則,返回?cái)?shù)組的最大成員數(shù))
// 非正則分隔
'a,  b,c, d'.split(',')
// [ 'a', '  b', 'c', ' d' ]

// 正則分隔,去除多余的空格
'a,  b,c, d'.split(/, */)
// [ 'a', 'b', 'c', 'd' ]

// 指定返回?cái)?shù)組的最大成員
'a,  b,c, d'.split(/, */, 2)
[ 'a', 'b' ]

匹配規(guī)則

  • 1.字面量字符(只表示它字面的含義)和元字符(有特殊含義,不代表字面的意思)
  • 元字符
    • 點(diǎn)字符(.)匹配除回車(chē)(\r)、換行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
/c.t/
//c.t匹配c和t之間包含任意一個(gè)字符的情況
//只要這三個(gè)字符在同一行,比如cat、c2t、c-t等等,但是不匹配coot
  • 位置字符用來(lái)提示字符所處的位置,主要有兩個(gè)字符。
    • ^ 表示字符串的開(kāi)始位置
    • $ 表示字符串的結(jié)束位置
  • 選擇符(|)
    豎線(xiàn)符號(hào)(|)在正則表達(dá)式中表示“或關(guān)系”(OR),即cat|dog表示匹配cat或dog。
    1. 轉(zhuǎn)義符
      正則表達(dá)式中那些有特殊含義的字符,如果要匹配它們本身,就需要在它們前面要加上反斜杠。比如要匹配加號(hào), \ +。
/1+1/.test('1+1')
// false

/1\+1/.test('1+1')
// true
  • 正則模式中,需要用斜杠轉(zhuǎn)義的,一共有12個(gè)字符:^、.、[、$、(、)、|、*、+、?、{ 和 \ \,需要特別注意的是,如果使用RegExp方法生成正則對(duì)象,轉(zhuǎn)義需要使用兩個(gè)斜杠,因?yàn)樽址畠?nèi)部會(huì)先轉(zhuǎn)義一次。
(new RegExp('1\+1')).test('1+1')
// false

(new RegExp('1\\+1')).test('1+1')
// true
    1. 特殊字符
      \cX 表示Ctrl-[X],其中的X是A-Z之中任一個(gè)英文字母,用來(lái)匹配控制字符。
      [\b] 退格鍵(U+0008),不要與\b混淆。
      \n 換行鍵。
      \r 回車(chē)鍵。
      \t 制表符tab(U+0009)。
      \v 垂直制表符(U+000B)。
      \f 換頁(yè)符(U+000C)。
      \0 null字符(U+0000)。
      \xhh 匹配一個(gè)以?xún)晌皇M(jìn)制數(shù)(\x00-\xFF)表示的字符。
      \uhhhh 匹配一個(gè)以四位十六進(jìn)制數(shù)(\u0000-\uFFFF)表示的unicode字符。
  • 4.字符類(lèi)(class)
    • 表示有一系列字符可供選擇,只要匹配其中一個(gè)就可以了。所有可供選擇的字符都放在方括號(hào)內(nèi),如[xyz] 表示x、y、z之中任選一個(gè)匹配。
  • 脫字符(^)
    如果方括號(hào)內(nèi)的第一個(gè)字符是[ ^ ],則表示除了字符類(lèi)之中的字符,其他字符都可以匹配。比如,[^xyz]表示除了x、y、z之外都可以匹配。
    • 脫字符只有在字符類(lèi)的第一個(gè)位置才有特殊含義,否則就是字面含義
  • 連字符(-)
    表示字符的連續(xù)范圍。[abc]可以寫(xiě)成[a-c]
    1. 預(yù)定義模式
    • \d [0-9]。
    • \D 0-9以外,[^0-9]。
    • \w 任意的字母、數(shù)字和下劃線(xiàn),[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)就會(huì)停止匹配。
  • 6.重復(fù)類(lèi)
    模式的精確匹配次數(shù),使用大括號(hào)({ })表示。{n}恰好重復(fù)n次,{n,}至少重復(fù)n次,{n,m}不少于n次,不多于m次。
    1. 量詞符用來(lái)設(shè)定某個(gè)模式出現(xiàn)的次數(shù)。
    • ? 問(wèn)號(hào)表示某個(gè)模式出現(xiàn)0次或1次,等同于{0, 1}。
    • *星號(hào)表示某個(gè)模式出現(xiàn)0次或多次,等同于{0,}。
    • +加號(hào)表示某個(gè)模式出現(xiàn)1次或多次,等同于{1,}。
  • 8 .貪婪模式
    ? * + 默認(rèn)情況下都是最大可能匹配,即匹配直到下一個(gè)字符不滿(mǎn)足匹配規(guī)則為止。
var s = 'aaa';
s.match(/a+/) // ["aaa"]
//因?yàn)槟J(rèn)是貪婪模式,會(huì)一直匹配到字符a不出現(xiàn)為止,所以匹配結(jié)果是3個(gè)a
  • 9.修飾符(modifier)
    模式的附加規(guī)則,放在正則模式的最尾部。 可單個(gè)使用或多個(gè)一起使用。
    • g修飾符
      默認(rèn)情況下,第一次匹配成功后,正則對(duì)象就停止向下匹配了。g修飾符表示全局匹配(global),加上它以后,正則對(duì)象將匹配全部符合條件的結(jié)果,主要用于搜索和替換。
    • i修飾符
      默認(rèn)情況下,正則對(duì)象區(qū)分字母的大小寫(xiě),加上i修飾符以后表示忽略大小寫(xiě)(ignorecase)。
    • m修飾符
      表示多行模式(multiline),會(huì)修改 ^ 和$的行為。默認(rèn)情況下(即不加m修飾符時(shí)),^ 和$匹配字符串的開(kāi)始處和結(jié)尾處,加上m修飾符以后,^ 和$還會(huì)匹配行首和行尾,即識(shí)別換行符(\n)。
    1. 組匹配
  • 正則表達(dá)式的括號(hào)表示分組匹配,括號(hào)中的模式可以用來(lái)匹配分組的內(nèi)容。
/fred+/.test('fredd') // true
//沒(méi)有括號(hào),結(jié)果+只表示重復(fù)字母d
/(fred)+/.test('fredfred') // true
//有括號(hào),結(jié)果+就表示匹配“fred”這個(gè)詞。
  • 使用組匹配時(shí),不宜同時(shí)使用g修飾符,否則match方法不會(huì)捕獲分組的內(nèi)容。
  • 非捕獲組
    (?:x)稱(chēng)為非捕獲組(Non-capturing group),表示不返回該組匹配的內(nèi)容,即匹配的結(jié)果中不計(jì)入這個(gè)括號(hào)。
var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]
//第一個(gè)括號(hào)是非捕獲組,所以最后返回的結(jié)果中沒(méi)有第一個(gè)括號(hào),只有第二個(gè)括號(hào)匹配的內(nèi)容。
  • 先行斷言
    x(?=y)稱(chēng)為先行斷言(Positive look-ahead),x只有在y前面才匹配,y不會(huì)被計(jì)入返回結(jié)果。
var m = 'abc'.match(/b(?=c)/);
m // ["b"]
//括號(hào)里的部分是不會(huì)返回的。
  • 先行否定斷言
    x(?!y)稱(chēng)為先行否定斷言(Negative look-ahead),x只有不在y前面才匹配,y不會(huì)被計(jì)入返回結(jié)果。

九、 JSON 格式

  • 一種用于數(shù)據(jù)交換的文本格式目的是取代繁瑣笨重的 XML 格式。
  • 每個(gè) JSON 對(duì)象是簡(jiǎn)單類(lèi)型的值或復(fù)合類(lèi)型的值,只能是一個(gè)值,每個(gè) JSON 文檔只能包含一個(gè)值。
  • JSON 對(duì)值的類(lèi)型和格式的嚴(yán)格規(guī)定。
    • 復(fù)合類(lèi)型的值只能是數(shù)組或?qū)ο螅荒苁呛瘮?shù)、正則表達(dá)式對(duì)象、日期對(duì)象。
    • 簡(jiǎn)單類(lèi)型的值只有四種:字符串、數(shù)值(十進(jìn)制)、布爾值和null(不能用NaN, Infinity, -Infinity和undefined)。
    • 字符串必須使用雙引號(hào)表示,不能使用單引號(hào)。
    • 對(duì)象的鍵名必須放在雙引號(hào)里面。
    • 數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面,不能加逗號(hào)。
  • JSON.stringify()用于將一個(gè)值轉(zhuǎn)為字符串。該字符串符合 JSON 格式,并且可以被JSON.parse方法還原。
    • 如果原始對(duì)象中,有一個(gè)成員的值是undefined、函數(shù)或 XML 對(duì)象,這個(gè)成員會(huì)被過(guò)濾。
    • 正則對(duì)象會(huì)被轉(zhuǎn)成空對(duì)象。
JSON.stringify(/foo/) // "{}"
  • JSON.stringify會(huì)忽略對(duì)象的不可遍歷屬性。
    • JSON.stringify可接受一個(gè)數(shù)組作為第二個(gè)參數(shù),指定需要轉(zhuǎn)成字符串的屬性。第二個(gè)參數(shù)還可以是一個(gè)函數(shù),用來(lái)更改JSON.stringify的默認(rèn)行為。
    • 遞歸處理中,每一次處理的對(duì)象都是前一次返回的值。
    • JSON.stringify還可接受第三個(gè)參數(shù),用于增加返回的JSON字符串的可讀性。如果是數(shù)字,表示每個(gè)屬性前面添加的空格(最多不超過(guò)10個(gè));如果是字符串(不超過(guò)10個(gè)字符),則該字符串會(huì)添加在每行前面。
    • 如果對(duì)象有自定義的toJSON方法,那么JSON.stringify會(huì)使用這個(gè)方法的返回值作為參數(shù),而忽略原對(duì)象的其他屬性。
  • toJSON將正則對(duì)象自動(dòng)轉(zhuǎn)為字符串。JSON.stringify默認(rèn)不能轉(zhuǎn)換正則對(duì)象,設(shè)置了toJSON方法以后,就可以轉(zhuǎn)換正則對(duì)象了。
  • JSON.parse()方法用于將JSON字符串轉(zhuǎn)化成對(duì)象。
    • 要求有效格式
    • 為了處理解析錯(cuò)誤,可以放在try...catch代碼塊中。
    • JSON.parse方法可以接受一個(gè)處理函數(shù),與JSON.stringify方法類(lèi)似。

十、console

Console面板(又稱(chēng)為控制臺(tái))

  • 用途:
    • 調(diào)試程序,顯示網(wǎng)頁(yè)代碼運(yùn)行時(shí)的錯(cuò)誤信息。
    • 提供了一個(gè)命令行接口,用來(lái)與網(wǎng)頁(yè)代碼互動(dòng)
  • 瀏覽器實(shí)現(xiàn)
    • Elements:查看網(wǎng)頁(yè)的HTML源碼和CSS代碼。
    • Resources:查看網(wǎng)頁(yè)加載的各種資源文件(比如代碼文件、字體文件、css文件等),以及在硬盤(pán)上創(chuàng)建的各種內(nèi)容(比如本地緩存、Cookie、Local Storage等)。
    • Network:查看網(wǎng)頁(yè)的 HTTP 通信情況。
    • Sources:查看網(wǎng)頁(yè)加載的所有源碼。
    • Timeline:查看各種網(wǎng)頁(yè)行為隨時(shí)間變化的情況。
    • Performance:查看網(wǎng)頁(yè)的性能情況,比如 CPU 和內(nèi)存消耗。
    • Console:用來(lái)運(yùn)行 JavaScript 命令。
  • console 對(duì)象的方法
  • 1.console.log()
    • 在控制臺(tái)輸出信息??山邮芏鄠€(gè)參數(shù),將結(jié)果連接起來(lái)輸出。
    • 自動(dòng)在每次輸出的結(jié)尾,添加換行符。
    • 如果第一個(gè)參數(shù)是格式字符串(使用了格式占位符),將依次用后面的參數(shù)替換占位符再輸出。
  • console.log方法支持以下占位符,不同格式的數(shù)據(jù)必須使用對(duì)應(yīng)格式的占位符。
    • %s 字符串
    • %d 整數(shù)
    • %i 整數(shù)
    • %f 浮點(diǎn)數(shù)
    • %o 對(duì)象的鏈接
    • %c CSS格式字符串
  • console.info()
  • console.debug()
    • 都是console.log方法的別名,用法完全一樣。console.info方法會(huì)在輸出信息的前面有藍(lán)色圖標(biāo)。
  • console.warn()黃色三角,console.error()紅色的叉
    • 在控制臺(tái)輸出信息,表示出錯(cuò),會(huì)顯示錯(cuò)誤發(fā)生的堆棧。其他與log都一樣。
    • log方法是寫(xiě)入標(biāo)準(zhǔn)輸出(stdout),warn方法和error方法是寫(xiě)入標(biāo)準(zhǔn)錯(cuò)誤(stderr)。
  • console.table方法可以將某些復(fù)合類(lèi)型的數(shù)據(jù),轉(zhuǎn)為表格顯示。
    • 復(fù)合型數(shù)據(jù)轉(zhuǎn)為表格顯示的條件是,必須擁有主鍵。數(shù)組->數(shù)字鍵、對(duì)象->最外層鍵。
  • console.count()用于計(jì)數(shù),輸出它被調(diào)用了多少次。
  • console.dir()用來(lái)對(duì)一個(gè)對(duì)象進(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方法更易讀,信息也更豐富。
//該方法對(duì)于輸出 DOM 對(duì)象非常有用,因?yàn)闀?huì)顯示 DOM 對(duì)象的所有屬性。
  • console.dirxml()主要用于以目錄樹(shù)的形式,顯示 DOM 節(jié)點(diǎn)。
console.dirxml([1, 2, 3])
// 等同于
console.dir([1, 2, 3])
//-如果參數(shù)不是 DOM 節(jié)點(diǎn),而是普通的 JavaScript 對(duì)象,console.dirxml等同于console.dir。
  • console.assert(表達(dá)式,字符串)
    • 在程序運(yùn)行過(guò)程中進(jìn)行條件判斷,若不滿(mǎn)足條件,顯示一個(gè)錯(cuò)誤,但不會(huì)中斷程序執(zhí)行。相當(dāng)于提示用戶(hù),內(nèi)部狀態(tài)不正確。
    • 只有當(dāng)?shù)谝粋€(gè)參數(shù)為false,才會(huì)提示有錯(cuò)誤,在控制臺(tái)輸出第二個(gè)參數(shù),否則不會(huì)有任何結(jié)果。
console.assert(false, '判斷條件不成立')
// Assertion failed: 判斷條件不成立

// 相當(dāng)于
try {
  if (false) {
    throw new Error('判斷條件不成立');
  }
} catch(e) {
  console.error(e);
}
  • console.time(),console.timeEnd()
    這兩個(gè)方法用于計(jì)時(shí),可以算出一個(gè)操作所花費(fèi)的準(zhǔn)確時(shí)間。
    • time方法表示計(jì)時(shí)開(kāi)始,timeEnd方法表示計(jì)時(shí)結(jié)束。它們的參數(shù)是計(jì)時(shí)器的名稱(chēng)。調(diào)用timeEnd方法之后,console窗口會(huì)顯示“計(jì)時(shí)器名稱(chēng): 所耗費(fèi)的時(shí)間”。
  • console.profile(),console.profileEnd()
    • console.profile方法用來(lái)新建一個(gè)性能測(cè)試器(profile),它的參數(shù)是性能測(cè)試器的名字。
    • console.profileEnd方法用來(lái)結(jié)束正在運(yùn)行的性能測(cè)試器。
  • console.group(),console.groupend(),console.groupCollapsed()
    • console.group和console.groupend這兩個(gè)方法用于將顯示的信息分組。它只在輸出大量信息時(shí)有用,分在一組的信息,可以用鼠標(biāo)折疊/展開(kāi)。
    • console.groupCollapsed方法與console.group方法相似,區(qū)別是該組的內(nèi)容在第一次顯示時(shí)是收起的(collapsed)。
  • console.trace(),console.clear()
    • console.trace方法顯示當(dāng)前執(zhí)行的代碼在堆棧中的調(diào)用路徑。
    • console.clear方法用于清除當(dāng)前控制臺(tái)的所有輸出,將光標(biāo)回置到第一行。如果用戶(hù)選中了控制臺(tái)的“Preserve log”選項(xiàng),網(wǎng)頁(yè)腳本調(diào)用console.log將不起作用,但手動(dòng)在控制臺(tái)執(zhí)行該方法依然有效。
  • 命令行 API
    • $_屬性返回上一個(gè)表達(dá)式的值。
    • $0 - $4,控制臺(tái)保存了最近5個(gè)在Elements面板選中的DOM元素,$0代表倒數(shù)第一個(gè),$1代表倒數(shù)第二個(gè),直到$4。
    • $(selector)返回第一個(gè)匹配的元素,等同于document.querySelector()。如果頁(yè)面腳本對(duì)$有定義,則會(huì)覆蓋原始的定義。
    • $$(selector)返回一個(gè)選中的DOM對(duì)象,等同于document.querySelectorAll。
    • $x(path)返回一個(gè)數(shù)組,包含匹配特定XPath表達(dá)式的所有DOM元素。
    • inspect(object)打開(kāi)相關(guān)面板,并選中相應(yīng)的元素:DOM元素在Elements面板中顯示,JavaScript對(duì)象在Profiles面板中顯示。
    • getEventListeners(object)返回一個(gè)對(duì)象,該對(duì)象的成員為登記了回調(diào)函數(shù)的各種事件,每個(gè)事件對(duì)應(yīng)一個(gè)數(shù)組,數(shù)組的成員為該事件的回調(diào)函數(shù)。
    • keys(object),values(object)
      keys(object)方法返回一個(gè)數(shù)組,包含特定對(duì)象的所有鍵名。
      values(object)方法返回一個(gè)數(shù)組,包含特定對(duì)象的所有鍵值。
    • monitorEvents(object[, events]) 監(jiān)聽(tīng)特定對(duì)象上發(fā)生的特定事件。當(dāng)這種情況發(fā)生時(shí),會(huì)返回一個(gè)Event對(duì)象,包含該事件的相關(guān)信息。
    • unmonitorEvents(object[, events])用于停止監(jiān)聽(tīng)。
      允許監(jiān)聽(tīng)同一大類(lèi)的事件。所有事件可以分成四個(gè)大類(lèi):
      • 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方法用于啟動(dòng)一個(gè)特定名稱(chēng)的CPU性能測(cè)試,profileEnd方法用于結(jié)束該性能測(cè)試。
  • clear():清除控制臺(tái)的歷史。
    copy(object):復(fù)制特定DOM元素到剪貼板。
    dir(object):顯示特定對(duì)象的所有屬性,是console.dir方法的別名。
    dirxml(object):顯示特定對(duì)象的XML形式,是console.dirxml方法的別名。
  • debugger用于除錯(cuò),設(shè)置斷點(diǎn)。如果有正在運(yùn)行的除錯(cuò)工具,程序運(yùn)行到debugger語(yǔ)句時(shí)會(huì)自動(dòng)停下。沒(méi)有除錯(cuò)工具,debugger語(yǔ)句不會(huì)產(chǎn)生任何結(jié)果,自動(dòng)跳過(guò)這一句。

十一、屬性描述對(duì)象

  • 一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)描述一個(gè)對(duì)象的屬性的行為,控制它的行為。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述對(duì)象,保存該屬性的一些元信息。
  • 6個(gè)元屬性。
    • value該屬性的屬性值,默認(rèn)為undefined。
    • writable存放一個(gè)布爾值,表示屬性值(value)是否可改變,默認(rèn)為true。
    • enumerable(可枚舉性)存放一個(gè)布爾值,默認(rèn)為true。如果設(shè)為false,會(huì)使得某些操作(比如for...in循環(huán)、Object.keys())跳過(guò)該屬性。
    • configurable(可配置性)存放一個(gè)布爾值,默認(rèn)為true。false時(shí)將阻止某些操作改寫(xiě)該屬性。
    • get(getter),默認(rèn)undefined。
    • set(setter),默認(rèn)undefined。
  • Object.getOwnPropertyDescriptor方法可以讀出對(duì)象自身屬性的屬性描述對(duì)象。
var o = { p: 'a' };

Object.getOwnPropertyDescriptor(o, 'p')
// Object { value: "a",
//   writable: true,
//   enumerable: true,
//   configurable: true
// }
  • Object.defineProperty(),Object.defineProperties()
    允許通過(guò)定義屬性描述對(duì)象,來(lái)定義或修改一個(gè)屬性,然后返回修改后的對(duì)象。格式:Object.defineProperty(object, propertyName, attributesObject),它的writable、configurable、enumerable這三個(gè)屬性的默認(rèn)值都為false。
  • 可枚舉性(enumerable)
    用來(lái)控制所描述的屬性,是否將被包括在for...in循環(huán)之中。如果為false
    • for..in(包括繼承自原型對(duì)象的屬性)
    • Object.keys(只返回對(duì)象本身的屬性)
    • JSON.stringify方法不會(huì)取到該屬性。
      只有可枚舉的屬性,才會(huì)被for...in循環(huán)遍歷,同時(shí)還規(guī)定原生繼承的屬性都是不可枚舉的。
    • 如果需要獲取對(duì)象自身的所有屬性,不管是否可枚舉,可以使用Object.getOwnPropertyNames方法
  • 可配置性(configurable)
    決定了是否可以修改屬性描述對(duì)象。也就是說(shuō),當(dāng)configurable為false的時(shí)候,value、writable、enumerable和configurable都不能被修改了。
    • writable只有在從false改為true會(huì)報(bào)錯(cuò),從true改為false則是允許的。
    • value,只要writable和configurable有一個(gè)為true,就允許改動(dòng)。
    • configurable為false時(shí),若直接對(duì)該屬性賦值,不報(bào)錯(cuò)但不會(huì)成功。
    • 可配置性決定了一個(gè)變量是否可以被刪除(delete)。
    • var聲明變量時(shí)其configurable為false。否則(或者使用屬性賦值的方式聲明變量),變量的可配置性為true。
    • 如果一個(gè)變量是使用var命令生成的,就無(wú)法用delete命令刪除。也就是說(shuō),delete只能刪除對(duì)象的屬性。
  • 可寫(xiě)性(writable)
    決定了屬性的值(value)是否可以被改變
  • Object.getOwnPropertyNames
    返回直接定義在某個(gè)對(duì)象上面的全部屬性的名稱(chēng),而不管該屬性是否可枚舉。
    • 一般系統(tǒng)原生的屬性(非用戶(hù)自定義的屬性)都是不可枚舉的。
  • Object.prototype.propertyIsEnumerable()用來(lái)判斷一個(gè)屬性是否可枚舉。
var o = {};
o.p = 123;

o.propertyIsEnumerable('p') // true
o.propertyIsEnumerable('toString') // false
//用戶(hù)自定義的p屬性是可枚舉的,而繼承自原型對(duì)象的toString屬性是不可枚舉的。
  • 存取器(accessor)
    • 除了直接定義,屬性還可以用存取器定義。get 和set。
    • 存取器提供的是虛擬屬性(實(shí)際不存在),是每次讀取時(shí)計(jì)算生成的??蓪?shí)現(xiàn)每個(gè)屬性禁止賦值等。
    • 存取器也可通過(guò)Object.defineProperty、Object.create定義。
    • 可以實(shí)現(xiàn)數(shù)據(jù)對(duì)象與DOM對(duì)象的雙向綁定。
  • 對(duì)象的拷貝,可以通過(guò)Object.defineProperty方法來(lái)拷貝屬性。
  • 控制對(duì)象狀態(tài)
    JavaScript提供了三種方法,精確控制一個(gè)對(duì)象的讀寫(xiě)狀態(tài),防止對(duì)象被改變。最弱一層的保護(hù)是Object.preventExtensions,其次是Object.seal,最強(qiáng)的Object.freeze。
    • Object.preventExtensions方法可以使得一個(gè)對(duì)象無(wú)法再添加新的屬性。(可以用delete命令刪除它的現(xiàn)有屬性。)
    • Object.isExtensible方法用于檢查一個(gè)對(duì)象是否使用了Object.preventExtensions方法。也就是說(shuō),檢查是否可以為一個(gè)對(duì)象添加屬性。
    • Object.seal方法使得一個(gè)對(duì)象既無(wú)法添加新屬性,也無(wú)法刪除舊屬性。
    • Object.isSealed方法用于檢查一個(gè)對(duì)象是否使用了Object.seal方法。
    • Object.freeze()可以使得一個(gè)對(duì)象無(wú)法添加新屬性、無(wú)法刪除舊屬性、也無(wú)法改變屬性的值,使得這個(gè)對(duì)象實(shí)際上變成了常量。
    • Object.isFrozen方法用于檢查一個(gè)對(duì)象是否使用了Object.freeze()方法。
    • 局限性
      上面的方法鎖定對(duì)象的可寫(xiě)性有一個(gè)漏洞,依然可以通過(guò)改變?cè)蛯?duì)象,來(lái)為對(duì)象增加屬性??砂言鸵矁鼋Y(jié)住解決。
      另外一個(gè)局限是,如果屬性值是對(duì)象,上面這些方法只能凍結(jié)屬性指向的對(duì)象,而不能凍結(jié)對(duì)象本身的內(nèi)容。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容