/**
* 检查n是否在start与end之间,但不包括end。如果end没有指定,那么start设置为0,
* 如果start大于end,那么参数会交换以便支持负范围。
* Checks if `n` is between `start` and up to, but not including, `end`.
* If `end` is not specified, it's set to `start` with `start` then set to `0`.
* If `start` is greater than `end` the params are swapped to support negative ranges
* @param {number} number The number to check
* @param {number} [start=0] The start of the range
* @param {number} end The end of the range
* @returns {boolean} Returns `true` if `number` is in the range, else `false`.
* @example
* inRange(3, 2, 4)
* // => true
* inRange(4, 8)
* // => true
* inRange(4, 2)
* // => false
* inRange(2, 2)
* // => false
* inRange(1.2, 2)
* // => true
* inRange(5.2, 4)
* // => false
* inRange(-3, -2, -6)
* // => true
*/
import toFinite from "./toFinite"
import toNumber from "./toNumber"
function inRange(number, start, end) {
start = toFinite(start)
if (end === undefined) {
end = start
start = 0
} else {
end = toFinite(end)
}
number = toNumber(number)
return number > Math.min(start, end) && number < Math.max(start, end)
}
export default inRange
/**
* 转换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