1. Object對(duì)象
判斷變量是否為對(duì)象的小技巧
如果Object方法的參數(shù)是一個(gè)對(duì)象奸鬓,它總是返回該對(duì)象位隶,即不用轉(zhuǎn)換串纺,所以可以利用這一點(diǎn)來(lái)判斷一個(gè)變量是否為對(duì)象:
function isObject(value) {
return value === Object(value);
}
isObject([]) // true
Object.keys()和Object.getOwnPropertyNames()有什么區(qū)別羡疗?
- 這兩者都是用來(lái)遍歷對(duì)象的屬性摆霉,接受一個(gè)對(duì)象作為參數(shù)豪椿,返回一個(gè)數(shù)組。
- 遍歷的都是該對(duì)象自身的(而不是繼承的)所有屬性名携栋;但
Object.keys
方法只返回可枚舉的屬性,Object.getOwnPropertyNames
方法還返回不可枚舉的屬性名搭盾。
例如:
var a = ['Hello', 'World'];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]
使用toString判斷數(shù)據(jù)類(lèi)型
Object的toString方法,作用是返回一個(gè)對(duì)象的字符串形式婉支,默認(rèn)情況下返回類(lèi)型字符串鸯隅,因此可以用來(lái)判斷一個(gè)值的類(lèi)型。
數(shù)組向挖、字符串蝌以、函數(shù)、Date 對(duì)象都分別部署了自定義的toString方法户誓,覆蓋了Object.prototype.toString方法饼灿,所以通常使用Object.prototype.toString.call(value)
來(lái)判斷值的類(lèi)型。
不同數(shù)據(jù)類(lèi)型的Object.prototype.toString方法返回值如下帝美。
- 數(shù)值:返回
[object Number]
碍彭。 - 字符串:返回
[object String]
。 - 布爾值:返回
[object Boolean]
悼潭。 - undefined:返回
[object Undefined]
庇忌。 - null:返回
[object Null]
。 - 數(shù)組:返回
[object Array]
舰褪。 - arguments 對(duì)象:返回
[object Arguments]
皆疹。 - 函數(shù):返回
[object Function]
。 - Error 對(duì)象:返回
[object Error]
占拍。 - Date 對(duì)象:返回
[object Date]
略就。 - RegExp 對(duì)象:返回
[object RegExp]
。 - 其他對(duì)象:返回
[object Object]
晃酒。
tips: 簡(jiǎn)單封裝一個(gè)判斷類(lèi)型的函數(shù):
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
2. 屬性描述對(duì)象
Object.defineProperty() 的作用表牢?它接受哪幾個(gè)參數(shù)?
Object.defineProperty()方法允許通過(guò)屬性描述對(duì)象贝次,定義或修改一個(gè)屬性崔兴,然后返回修改后的對(duì)象,如果屬性已經(jīng)存在,Object.defineProperty()方法相當(dāng)于更新該屬性的屬性描述對(duì)象敲茄。
Object.defineProperty方法接受三個(gè)參數(shù)位谋,依次如下。
- object:屬性所在的對(duì)象
- propertyName:字符串堰燎,表示屬性名
- attributesObject:屬性描述對(duì)象
其中第三個(gè)參數(shù)是屬性描述對(duì)象掏父,Object.defineProperty()和Object.defineProperties()參數(shù)里面的屬性描述對(duì)象,writable爽待、configurable损同、enumerable這三個(gè)屬性的默認(rèn)值都為false
- value
- writable
- enumerable, 表示該屬性是否可遍歷
- configurable鸟款, 表示可配置性
- get
- set
注意: 一旦定義了取值函數(shù)get(或存值函數(shù)set),就不能將writable屬性設(shè)為true茂卦,或者同時(shí)定義value屬性何什,否則會(huì)報(bào)錯(cuò)。
3. Array對(duì)象
為什么不建議使用new Array的方式生成新數(shù)組等龙?
Array構(gòu)造函數(shù)有一個(gè)很大的缺陷处渣,就是不同的參數(shù),會(huì)導(dǎo)致它的行為不一致
// 單個(gè)正整數(shù)參數(shù)蛛砰,表示返回的新數(shù)組的長(zhǎng)度
var arr = new Array(1);
console.log(arr); //[empty]
// 非正整數(shù)的數(shù)值作為參數(shù)罐栈,會(huì)報(bào)錯(cuò)
new Array(3.2) // RangeError: Invalid array length
// 多參數(shù)時(shí),所有參數(shù)都是返回的新數(shù)組的成員泥畅,該方式是正常情況
new Array(1, 2) // [1, 2]
數(shù)組中有哪些用于遍歷的方法荠诬?
- map
- 返回新數(shù)組
- 回調(diào)函數(shù)接受三個(gè)參數(shù):當(dāng)前成員、當(dāng)前位置和數(shù)組本身
- map方法不會(huì)跳過(guò)undefined和null位仁,但是會(huì)跳過(guò)空位
- 可以接受第二個(gè)參數(shù)柑贞,用來(lái)綁定回調(diào)函數(shù)內(nèi)部的this變量
- forEach
- 不返回值,只用來(lái)操作數(shù)據(jù)
- 回調(diào)函數(shù)接受三個(gè)參數(shù):當(dāng)前值聂抢、當(dāng)前位置钧嘶、整個(gè)數(shù)組
- forEach方法不會(huì)跳過(guò)undefined和null,但會(huì)跳過(guò)空位
- 可以接受第二個(gè)參數(shù)琳疏,用來(lái)綁定回調(diào)函數(shù)內(nèi)部的this變量
- forEach方法無(wú)法中斷執(zhí)行有决,總是會(huì)將所有成員遍歷完
- filter
- 過(guò)濾數(shù)組成員,滿(mǎn)足條件的成員組成一個(gè)新數(shù)組返回
- 回調(diào)函數(shù)接受三個(gè)參數(shù):當(dāng)前成員空盼,當(dāng)前位置和整個(gè)數(shù)組
- 可以接受第二個(gè)參數(shù)书幕,用來(lái)綁定參數(shù)函數(shù)內(nèi)部的this變量
- some, every
- 返回一個(gè)布爾值
- 可以接受第二個(gè)參數(shù)我注,用來(lái)綁定參數(shù)函數(shù)內(nèi)部的this變量
- reduce按咒,reduceRight
- 返回一個(gè)值,依次處理數(shù)組的每個(gè)成員,最終累計(jì)為一個(gè)值
- 回調(diào)函數(shù)接受以下四個(gè)參數(shù):累積變量(默認(rèn)數(shù)組第一項(xiàng))励七,當(dāng)前變量(默認(rèn)數(shù)組第二項(xiàng))智袭,當(dāng)前位置(從0開(kāi)始)原數(shù)組