第四次:标准库参考问题

学习教材为:https://wangdoc.com/javascript/stdlib/index.html

1 JavaScript 的内置对象有哪些?

JavaScript 的所有其他对象都继承自Object对象,即那些对象都是Object的实例。
Object对象的原生方法分成两类:Object本身的方法与Object的实例方法。

2 如何区分Object本身的方法与Object的实例方法?
  • Object对象本身的方法:就是直接定义在Object对象的方法。
  • Object的实例方法:就是定义在Object原型对象Object.prototype上的方法。它可以被Object实例直接使用。
// Object对象本身的方法
Object.print = function (o) { console.log(o) };
// Object的实例方法
Object.prototype.print = function () {
  console.log(this);
};

var obj = new Object();
obj.print() // Object
3 如何理解Object本身是一个函数?

因为Object可以将任意值转为对象,它具备函数的功能,例如:

4 Object方法如何处理参数是原始类型的值?

如果参数是原始类型的值,Object方法将其转为对应的包装对象的实例

var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true

instanceof运算符用来验证,一个对象是否为指定的构造函数的实例。obj instanceof Object返回true,就表示obj对象是Object的实例。

5 Object方法的参数是一个对象,会返回什么?

如果Object方法的参数是一个对象,它总是返回该对象,即不用转换。

var value = {};
var obj = Object(value) // 返回原对象
obj === value // true
6 Object作为构造函数,有什么作用?
  • 直接通过它来生成新对象。
  • 可以接受一个参数,如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象
7 什么是Object 的静态方法?

所谓“静态方法”,是指部署在Object对象自身的方法。

8 有哪些方法可以遍历对象的属性?
  • Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。
var obj = {
  p1: 123,
  p2: 456
};

Object.keys(obj) 
// ["p1", "p2"]
  • Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。
var obj = {
  p1: 123,
  p2: 456
};

Object.getOwnPropertyNames(obj)
// ["p1", "p2"]
9 什么是不可枚举的属性?
  • 可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性。对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true。但是对于通过 Object.defineProperty等定义的属性,该标识值默认为 false。
  • 其中js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等。
  • 可枚举的属性可以通过[for...in]循环进行遍历(除非该属性名是一个Symbol,或者通过Object.keys()方法返回一个可枚举属性的数组。
10 对象中原型链相关方法有哪些?
  • Object.create():该方法可以指定原型对象和属性,返回一个新的对象。
  • Object.getPrototypeOf():获取对象的Prototype对象。
11 Object 的实例方法有哪些?
  • Object.prototype.valueOf():返回当前对象对应的值。
  • Object.prototype.toString():返回当前对象对应的字符串形式。
  • Object.prototype.toLocaleString():返回当前对象对应的本地字符串形式。
  • Object.prototype.hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
  • Object.prototype.isPrototypeOf():判断当前对象是否为另一个对象的原型。
  • Object.prototype.propertyIsEnumerable():判断某个属性是否可枚举。
12 Object 的实例方法和静态方法的区别是?
13 什么是属性描述对象?有哪些元属性?

JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。

14 如何拷贝对象?有哪些坑?如何避免?

有时,我们需要将一个对象的所有属性,拷贝到另一个对象,可以用下面的方法实现。

var extend = function (to, from) {
  for (var property in from) {
    to[property] = from[property];
  }

  return to;
}

extend({}, {
  a: 1
})
// {a: 1}

上面这个方法的问题在于,如果遇到存取器定义的属性,会只拷贝值。
为了解决这个问题,我们可以通过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 如何控制对象的状态?

有时需要冻结对象的读写状态,防止对象被改变。JavaScript 提供了三种冻结方法,最弱的一种是Object.preventExtensions,其次是Object.seal,最强的是Object.freeze。

16 数组和对象的区别和联系?

Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。

17 Array对象的作用?Array()作为构造函数有什么缺陷?

Array对象的作用: 可以用它生成新的数组
缺陷: 不同的参数个数会导致不一致的行为

18 Array有哪些方法?如何把字符串数组转换为字符串?
  • Array.isArray方法返回一个布尔值,表示参数是否为数组。它可以弥补typeof运算符的不足。
  • valueOf方法是一个所有对象都拥有的方法,表示对该对象求值。不同对象的valueOf方法不尽一致,数组的valueOf方法返回数组本身。
  • toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。
  • push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。
var arr = [];

arr.push(1) // 1
arr.push('a') // 2
arr.push(true, {}) // 4
arr // [1, 'a', true, {}]
  • pop方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组。
  • shift()方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组。
  • unshift()方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。
  • join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。
  • concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。
  • reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。
  • slice()方法用于提取目标数组的一部分,返回一个新数组,原数组不变。
  • splice()方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。
  • sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
  • map()方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回
  • forEach()方法与map()方法很相似,也是对数组的所有成员依次执行参数函数。但是,forEach()方法不返回值,只用来操作数据。这就是说,如果数组遍历的目的是为了得到返回值,那么使用map()方法,否则使用forEach()方法。
  • filter()方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
  • some方法是只要一个成员的返回值是true,则整个some方法的返回值就是true,否则返回false。
  • every方法是所有成员的返回值都是true,整个every方法才返回true,否则返回false。
  • reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。
  • indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。
  • lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。
// 字符串数组转换为字符串
var arr = [1, 2, 3];
arr.toString() // "1,2,3"
19 如何理解数组的链式使用?

例如需求为:先产生一个所有 Email 地址组成的数组,然后再过滤出以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 如何理解包装对象?都有哪些?

所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。

21 JS还有哪些常用的工具对象?都有哪些坑?
  • Math是 JavaScript 的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。
  • Date对象是 JavaScript 原生的时间库。
  • RegExp对象提供正则表达式的功能。
  • JSON 对象是一种用于数据交换的文本格式,目的是取代繁琐笨重的 XML 格式。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容