【ECMA 262学習シリーズ(二)】パーrseInt詳細


Table of Constets
  • parseInt(string、radix)
  • 関数処理プロセス:
  • ダミーコード
  • 図解
  • parseInt(string,radix)
    与えられた精度radixに基づいて、最初のパラメータを数値型に変換する.
    最初のスペースは無視されます.
    ラジクスの値

    説明
    undefinedまたは0
    radixは10として処理されます.0 x or 0 Xの先頭の文字列を除いて、16進数として処理されます.
    16
    文字列を0 xまたは0 Xで開始する必要があります.
    関数処理プロセス:
  • は、最初のパラメータを文字列化するinputString = ToString(string).
  • タイプはObjectケースの処理です.
  • primValue = ToPrimitive(input argument, hint String)
  • ToString(primValue)
  • を返します.
  • 先頭の空の文字(先頭のスペース)に行きます.S = trimStart(inputString)
  • 初期化シンボルビットsign = 1
  • もしSが空切の第一文字でないならば、マイナス-sign = -1
  • もしSが空切の第一文字が+または-でないなら、第一文字
  • を削除する.
  • 精度パラメータ値を32ビット整数に変換するR = ToInt32(radix)
  • 設定stripPrefix = true
  • は、R ≠ 0なら実行される.
  • 精度値が範囲外であれば(R < 2 or R > 36)、直接NaN
  • に戻る.
  • もしR ≠ 16stripPrefix = false
  • を設定したら
  • もしR = 0ならばR = 10
  • もしstripPrefix = true
  • Sが2より大きい場合、前の2つの文字が0xまたは0Xであり、その後、前の2つの文字をSから削除し、R = 16
  • を設定する.
  • もしSに任意の非精度数字が含まれているなら、Z値は最初のこのような文字の前のすべての文字からなるサブストリングを設定してください.そうでなければ、Z = S
  • もしZが空だったら、NaN
  • を返します.
  • は、mathInt値がZ進数文字列の代表的な数字(例えば、8進数Z = 0..mathInt = 8)を設定し、A-Z, a-zを使用して10 ~ 35
  • を表す.
    擬似符号
    function myParseInt(string, radix) {
      // 1. convert `string` to string
      let intputString = '' + string
    
      // 2. trim whitespace char
      let S = inputString.trim()
    
      // 3. init sign value
      let sign = -1
    
      // 4. set sign value by the first char of string
      sign = S[0] === '-' ? -1 : sign
    
      const firstChar = S[0]
      // 5. to remove the sign char of first char
      if (firstChar === '-' || firstChar === '+') {
        S = S.substr(1)
      }
    
      // 6. convert the radix to int and save it
      const R = +radix
    
      // 7. init stripPrefix value(indicate if S has radix char)
      let stripPrefix = true
    
      // 8. judge the radix value
      if (R !== 0) {
        if (R < 2 || R > 36) {
          // 7.1 beyond the radix range
          return NaN
        } else if (R !== 16) {
          // 7.2 the 16radix value need to strip the prefix(as. 0x or 0X)
          // and other radix dont need to strip prefix
          stripPrefix = false
        }
      } else {
        // set to 10 radix if input radix = 0
        R = 10
      }
    
      // 10. if need to strip prefix
      if (stripPrefix) {
        // 10.1 if len of S >= 2
        if (S.length >= 2) {
          const firstTwoChars = S.substr(0, 2)
          if (firstTwoChars === '0x' || firstTwoChars === '0X') {
            S = S.substr(2)
            R = 16
          }
        }
      }
    
      // 11.
    }
    
    図解