请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答 回答被采纳积分+3

3回答

双越 2020-05-05 17:48:13

这俩结果完全就不一样。

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


1 回复 有任何疑惑可以回复我~
  • 提问者 Brannua #1
    concat是链接数组返回新数组的方法,老师您这两行代码我读着感觉都像是把 [] 和 [10, [20, 30]] 拼接起来,不明白您这两行代码执行结果怎么来的,能麻烦您解读下这两行代码嘛,太好奇了。。
    回复 有任何疑惑可以回复我~ 2020-05-05 21:52:23
  • 双越 回复 提问者 Brannua #2
    给你一个提示, Array.prototype.concat.call([], [10, [100,200]]) 结果和 [].concat([10, [100,200]]) 一样。即用 call 结果一样,而用 apply 结果就不一样。可以从 call 和 apply 的区别上,想一想。
    回复 有任何疑惑可以回复我~ 2020-05-05 22:01:38
  • 提问者 Brannua 回复 双越 #3
    啊!传参不同!apply第二个参数是个数组或类数组,那么这也就解释了为什么只能拍平一层,层级更深就不行了,我好像明白了!谢谢老师嘿嘿~
    回复 有任何疑惑可以回复我~ 2020-05-05 22:09:33
提问者 Brannua 2020-05-05 12:40:29

- 老师我明白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 回复 有任何疑惑可以回复我~
双越 2020-05-04 20:33:14

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信