Sorry couldn't help myself :)
The following function handles a few more scenarios and does this with only 2 slices.
// standard
slice2( [1,2,3,4,5], 3, 3 ); // [1, 4, 5]
// specify chunk as a negative number
slice2( [1,2,3,4,5], -3, 3 ); // [1, 2, 3]
// what if chunk is larger than array
slice2( [1,2,3,4,5], -7, 3 ); // [1, 2, 3, 4, 5]
// what if chunk is 0
slice2( [1,2,3,4,5], 0, 3 ); // []
function slice2( array, chunk, offset ) {
var start1, len = array.length, end1, start2, end2, result;
if( !chunk || !array ) return []; // if chunk or array resolve to falsy value.
if( Math.abs(chunk) >= len ) return array;
if( chunk < 0 ) {
end1 = offset;
leftover = offset + chunk;
start1 = leftover < 0 ? 0 : leftover;
start2 = leftover;
end2 = len;
} else {
start1 = offset;
leftover = ( offset + chunk ) - len;
end1 = leftover > 0 ? ( offset + chunk ) : len;
start2 = 0;
end2 = leftover;
}
result = array.slice( start1, end1 );
if( leftover ) result = array.slice( start2, end2 ).concat( result );
return result;
}
Fiddle here