學(xué)習(xí)教材為:https://wangdoc.com/javascript/stdlib/index.html
1 JavaScript 的內(nèi)置對(duì)象有哪些?
JavaScript 的所有其他對(duì)象都繼承自O(shè)bject對(duì)象,即那些對(duì)象都是Object的實(shí)例。
Object對(duì)象的原生方法分成兩類:Object本身的方法與Object的實(shí)例方法。
2 如何區(qū)分Object本身的方法與Object的實(shí)例方法?
- Object對(duì)象本身的方法:就是直接定義在Object對(duì)象的方法。
- Object的實(shí)例方法:就是定義在Object原型對(duì)象Object.prototype上的方法。它可以被Object實(shí)例直接使用。
// Object對(duì)象本身的方法
Object.print = function (o) { console.log(o) };
// Object的實(shí)例方法
Object.prototype.print = function () {
console.log(this);
};
var obj = new Object();
obj.print() // Object
3 如何理解Object本身是一個(gè)函數(shù)?
因?yàn)镺bject可以將任意值轉(zhuǎn)為對(duì)象,它具備函數(shù)的功能,例如:
4 Object方法如何處理參數(shù)是原始類型的值?
如果參數(shù)是原始類型的值,Object方法將其轉(zhuǎn)為對(duì)應(yīng)的包裝對(duì)象的實(shí)例
var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true
instanceof運(yùn)算符用來驗(yàn)證,一個(gè)對(duì)象是否為指定的構(gòu)造函數(shù)的實(shí)例。obj instanceof Object返回true,就表示obj對(duì)象是Object的實(shí)例。
5 Object方法的參數(shù)是一個(gè)對(duì)象,會(huì)返回什么?
如果Object方法的參數(shù)是一個(gè)對(duì)象,它總是返回該對(duì)象,即不用轉(zhuǎn)換。
var value = {};
var obj = Object(value) // 返回原對(duì)象
obj === value // true
6 Object作為構(gòu)造函數(shù),有什么作用?
- 直接通過它來生成新對(duì)象。
- 可以接受一個(gè)參數(shù),如果該參數(shù)是一個(gè)對(duì)象,則直接返回這個(gè)對(duì)象;如果是一個(gè)原始類型的值,則返回該值對(duì)應(yīng)的包裝對(duì)象
7 什么是Object 的靜態(tài)方法?
所謂“靜態(tài)方法”,是指部署在Object對(duì)象自身的方法。
8 有哪些方法可以遍歷對(duì)象的屬性?
- Object.keys方法的參數(shù)是一個(gè)對(duì)象,返回一個(gè)數(shù)組。該數(shù)組的成員都是該對(duì)象自身的(而不是繼承的)所有屬性名。
var obj = {
p1: 123,
p2: 456
};
Object.keys(obj)
// ["p1", "p2"]
- Object.getOwnPropertyNames方法與Object.keys類似,也是接受一個(gè)對(duì)象作為參數(shù),返回一個(gè)數(shù)組,包含了該對(duì)象自身的所有屬性名。
var obj = {
p1: 123,
p2: 456
};
Object.getOwnPropertyNames(obj)
// ["p1", "p2"]
9 什么是不可枚舉的屬性?
- 可枚舉屬性是指那些內(nèi)部 “可枚舉” 標(biāo)志設(shè)置為 true 的屬性。對(duì)于通過直接的賦值和屬性初始化的屬性,該標(biāo)識(shí)值默認(rèn)為即為 true。但是對(duì)于通過 Object.defineProperty等定義的屬性,該標(biāo)識(shí)值默認(rèn)為 false。
- 其中js中基本包裝類型的原型屬性是不可枚舉的,如Object, Array, Number等。
- 可枚舉的屬性可以通過[for...in]循環(huán)進(jìn)行遍歷(除非該屬性名是一個(gè)Symbol,或者通過Object.keys()方法返回一個(gè)可枚舉屬性的數(shù)組。
10 對(duì)象中原型鏈相關(guān)方法有哪些?
- Object.create():該方法可以指定原型對(duì)象和屬性,返回一個(gè)新的對(duì)象。
- Object.getPrototypeOf():獲取對(duì)象的Prototype對(duì)象。
11 Object 的實(shí)例方法有哪些?
- Object.prototype.valueOf():返回當(dāng)前對(duì)象對(duì)應(yīng)的值。
- Object.prototype.toString():返回當(dāng)前對(duì)象對(duì)應(yīng)的字符串形式。
- Object.prototype.toLocaleString():返回當(dāng)前對(duì)象對(duì)應(yīng)的本地字符串形式。
- Object.prototype.hasOwnProperty():判斷某個(gè)屬性是否為當(dāng)前對(duì)象自身的屬性,還是繼承自原型對(duì)象的屬性。
- Object.prototype.isPrototypeOf():判斷當(dāng)前對(duì)象是否為另一個(gè)對(duì)象的原型。
- Object.prototype.propertyIsEnumerable():判斷某個(gè)屬性是否可枚舉。
12 Object 的實(shí)例方法和靜態(tài)方法的區(qū)別是?
13 什么是屬性描述對(duì)象?有哪些元屬性?
JavaScript 提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為“屬性描述對(duì)象”(attributes object)。每個(gè)屬性都有自己對(duì)應(yīng)的屬性描述對(duì)象,保存該屬性的一些元信息。
14 如何拷貝對(duì)象?有哪些坑?如何避免?
有時(shí),我們需要將一個(gè)對(duì)象的所有屬性,拷貝到另一個(gè)對(duì)象,可以用下面的方法實(shí)現(xiàn)。
var extend = function (to, from) {
for (var property in from) {
to[property] = from[property];
}
return to;
}
extend({}, {
a: 1
})
// {a: 1}
上面這個(gè)方法的問題在于,如果遇到存取器定義的屬性,會(huì)只拷貝值。
為了解決這個(gè)問題,我們可以通過Object.defineProperty方法來拷貝屬性。
var extend = function (to, from) {
for (var property in from) {
if (!from.hasOwnProperty(property)) continue;
Object.defineProperty(
to,
property,
Object.getOwnPropertyDescriptor(from, property)
);
}
return to;
}
extend({}, { get a(){ return 1 } })
// { get a(){ return 1 } })
15 如何控制對(duì)象的狀態(tài)?
有時(shí)需要凍結(jié)對(duì)象的讀寫狀態(tài),防止對(duì)象被改變。JavaScript 提供了三種凍結(jié)方法,最弱的一種是Object.preventExtensions,其次是Object.seal,最強(qiáng)的是Object.freeze。
16 數(shù)組和對(duì)象的區(qū)別和聯(lián)系?
Array是 JavaScript 的原生對(duì)象,同時(shí)也是一個(gè)構(gòu)造函數(shù),可以用它生成新的數(shù)組。
17 Array對(duì)象的作用?Array()作為構(gòu)造函數(shù)有什么缺陷?
Array對(duì)象的作用: 可以用它生成新的數(shù)組
缺陷: 不同的參數(shù)個(gè)數(shù)會(huì)導(dǎo)致不一致的行為
18 Array有哪些方法?如何把字符串?dāng)?shù)組轉(zhuǎn)換為字符串?
- Array.isArray方法返回一個(gè)布爾值,表示參數(shù)是否為數(shù)組。它可以彌補(bǔ)typeof運(yùn)算符的不足。
- valueOf方法是一個(gè)所有對(duì)象都擁有的方法,表示對(duì)該對(duì)象求值。不同對(duì)象的valueOf方法不盡一致,數(shù)組的valueOf方法返回?cái)?shù)組本身。
- toString方法也是對(duì)象的通用方法,數(shù)組的toString方法返回?cái)?shù)組的字符串形式。
- push方法用于在數(shù)組的末端添加一個(gè)或多個(gè)元素,并返回添加新元素后的數(shù)組長度。注意,該方法會(huì)改變?cè)瓟?shù)組。
var arr = [];
arr.push(1) // 1
arr.push('a') // 2
arr.push(true, {}) // 4
arr // [1, 'a', true, {}]
- pop方法用于刪除數(shù)組的最后一個(gè)元素,并返回該元素。注意,該方法會(huì)改變?cè)瓟?shù)組。
- shift()方法用于刪除數(shù)組的第一個(gè)元素,并返回該元素。注意,該方法會(huì)改變?cè)瓟?shù)組。
- unshift()方法用于在數(shù)組的第一個(gè)位置添加元素,并返回添加新元素后的數(shù)組長度。注意,該方法會(huì)改變?cè)瓟?shù)組。
- join()方法以指定參數(shù)作為分隔符,將所有數(shù)組成員連接為一個(gè)字符串返回。如果不提供參數(shù),默認(rèn)用逗號(hào)分隔。
- concat方法用于多個(gè)數(shù)組的合并。它將新數(shù)組的成員,添加到原數(shù)組成員的后部,然后返回一個(gè)新數(shù)組,原數(shù)組不變。
- reverse方法用于顛倒排列數(shù)組元素,返回改變后的數(shù)組。注意,該方法將改變?cè)瓟?shù)組。
- slice()方法用于提取目標(biāo)數(shù)組的一部分,返回一個(gè)新數(shù)組,原數(shù)組不變。
- splice()方法用于刪除原數(shù)組的一部分成員,并可以在刪除的位置添加新的數(shù)組成員,返回值是被刪除的元素。注意,該方法會(huì)改變?cè)瓟?shù)組。
- sort方法對(duì)數(shù)組成員進(jìn)行排序,默認(rèn)是按照字典順序排序。排序后,原數(shù)組將被改變。
- map()方法將數(shù)組的所有成員依次傳入?yún)?shù)函數(shù),然后把每一次的執(zhí)行結(jié)果組成一個(gè)新數(shù)組返回
- forEach()方法與map()方法很相似,也是對(duì)數(shù)組的所有成員依次執(zhí)行參數(shù)函數(shù)。但是,forEach()方法不返回值,只用來操作數(shù)據(jù)。這就是說,如果數(shù)組遍歷的目的是為了得到返回值,那么使用map()方法,否則使用forEach()方法。
- filter()方法用于過濾數(shù)組成員,滿足條件的成員組成一個(gè)新數(shù)組返回。
- some方法是只要一個(gè)成員的返回值是true,則整個(gè)some方法的返回值就是true,否則返回false。
- every方法是所有成員的返回值都是true,整個(gè)every方法才返回true,否則返回false。
- reduce方法和reduceRight方法依次處理數(shù)組的每個(gè)成員,最終累計(jì)為一個(gè)值。它們的差別是,reduce是從左到右處理(從第一個(gè)成員到最后一個(gè)成員),reduceRight則是從右到左(從最后一個(gè)成員到第一個(gè)成員),其他完全一樣。
- indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-1。
- lastIndexOf方法返回給定元素在數(shù)組中最后一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-1。
// 字符串?dāng)?shù)組轉(zhuǎn)換為字符串
var arr = [1, 2, 3];
arr.toString() // "1,2,3"
19 如何理解數(shù)組的鏈?zhǔn)绞褂茫?/h6>
例如需求為:先產(chǎn)生一個(gè)所有 Email 地址組成的數(shù)組,然后再過濾出以t開頭的 Email 地址,最后將它打印出來。
var users = [
{name: 'tom', email: 'tom@example.com'},
{name: 'peter', email: 'peter@example.com'}
];
users
.map(function (user) {
return user.email;
})
.filter(function (email) {
return /^t/.test(email);
})
.forEach(function (email) {
console.log(email);
});
// "tom@example.com"
20 如何理解包裝對(duì)象?都有哪些?
所謂“包裝對(duì)象”,指的是與數(shù)值、字符串、布爾值分別相對(duì)應(yīng)的Number、String、Boolean三個(gè)原生對(duì)象。這三個(gè)原生對(duì)象可以把原始類型的值變成(包裝成)對(duì)象。
21 JS還有哪些常用的工具對(duì)象?都有哪些坑?
- Math是 JavaScript 的原生對(duì)象,提供各種數(shù)學(xué)功能。該對(duì)象不是構(gòu)造函數(shù),不能生成實(shí)例,所有的屬性和方法都必須在Math對(duì)象上調(diào)用。
- Date對(duì)象是 JavaScript 原生的時(shí)間庫。
- RegExp對(duì)象提供正則表達(dá)式的功能。
- JSON 對(duì)象是一種用于數(shù)據(jù)交換的文本格式,目的是取代繁瑣笨重的 XML 格式。