String.prototype.split and its `limit` argument

July 28, 2015 ยท View on GitHub

String.prototype.split ( separator, limit )

Splits the receiver at separator, returns an Array of at most limit segments.

ES5 (15.5.4.14.5): If limit is undefined, let lim = 232-1; else let lim = ToUint32(limit).

ES6 (21.1.3.17.8): If limit is undefined, let lim = 253-1; else let lim = ToLength(limit).

Two problems

  • Return value is an Array, so a limit greater than 232-1 would result in a "malformed" array (one with elements past the end of the array). Iteration over the return value will skip all such elements.
  • Behavior changes for negative limit: ToUint32 transforms -1 to 232-1; ToLength instead transforms -1 to 0.

Proposal

Revert this spec change. Existing implementations still match ES5, and the old behavior still makes sense (even with ES6's longer String length limit).