乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      如何實(shí)現(xiàn)一個parseInt

       丹楓無跡 2021-11-10

      如何實(shí)現(xiàn)一個parseInt

      function(string, [radix]) {}
      
      • 如果string不為字符串類型, 則先將string轉(zhuǎn)化為字符串類型
      • string會忽略前后的空白
      • 依次解析字符, 如果字符不是指定基數(shù)中的字符( 例如:2進(jìn)制中的3、 10進(jìn)制中的'f' )則停止解析( 首字符為'+'或'-'時除外 ), 返回已經(jīng)解析好的整數(shù)
      • 如果無法解析為整數(shù), 則返回NaN
      • radix 默認(rèn)值不為10, 在radix為undefined、0或者沒有指定時, 做以下處理
        • 如果string以'0X'或'0x'開頭時, 基數(shù)為16
        • 如果string以'0'開頭時, 基數(shù)為8或者10(每個瀏覽器的具體實(shí)現(xiàn)不同, es5規(guī)定此時為10)
        • 如果string以其他任何字符開頭時, 基數(shù)為10
      • radix的范圍為2-36

      不考慮進(jìn)制radix

      代碼實(shí)現(xiàn)

      const _parseInt = (str, radix) => {
        if (typeof str !== 'string') str = String(str)
        str = str.trim()
        const regex = /^(?<fuhao>[\+|\-]*)(?<num>\d+)/
        if (!regex.test(str)) return NaN
        const groups = str.match(regex).groups
        radix = 10
        const arr = groups.num.split('')
        const len = arr.length
        let result = 0
        for(let i = 0; i < len; i++) {
          const num = arr[i] * Math.pow(10, len - i - 1)
          if (isNaN(num)) break
          else result += num
        }
        return result * (groups.fuhao === '-' ? -1 : 1)
      }
      

      測試用例

      const assert = require('assert')
      assert.strictEqual(_parseInt(null), NaN)
      assert.strictEqual(_parseInt('0e0'), 0)
      assert.strictEqual(_parseInt('08'), 8)
      assert.strictEqual(_parseInt(0.0000003), 3)
      assert.strictEqual(_parseInt(0.00003), 0)
      assert.strictEqual(_parseInt(-0.0000003), -3)
      assert.strictEqual(_parseInt('6.022e23'), 6)
      assert.strictEqual(_parseInt(6.022e2), 602)
      

      考慮radix

      代碼實(shí)現(xiàn)

      const _parseInt = (str, radix) => {
        // 不為string類型先轉(zhuǎn)化為string 類型
        if (typeof str !== 'string') str = String(str)
      
        // 刪除首尾空白
        str = str.trim()
      
        // 正則匹配[+|-]?[0]?[Xx]?[0-9a-fA-F]+
        const regex = /^(?<fuhao>[\+|\-]*)(?<radix>[0]?[Xx]?)(?<num>[0-9a-fA-F]+)/
      
        // 無法匹配返回NaN
        if (!regex.test(str)) return NaN
      
        // 匹配出符號、進(jìn)制、數(shù)字三個分組
        const groups = str.match(regex).groups
      
        // radix的有效范圍為 2-36
        if (radix && (radix < 2 || radix > 36)) return NaN
      
        // 如果沒有指定radix, radix 會有以下默認(rèn)值
        if (!radix) {
          if (groups.radix.toUpperCase() === '0X') radix = 16
          else if (groups.radix === '0') radix = 8
          else radix = 10
        }
      
        // 挨個字符串解析,如果遇到無法解析時則停止解析,返回已經(jīng)解析好的整數(shù)
        let splitArr = groups.num.split('')
        const arr = []
        for(let i = 0; i < splitArr.length; i++) {
          // 根據(jù)charCode來做轉(zhuǎn)行為實(shí)際數(shù)據(jù), 0-9為[48-57],A-F為[65-70]
          const charCode = splitArr[i].toUpperCase().charCodeAt()
          let num 
      
          // 字符為[A-F]時, 實(shí)際數(shù)字為charCode -55
          if(charCode >= 65) num = charCode - 55
      
          // 字符為[0-9]時, 實(shí)際數(shù)字為charCode - 48
          else num = charCode - 48
      
          // 當(dāng)實(shí)際數(shù)字大于radix時, 無法解析則停止字符串遍歷
          if (num > radix) {
            break
          } else {
            arr.push(num)
          }
        }
      
        const len = arr.length
        // 當(dāng)實(shí)際數(shù)字?jǐn)?shù)組長度為0時, 返回NaN
        if(!len) return NaN
        let result = 0
      
        // 依次解析實(shí)際數(shù)字?jǐn)?shù)組, 組合成真正的數(shù)字
        for(let i = 0; i < len; i++) {
          const num = arr[i] * Math.pow(radix, len - i - 1)
          result += num
        }
      
        // 算法匹配到的正負(fù)號
        return result * (groups.fuhao === '-' ? -1 : 1)
      }
      
      

      測試用例

      const assert = require('assert')
      
      // 以下返回15
      assert.strictEqual(_parseInt('0xF', 16), 15)
      assert.strictEqual(_parseInt('F', 16), 15)
      assert.strictEqual(_parseInt('17', 8), 15)
      assert.strictEqual(_parseInt(021, 8), 15)
      assert.strictEqual(_parseInt('015', 10), 15)
      assert.strictEqual(_parseInt(15.99, 10), 15)
      assert.strictEqual(_parseInt('15,123', 10), 15)
      assert.strictEqual(_parseInt('FXX123', 16), 15)
      assert.strictEqual(_parseInt('1111', 2), 15)
      assert.strictEqual(_parseInt('15 * 3', 10), 15)
      assert.strictEqual(_parseInt('15e2', 10), 15)
      assert.strictEqual(_parseInt('15px', 10), 15)
      assert.strictEqual(_parseInt('12', 13), 15)
      
      // 以下返回NaN
      assert.strictEqual(_parseInt('Hello', 8), NaN)
      assert.strictEqual(_parseInt('546', 2), NaN)  
      
      // 以下返回-15
      assert.strictEqual(_parseInt('-F', 16), -15)
      assert.strictEqual(_parseInt('-0F', 16), -15)
      assert.strictEqual(_parseInt('-0XF', 16), -15)
      assert.strictEqual(_parseInt(-15.1, 10), -15)
      assert.strictEqual(_parseInt(' -17', 8), -15)
      assert.strictEqual(_parseInt(' -15', 10), -15)
      assert.strictEqual(_parseInt('-1111', 2), -15)
      assert.strictEqual(_parseInt('-15e1', 10), -15)
      assert.strictEqual(_parseInt('-12', 13), -15)
      
      // 以下返回4
      assert.strictEqual(_parseInt(4.7, 10), 4)
      assert.strictEqual(_parseInt(4.7 * 1e22, 10), 4)
      assert.strictEqual(_parseInt(0.00000000000434, 10), 4)
      
      // 以下返回224
      assert.strictEqual(_parseInt('0e0', 16), 224)
      

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多