function Slice() {
	var nargs;
	var start;
	var stop;
	var step;

	nargs = arguments.length;
	if ( nargs === 0 ) {
		start = null;
		stop = null;
		step = null;
	} else if ( nargs === 1 ) {
		start = null;
		stop = arguments[ 0 ];
		step = null;
	} else if ( nargs === 2 ) {
		start = arguments[ 0 ];
		stop = arguments[ 1 ];
		step = null;
	} else {
		start = arguments[ 0 ];
		stop = arguments[ 1 ];
		step = arguments[ 2 ];
	}
	if ( !( this instanceof Slice ) ) {
		return new Slice( start, stop, step );
	}
	if ( !isValid( start ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an integer, null, or undefined. Value: `%s`.', start ) );
	}
	if ( !isValid( stop ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be an integer, null, or undefined. Value: `%s`.', stop ) );
	}
	if ( !isValid( step ) ) {
		throw new TypeError( format( 'invalid argument. Third argument must be an integer, null, or undefined. Value: `%s`.', step ) );
	} else if ( step === 0 ) {
		throw new RangeError( format( 'invalid argument. Third argument cannot be zero. Value: `%s`.', step ) );
	}
	this._start = ( start === void 0 ) ? null : start;
	this._stop = ( stop === void 0 ) ? null : stop;
	this._step = ( step === void 0 ) ? null : step;
	return this;
}
Slice constructor.

@constructor
@param {(integer|null|void)} [start] - starting index (inclusive)
@param {(integer|null|void)} stop - ending index (exclusive)
@param {(integer|null|void)} [step] - index increment
@throws {TypeError} first argument must be an integer, null, or undefined
@throws {TypeError} second argument must be an integer, null, or undefined
@throws {TypeError} third argument must be an integer, null, or undefined
@throws {RangeError} third argument cannot be zero
@returns {Slice} Slice instance

@example
var s = new Slice( 10 );
// returns <Slice>

var start = s.start;
// returns null

var stop = s.stop;
// returns 10

var step = s.step;
// returns null

@example
var s = new Slice( 3, 10 );
// returns <Slice>

var start = s.start;
// returns 3

var stop = s.stop;
// returns 10

var step = s.step;
// returns null

@example
var s = new Slice( 3, 10, 2 );
// returns <Slice>

var start = s.start;
// returns 3

var stop = s.stop;
// returns 10

var step = s.step;
// returns 2