[].concat(arr) 和 Array.prototype.concat.apply([], arr)有区别吗?

来源:18-12 面试讲解-11:数组去重有几种方式?

Brannua

2020-05-04

  • 老师好~
  • 我尝试使用[].concat(arr)拍平数组,结果栈溢出
  • Array.prototype.concat.apply([], arr) 是可以正常拍平数组的
  • 这两种写法有区别吗?
写回答

3回答

双越

2020-05-05

这俩结果完全就不一样。

Array.prototype.concat.apply([], [10, [100,200]]) // [10, 100, 200]
[].concat([10, [100,200]]) // [10, [100,200]]


1
7
双越
回复
Brannua
这个问题我不太理解,该用 apply 就用了呗。这也不是有几种方案,你选择了一种,然后说说为何选择这一种,怎么对比考虑的。不理解他问这个是啥意思。其实你也不用管他,自己搞懂这个问题的细节就可以了。
2020-05-12
共7条回复

Brannua

提问者

2020-05-05

- 老师我明白apply是改变this指向,下面这种写法会报错栈溢出,但是```[].concat.apply([], arr)```是好用的,问题是```[].concat(arr)```这样写,concat是```[]```调用的,那this本身不就应该指向```[]```了吗,为什么还要用apply再让this指向[]

```js

function flat(arr) {

    const isDeep = arr.some(item => item instanceof Array)

    if (!isDeep) {

        return arr

    }

    // const res = Array.prototype.concat.apply([], arr)

    const res = [].concat(arr)

    return flat(res)

}

```

0
0

双越

2020-05-04

把你报错的代码发出来,我看下。

0
0

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程