/**
* 调用iteratee `n`次,每次调用返回的结果存入到数组中,iteratee调入一个参数:index
* Invokes the iteratee `n` times, returning an array of the results of each invocation.
* The iteratee is invoked with one arguments (index)
*
* @param {number} n The number of times to invoke `iteratee`
* @param {Function} [iteratee=_.identity] The function invoked per iteration.
* @returns {Array} Returns the array of results
* @example
*
* times(3, String);
* // ['0', '1', '2']
*
* times(7, value => value * 2)
* // => 0,2,4,6,8,10,12
*/
import toInteger from "./toInteger"
const MAX_ARRAY_LENGTH = 4294967295 //Used as references for the maximum length and index of an array
function baseTimes(n, iteratee) {
let index = -1,
result = Array(n)
while (++index < n) {
result[index] = iteratee(index)
}
return result
}
function times(n, iteratee) {
n = toInteger(n)
if (n < 1 || n > Number.MAX_SAFE_INTEGER) {
return []
}
const length = Math.min(n, MAX_ARRAY_LENGTH)
return baseTimes(length, iteratee)
}
export default times
/**
* 转换value为整数
* Converts `value` to an integer.
*
* @param {*} value The value to convert.
* @returns {number} Returns the converted integer.
* @example
*
* toInteger(3.3)
* // => 3
*
* toInteger('3.3')
* // => 3
*
* toInteger(Number.MIN_VALUE)
* // => 0
*
* toInteger(Infinity)
* // => 1.7976931348623157e+308
*
* toInteger(-3.3)
* // => -3
*
* toInteger(new Date())
* // => 1561453581720
*
* toInteger(() => {})
* // => 0
*/
const NAN = 0 / 0
const INFINITY = 1 / 0
const symbolTag = "[object Symbol]"
const MAX_INTEGER = Number.MAX_VALUE || 1.7976931348623157e308
function isObjectLike(value) {
return typeof value == "object" && value !== null
}
function isSymbol(value) {
return (
typeof value === "symbol" ||
(isObjectLike(value) && Object.prototype.toString.call(value) === symbolTag)
)
}
function toNumber(value) {
if (typeof value === "number") {
return value
}
if (isSymbol(value)) {
return NAN
}
return Number(value)
}
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0
}
value = toNumber(value)
if (value === INFINITY || value === -INFINITY) {
var sign = value < 0 ? -1 : 1 //可用Math.sign代替
return sign * MAX_INTEGER
}
return value === value ? value : 0 //NaN 不等于 NaN
}
function toInteger(value) {
var result = toFinite(value)
var remainder = result % 1
return result === result ? (remainder ? result - remainder : result) : 0 //可用Math.trunc代替
}
export default toInteger