function keysIn(object) {
      if (object == null) {
        return [];
      }
      if (!isObject(object)) {
        object = Object(object);
      }
      var length = object.length,
          support = lodash.support;

      length = (typeof length == 'number' && length > 0 &&
        (isArray(object) || (support.nonEnumStrings && isString(object)) ||
          (support.nonEnumArgs && isArguments(object))) && length) || 0;

      var Ctor = object.constructor,
          index = -1,
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto,
          isProto = proto === object,
          result = Array(length),
          skipIndexes = length > 0,
          skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),
          skipProto = support.enumPrototypes && typeof object == 'function';

      while (++index < length) {
        result[index] = String(index);
      }
      // Lo-Dash skips the `constructor` property when it infers it is iterating
      // over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
      // attribute of an existing property and the `constructor` property of a
      // prototype defaults to non-enumerable
      for (var key in object) {
        if (!(skipProto && key == 'prototype') &&
            !(skipErrorProps && (key == 'message' || key == 'name')) &&
            !(skipIndexes && isIndex(key, length)) &&
            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
          result.push(key);
        }
      }
      if (support.nonEnumShadows && object !== objectProto) {
        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),
            nonEnums = nonEnumProps[className] || nonEnumProps[objectClass];

        if (className == objectClass) {
          proto = objectProto;
        }
        length = shadowedProps.length;
        while (length--) {
          key = shadowedProps[length];
          var nonEnum = nonEnums[key];
          if (!(isProto && nonEnum) &&
              (nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {
            result.push(key);
          }
        }
      }
      return result;
    }
Creates an array of the own and inherited enumerable property names of `object`.

@static
@memberOf _
@category Object
@param {Object} object The object to inspect.
@returns {Array} Returns the array of property names.
@example

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.z = 0;

_.keysIn(new Shape);
// => ['x', 'y', 'z'] (iteration order is not guaranteed)