【问题标题】:Alternative to Math.max and Math.min for BigInt type in JavascriptJavascript 中 BigInt 类型的 Math.max 和 Math.min 的替代方案
【发布时间】:2020-08-03 00:51:35
【问题描述】:

在 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 bigint


    【解决方案1】:

    怎么样

    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),
    );
    

    【讨论】:

    • 排序应该更慢,因为它需要至少 N 次但通常超过 N 次操作。另外,它具有破坏性,我可能想要最小值,但我不想改变数组的顺序
    • 在测试了我的答案与你的性能答案后,我发现你的方法(使用 reduce)快了大约 25,000 倍
    • 我不太确定返回 +/-Infinity 是否有用,因为它们不是 BigInt 类型。这意味着当你发现你没有像你想象的那样拥有 BigInt 时,使用空列表的错误将被捕获。
    • 摆脱了无限。但是,是的,它不会捕获错误。虽然 Math.min 或 Math.max 也没有,但您可以根据需要添加错误检查。您不应该首先要求空列表的最小值或最大值,因为没有正确答案。
    【解决方案2】:

    经过一些谷歌搜索后,答案似乎是否定的,Javascript 对此没有内置函数。

    这是与内置签名匹配的 bigint 的 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;
    }
    

    【讨论】:

    • args.reduce( (min, val) =&gt; min &gt; val ? val : min, Infinity ); 可能更具可读性。
    • @Kaiido 同意,reduce 可读性更强,但是 Infinity 是 Number 类型,不能用 BigInt 类型表示。
    • Infinity 不是比任何 bigInt 都大吗?
    • 是的,但它意味着该函数将返回BigInt(&lt;number you wanted&gt;)Number('Infinity')。所以返回类型不一致,而内置的 min 和 max 总是返回相同的类型(Number 类型)
    • 由于您检查了 args.length
    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多