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票的才是最完美的分析:

时间: 2024-08-28 14:13:25

JS数组追加数组采用push.apply的坑(转)的相关文章

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

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.qidian

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

JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这样的自以为非常酷的,不须要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个非常大的数组时才遇到了坑. 1 a = new Array();      2 b = new Array(125624);                      3 a.push.apply(a, b); 以上的代码在mac的chrome下抛出了例如以下的异常 1 Uncaught RangeErro

PHP 合并数组 追加数组例子

PHP合并数组我们可以使用array_merge()函数,array_merge()函数返回一个联合的数组.所得到的数组以第一个输入数组参数开始,按后面数组参数出现的顺序依次追加.其形式为: array array_merge (array array1 array2…,arrayN) 下面是一个PHP合并数组的例子: <?php $fruits = array("apple","banana","pear"); $numbered = a

js类数组转数组的方法(ArrayLike)

1. 什么是类数组ArrayLike 拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解) 不具有数组所具有的方法 //类数组示例 var a = {'1':'gg','2':'love','4':'meimei',length:5}; Array.prototype.join.call(a,'+');//'+gg+love++meimei' //非类数组示例 var c = {'1':2}; //没有length属性就不是类数

JavaScript学习-js中的数组/Boolean类/字符串String类

JavaScript学习 [js中的数组] 1.数组的概念:是在内存中连续储存对个有序元素的结构 元素的顺序称为下标,通过下标查找对象元素. 2.数组的声明: ① 字面量声明:var arr1 = []; js中,同一数组,可以储存多种不同的数据类型: 例如: var arr1 = [1,"2",true,{"name":"hahhah"},[1,2]] ② new关键字声明: var arr2 = new Arry(参数) >>&g

JS中的数组与对象

一.数组: 1.数组的基本慨念:       数组是在内存空间中连续存储的一组有序数据的集合      元素在数组中的顺序,成为下标.可以使用下标访问数组的每个元素 2.如何声明一个数组     ① 使用字面量声明:       在JS中,同一数组,可以存储各种数据类型        例如:var reg = [1,"换个影子",true,{},null,func];  //调用数组中的函数:reg[5]();     ②  使用new关键字声明: var reg = new Arra

JS Jquery去除数组重复元素

js jquery去除数组中的重复元素 第一种:$.unique() 第二种: for(var i = 0,len = totalArray_line.length;i < len;i++) { !RegExp(totalArray_line[i],"g").test(resultArray_line.join(",")) && (resultArray_line.push(totalArray_line[i])); }-----解决了V0.2

JS中关于数组的内容

  前  言 LIUWE 在网站制作过程中,数组可以说是起着举足轻重的地位.今天就给大家介绍一下数组的一些相关内容.例如:如何声明一个数组和在网站制作过程中我们常用的一些数组的方法.介绍的不好还请多多包涵... 首先我们应该先了解一下什么是数组,数组的基本概念是什么? 1.定义:数组是在内存空间中连续存储的一组有序数据的集合. 2.元素在数组的顺序为下标,可以使用下标访问数组的每一个元素. 一.如何声明一个数组? 1.使用字面量声明: var arr=[]; //声明了一个空的数组 2.使用ne

js基础复习---数组操作

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="keywords" content="js数组操作"> <meta name="description" content="js基础之数组api练习"> <title