`
xhload3d
  • 浏览: 208414 次
社区版块
存档分类
最新评论

JS数组追加数组采用push.apply的坑

阅读更多

JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时才遇到了坑。

1
2
3
a = new Array();    
b = new Array(125624);                    
a.push.apply(a, b);

以上的代码在mac的chrome下抛出了如下的异常

1
Uncaught RangeError: Maximum call stack size exceeded

如果把数组改为b = new Array(125623);小一个元素居然就好了,测试了一下其他浏览器也都有大数组才出错的问题,但不同浏览器临界值还各异。

搜索了http://stackoverflow.com/questions/1374126/how-to-append-an-array-to-an-existing-javascript-array/17368101#17368101 发现也有人遇到这样的坑:

1
2
3
4
Array.prototype.extend = function (other_array) {
    /* you should include a test to check whether other_array really is an array */
    other_array.forEach(function(v) {this.push(v)}, this);   
}

给出的建议是老老实实用forEach,不仅可以避免大数组的异常问题,并且从性能角度考虑forEach也是最快的

这个小坑给了我两点思考:

1、有些花哨的用法如a.push.apply(a, b);还是用于面试题装逼就行,实战上还是多走老实路线免得遇到异常和性能的坑,例如小数量的如这篇的这个几十个节点的3D网络拓扑弹簧布局例子玩玩倒是没问题,遇到真正大数据量如这篇中的HT for Web的这个3D大数据量性能例子才能考验出问题。

2、http://stackoverflow.com/questions/1374126 从stackoverflow找答案时不要仅盯着投票最多的,真理往往掌握在少数人手中,下图259票的回答是个坑,34票的才是最完美的分析:

 

2
1
分享到:
评论

相关推荐

    关于JS数组追加数组采用push.apply的问题

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时才遇到了坑。

    JavaScript数组合并的多种方法_.docx

    最后,可以利用Array的push()和unshift()方法的apply(),一次性将数组b的元素添加到a或b中,这样避免了循环,提高了效率。 ```javascript // b 追加到 a a.push.apply(a, b); // 或者 a 插入到 b b.unshift.apply...

    js实现以最简单的方式将数组元素添加到对象中的方法

    结合起来,可以利用数组的push方法,并通过apply方法将对象作为当前的上下文(this),实现将数组的元素添加到对象中。代码如下: ```javascript var obj = {}; [].push.apply(obj, [11, 22, 33, 44, 55, 66]); ...

    js中apply方法的使用详细解析.docx

    同样,当需要将数组中的元素逐个添加到另一个数组尾部时,可以使用`Array.prototype.push.apply(arr1, arr2)`,而不是手动地遍历数组进行追加,这同样提高了性能。 3. **使用`apply`进行函数调用** 除了在继承场景...

    使用不同的方法结合/合并两个JS数组

    在JavaScript中,合并或结合两个数组是常见的编程需求。本文主要探讨了几种不同的方法来实现这一功能,并分析了它们的优缺点。以下是一些常用的方法: 1. **concat()** 方法: `concat()` 是最直观且最常用的方法...

    JS中的call、apply、bind方法详解.pdf

    2. 数组追加:可以使用apply方法来追加数组,例如: ```javascript var array1 = [1, 2, 3, 5]; var array2 = ["xie", "li", "qun", "tsro"]; Array.prototype.push.apply(array1, array2); console.log(array1); ...

    jQuery实现合并/追加数组并去除重复项的方法 <font color=red>原创</font>

    `push.apply()`是一个JavaScript内置方法,用于将一个数组的所有元素添加到另一个数组中,但此处是通过jQuery的`apply()`方法来实现数组合并的。 #### 应用实例 在给定的文件中,通过一个简单的HTML结构和...

    jQuery使用deferreds串行多个ajax请求

    `apply()`函数用于将数组`deferreds`作为参数传递给`$.when()`,这样`$.when()`就可以处理数组中的所有`deferred`对象。当所有请求都完成后,`done()`回调被执行,向页面添加一个表示所有任务已完成的`&lt;p&gt;`元素。 ...

    Javascript中apply、call、bind的巧妙使用

    假设我们有两个数组array1和array2,我们可以使用apply方法将array2的元素追加到array1中,如下: ```javascript var array1 = [12, "foo", { name: "Joe" }, -2458]; var array2 = ["Doe", 555, 100]; Array....

    javascript面试题汇总.pdf

    4. **数组操作方法:** push()、pop()、unshift()和shift()是JavaScript数组提供的四个基本操作方法。push()和unshift()用于在数组的末尾或开头添加新元素,而pop()和shift()则用于移除末尾或开头的元素。 5. **...

    解析JavaScript面向对象概念中的Object类型与作用域

    每一种引用类型都有其特定的属性和方法,例如Array类型的数组对象就具有push、shift、sort等方法。当使用new操作符来创建引用类型对象时,实际上是在内存中为新对象分配了一块区域,并将引用(指针)保存在变量中。 ...

Global site tag (gtag.js) - Google Analytics