/**
* 产生一个包括lower与upper之间的数,如果只提供一个参数返回一个0到提供数之间的数,
* 如果floating设为true,或者lower或upper是浮点数,结果返回浮点数
* @param {number} [lower=0] The lower bound
* @param {number} [upper=1] The upper bound
* @param {boolean} [floating] Specify returning a floating-point number
* @returns {number} Returns the random number
* @example
* random(0, 5)
* // => 4
* random(5)
* // => 4
* random(5, true)
* // => 0.8052893417552531
* random(1.2, 5.2)
* // => 3.6806335209871657
*/
import toFinite from "./toFinite"
function baseRandom(lower, upper) {
return lower + Math.floor(Math.random() * (upper - lower + 1))
}
function random(lower, upper, floating) {
if (floating === undefined) {
if (typeof upper === "boolean") {
floating = upper
upper = undefined
} else if (typeof lower === "boolean") {
floating = lower
lower = undefined
}
}
if (lower === undefined && upper === undefined) {
lower = 0
upper = 1
} else {
lower = toFinite(lower)
if (upper === undefined) {
upper = lower
lower = 0
} else {
upper = toFinite(upper)
}
}
if (lower > upper) {
var temp = lower
lower = upper
upper = temp
}
if (floating || lower % 1 || upper % 1) {
return Math.min(
lower +
Math.random() *
(upper -
lower +
Number.parseFloat("1e-" + ((Math.random() + "").length - 1))),
upper
)
}
return baseRandom(lower, upper)
}
export default random
/**
* 转换value为一个有限的数字
* Converts `value` to a finite number.
* @param {*} value The value to convert.
* @returns {number} Returns the converted number
* @example
*
* toFinite(3.3)
* // => 3.3
*
* toFinite(Number.MIN_VALUE)
* // => 5e-324
*
* toFinite(Infinity)
* // => 1.7976931348623157e+308
*
* toFinite('3.2')
* // => 3.2
*
* toFinite(NaN)
* // => 0
*
* toFinite(new Date())
* // => 1561430693003
*
* toFinite(() => {}))
* // => 0
*/
import toNumber from "./toNumber" //见下面另一段代码
const INFINITY = 1 / 0
const MAX_INTEGER = Number.MAX_VALUE || 1.7976931348623157e308
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0
}
value = toNumber(value)
if (value === INFINITY || value === -INFINITY) {
var sign = value < 0 ? -1 : 1
return sign * MAX_INTEGER
}
return value === value ? value : 0 //NaN 不等于 NaN
}
export default toFinite
/**
* Converts `value` to a number.
*
* @param {*} value The value to process
* @returns {number} Returns the number.
* @example
*
* toNumber('3')
* // => 3
*
* toNumber(Number.MIN_VALUE)
* // => 5e-324
*
* toNumber(Infinity)
* // => Infinity
*
* toNumber('0b111110111')
* // => 503
*
* toNumber('0o767')
* // => 503
*
* toNumber(new Date())
* // => 1561389053138
*
* toNumber(() => {})
* // => NaN
*/
const NAN = 0 / 0
const symbolTag = "[object Symbol]"
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)
}
export default toNumber