Javascript 中 BigInt 类型的 Math.max 和 Math.min 的替代方案
Alternative to Math.max and Math.min for BigInt type in Javascript
在 Javascript 中:Math.max 和 Math.min 不适用于 BigInt 类型。
例如:
> Math.max(1n, 2n)
Thrown:
TypeError: Cannot convert a BigInt value to a number
at Math.max (<anonymous>)
>
是否有内置函数可以对 BigInts 执行这些操作?
经过一些谷歌搜索后,答案似乎是否定的,Javascript 没有内置函数。
这里是 biint 的 min 和 max 的实现,它与内置的签名相匹配,除了它会为空列表抛出错误(而不是返回 +/-Infinity,因为 BigInt 不能表示无穷大) :
function bigint_min(...args){
if (args.length < 1){ throw 'Min of empty list'; }
m = args[0];
args.forEach(a=>{if (a < m) {m = a}});
return m;
}
function bigint_max(...args){
if (args.length < 1){ throw 'Max of empty list'; }
m = args[0];
args.forEach(a=>{if (a > m) {m = a}});
return m;
}
怎么样
const bigIntMax = (...args) => args.reduce((m, e) => e > m ? e : m);
const bigIntMin = (...args) => args.reduce((m, e) => e < m ? e : m);
也可以,如果你两者都想要的话
const bigIntMinAndMax = (...args) => {
return args.reduce(([min,max], e) => {
return [
e < min ? e : min,
e > max ? e : max,
];
}, [args[0], args[0]]);
};
const [min, max] = bigIntMinAndMax(
BigInt(40),
BigInt(50),
BigInt(30),
BigInt(10),
BigInt(20),
);
在 Javascript 中:Math.max 和 Math.min 不适用于 BigInt 类型。
例如:
> Math.max(1n, 2n)
Thrown:
TypeError: Cannot convert a BigInt value to a number
at Math.max (<anonymous>)
>
是否有内置函数可以对 BigInts 执行这些操作?
经过一些谷歌搜索后,答案似乎是否定的,Javascript 没有内置函数。
这里是 biint 的 min 和 max 的实现,它与内置的签名相匹配,除了它会为空列表抛出错误(而不是返回 +/-Infinity,因为 BigInt 不能表示无穷大) :
function bigint_min(...args){
if (args.length < 1){ throw 'Min of empty list'; }
m = args[0];
args.forEach(a=>{if (a < m) {m = a}});
return m;
}
function bigint_max(...args){
if (args.length < 1){ throw 'Max of empty list'; }
m = args[0];
args.forEach(a=>{if (a > m) {m = a}});
return m;
}
怎么样
const bigIntMax = (...args) => args.reduce((m, e) => e > m ? e : m);
const bigIntMin = (...args) => args.reduce((m, e) => e < m ? e : m);
也可以,如果你两者都想要的话
const bigIntMinAndMax = (...args) => {
return args.reduce(([min,max], e) => {
return [
e < min ? e : min,
e > max ? e : max,
];
}, [args[0], args[0]]);
};
const [min, max] = bigIntMinAndMax(
BigInt(40),
BigInt(50),
BigInt(30),
BigInt(10),
BigInt(20),
);