1var baseTimes = require('./_baseTimes'), 2 isArguments = require('./isArguments'), 3 isArray = require('./isArray'), 4 isBuffer = require('./isBuffer'), 5 isIndex = require('./_isIndex'), 6 isTypedArray = require('./isTypedArray'); 7 8/** Used for built-in method references. */ 9var objectProto = Object.prototype; 10 11/** Used to check objects for own properties. */ 12var hasOwnProperty = objectProto.hasOwnProperty; 13 14/** 15 * Creates an array of the enumerable property names of the array-like `value`. 16 * 17 * @private 18 * @param {*} value The value to query. 19 * @param {boolean} inherited Specify returning inherited property names. 20 * @returns {Array} Returns the array of property names. 21 */ 22function arrayLikeKeys(value, inherited) { 23 var isArr = isArray(value), 24 isArg = !isArr && isArguments(value), 25 isBuff = !isArr && !isArg && isBuffer(value), 26 isType = !isArr && !isArg && !isBuff && isTypedArray(value), 27 skipIndexes = isArr || isArg || isBuff || isType, 28 result = skipIndexes ? baseTimes(value.length, String) : [], 29 length = result.length; 30 31 for (var key in value) { 32 if ((inherited || hasOwnProperty.call(value, key)) && 33 !(skipIndexes && ( 34 // Safari 9 has enumerable `arguments.length` in strict mode. 35 key == 'length' || 36 // Node.js 0.10 has enumerable non-index properties on buffers. 37 (isBuff && (key == 'offset' || key == 'parent')) || 38 // PhantomJS 2 has enumerable non-index properties on typed arrays. 39 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || 40 // Skip index properties. 41 isIndex(key, length) 42 ))) { 43 result.push(key); 44 } 45 } 46 return result; 47} 48 49module.exports = arrayLikeKeys; 50