第四次:標(biāo)準(zhǔn)庫參考問題

學(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 格式。
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 學(xué)習(xí)教材為:https://wangdoc.com/javascript/stdlib/index.html[ht...
    空無一碼閱讀 177評(píng)論 0 0
  • 數(shù)據(jù)類型 數(shù)據(jù)類型 基本類型 Boolean,object, number, null, undefined, s...
    zanezz閱讀 239評(píng)論 0 1
  • 一.數(shù)組 1.數(shù)組的定義 格式:1.數(shù)組存儲(chǔ)的數(shù)據(jù)類型[] 數(shù)組名字;2.數(shù)組存儲(chǔ)的數(shù)據(jù)類型 數(shù)組名字[]; 方式...
    小超_0749閱讀 445評(píng)論 0 0
  • 學(xué)習(xí)教材為:https://wangdoc.com/javascript/types/index.html[htt...
    空無一碼閱讀 173評(píng)論 0 0
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,519評(píng)論 2 7

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