专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

深入剖析数组面试题

两个空数组相加结果为何是空字符串

显然,两个空数组都转化为了空字符串。

Q1:为何会转换为字符串? Object.prototype.toString() toString()方法返回一个表示该对象的字符串。

49_1.png

数组本来就是对象,然而b转成了”[object Object]”c却是””

A:数组的默认toString()方法经过了重新定义,将所有的字符串化以后再用“,”连接起来

let a = [1,2,3]
a.toString() // "1,2,3"
let b = [[1,2],[3,4],[5,[6,7]]]
// "1,2,3,4,5,6,7"

Q2: 为何是强制转换为string而不是number或其他?

A:

49_2.png

因为Array没有toNumber方法。 同样Object也没有

49_3.png

另外需要注意的是使用Object.create(null) 创建的对象原型属性为null,并且没有valueOf()和toString()方法,因此无法进行强制类型转换。

如何判断是数组

instanceof

检测对象的原型链是否指向构造函数的prototype对象的

let a = []
a instanceof Array //true

对象的constructor属性

a.constructor === Array

可参考第二张图片

但是跨frame实例化的对象彼此是不共享原型链的

Object.prototype.toString()

[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这 个方法,再配合call,我们可以取得任何对象的内部属性[[Class]]。

参考第一张图片

Array.isArray()

用于确定传递的值是否是一个Array.

当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测iframes.

Polifill

假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

当然也可以不创建,如下测试:

if (typeof Array.isArray === "function") {
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}

数组扁平化

参考第一段示例代码 可知调用 arr.toString()

ES6 数组的扩展 flat(), flatMap()

数组的方法

数组的方法

不改变原数组(8个)

ES5:

join, toLocaleString, toString, slice, concat, indexOf, lastIndexOf

ES6:

includes

改变原数组(9个)

ES5:

splice, sort, pop, shift, push, unshift, reverse

ES6:

copyWithin, fill

遍历方法(12个)

ES5:

forEach, every, some, filter, map, reduce, reduceRight

ES6:

find, findIndex, keys, values, entries

49_4.png

文章永久链接:https://tech.souyunku.com/31771

未经允许不得转载:搜云库技术团队 » 深入剖析数组面试题

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们