为什么使用 Number(num) != num 而不是 ~~num != num 抛出"JavaScript heap out of memory"?



我正在尝试验证输入:如果 num 不是整数或整数格式的字符串,则抛出 TypeError。当我尝试像这样验证输入时,一切都在工作:

function prefill(n, v) {
  let testArr = [];
  let num  = n;
//input validation
    if(~~num != num || typeof num == 'boolean' || +num < 0) throw new 
TypeError(num + ' is invalid')
    else {
      for (let i = 0; i < +n; i++) {
        testArr.push(v);
      } 
      return testArr;    
 }
}

但是当我尝试这种方式时,

if(Number(num) != num || +num < 0)

我收到此错误"致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript 堆内存不足">

更新了答案

有多少元素将被推入数组?按位的"~~"比较将其解析为 32 位结果。最多 2^31 个项目。

Number(

( 会给你一个浮点数,它可能会运行 for 循环并推送 'v' 1.7976931348623157e+308 (Number.MAX_VALUE( 次。那迟早会让你失去记忆。