Description
When V8 is enabled, Array.apply
has the limitation for the number of elements. When it is over the limitation, an error like RangeError: Maximum call stack size exceeded
occurs, while the issue didn’t occur when V8 is disabled. In this case, this issue occurs at both Google Apps Script and Javascript. So please be careful this.
Sample situation
For example, when Array.prototype.push.apply
is used for combining the arrays because the process cost of Array.prototype.push.apply
is lowest of 3 patterns of Array.prototype.push.apply
, Spread syntax
and concat
, please be careful above issue. Ref
Please see the following script.
let ar1 = [];
const ar2 = Array(125859).fill("sample");
Array.prototype.push.apply(ar1, ar2);
When above script is run, the error of RangeError: Maximum call stack size exceeded
occurs at Array.prototype.push.apply(ar1, ar2);
. But when const r = Array(125858).fill("sample");
is used, no error occurs. On the other hand, the following script is used, no error occurs.
let ar1 = Array(1000000).fill("sample");
const ar2 = Array(125858).fill("sample");
Array.prototype.push.apply(ar1, ar2);
Summary
From above sample scripts, when the array is combined using Array.prototype.push.apply(ar1, ar2)
, it is found the following points.
- When you want to combine the array with the small size (for example, it’s in the for loop.) with V8,
Array.prototype.push.apply
is suitable. - When you want to combine the array with the large size is combined with V8,
Spread syntax
is suitable. - When you want to combine the array with the large size (for example, it’s in the for loop.) without V8,
Array.prototype.push.apply
is suitable. - When you want to combine the array with the large size (for example, it’s in the for loop.) with and without V8,
concat
is suitable.
References
- “RangeError: Maximum call stack size exceeded” Why?
- Benchmark: Process Costs under V8 using Google Apps Script