function deepHasProp( value, path, options ) {
	var isStr;
	var props;
	var opts;
	var err;

	isStr = isString( path );
	if ( !isStr && !isArray( path ) ) {
		throw new TypeError( format( 'invalid argument. Key path must be a string or a key array. Value: `%s`.', path ) );
	}
	opts = defaults();
	if ( arguments.length > 2 ) {
		err = validate( opts, options );
		if ( err ) {
			throw err;
		}
	}
	if ( value === void 0 || value === null ) {
		return false;
	}
	if ( isStr ) {
		props = path.split( opts.sep );
	} else {
		props = path;
	}
	return has( value, props );
}
Tests whether an object contains a nested key path, either own or inherited.

@param {*} value - value to test
@param {(string|Array)} path - key path
@param {Options} [options] - function options
@param {string} [options.sep='.'] - key path separator
@throws {TypeError} second argument must be a string or key array
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@returns {boolean} boolean indicating whether an object has a nested property

@example
function Foo() {
    return this;
}
Foo.prototype.b = {
    'c': 'd'
};

var obj = {
    'a': new Foo()
};

var bool = deepHasProp( obj, 'a.b.c' );
// returns true

@example
var arr = [
    {
        'a': [
            {
                'b': [
                    { 'c': 'd' },
                    { 'e': 'f' }
                ]
            }
        ]
    }
];
var bool = deepHasProp( arr, '0.a.0.b.0.c' );
// returns true

@example
var obj = { 'a': { 'b': { 'c': 'd' } } };
var bool = deepHasProp( obj, [ 'a', 'b', 'c' ] );
// returns true

@example
var obj = { 'a': { 'b': { 'c': 'd' } } };
var bool = deepHasProp( obj, 'a/b/c', {
    'sep': '/'
});
// returns true