JS數組追加數組沒有現成的函數,這麼多年我已經習慣了a.push.apply(a, b);這種自覺得很酷的,不須要寫for循環的寫法,一直也沒遇到什麼問題,直到今天我要append的b是個很大的數組時才遇到了坑。javascript
a = new Array(); b = new Array(125624); a.push.apply(a, b);
以上的代碼在mac的chrome下拋出了以下的異常html
Uncaught RangeError: Maximum call stack size exceeded
若是把數組改成b = new Array(125623);小一個元素竟然就行了,測試了一下其餘瀏覽器也都有大數組纔出錯的問題,但不一樣瀏覽器臨界值還各異。java
搜索了http://stackoverflow.com/questions/1374126/how-to-append-an-array-to-an-existing-javascript-array/17368101#17368101 發現也有人遇到這樣的坑:面試
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也是最快的chrome
這個小坑給了我兩點思考:數組
一、有些花哨的用法如a.push.apply(a, b);仍是用於面試題裝逼就行,實戰上仍是多走老實路線省得遇到異常和性能的坑,例如小數量的如基於hightopo的這篇幾十個節點的3D網絡拓撲彈簧佈局例子玩玩卻是沒問題,遇到真正大數據量如《基於HTML5的電信網管3D機房監控應用》中的HT for Web的這個3D大數據量性能例子才能考驗出問題。瀏覽器
二、http://stackoverflow.com/questions/1374126 從stackoverflow找答案時不要僅盯着投票最多的,真理每每掌握在少數人手中,下圖259票的回答是個坑,34票的纔是最完美的分析:網絡