40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
![]() |
var baseTimes = require('./_baseTimes'),
|
||
|
isArguments = require('./isArguments'),
|
||
|
isArray = require('./isArray'),
|
||
|
isIndex = require('./_isIndex');
|
||
|
|
||
|
/** Used for built-in method references. */
|
||
|
var objectProto = Object.prototype;
|
||
|
|
||
|
/** Used to check objects for own properties. */
|
||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
||
|
|
||
|
/**
|
||
|
* Creates an array of the enumerable property names of the array-like `value`.
|
||
|
*
|
||
|
* @private
|
||
|
* @param {*} value The value to query.
|
||
|
* @param {boolean} inherited Specify returning inherited property names.
|
||
|
* @returns {Array} Returns the array of property names.
|
||
|
*/
|
||
|
function arrayLikeKeys(value, inherited) {
|
||
|
// Safari 8.1 makes `arguments.callee` enumerable in strict mode.
|
||
|
// Safari 9 makes `arguments.length` enumerable in strict mode.
|
||
|
var result = (isArray(value) || isArguments(value))
|
||
|
? baseTimes(value.length, String)
|
||
|
: [];
|
||
|
|
||
|
var length = result.length,
|
||
|
skipIndexes = !!length;
|
||
|
|
||
|
for (var key in value) {
|
||
|
if ((inherited || hasOwnProperty.call(value, key)) &&
|
||
|
!(skipIndexes && (key == 'length' || isIndex(key, length)))) {
|
||
|
result.push(key);
|
||
|
}
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
module.exports = arrayLikeKeys;
|