【ECMA262学习系列(二)】parseInt 详解

Table of Contents

  1. parseInt(string, radix)
  2. 函数处理过程:
  3. 伪码
  4. 图解

parseInt(string, radix)

根据提供的精度 radix 将第一个参数转换成数值型。

开头的空格会被忽略掉。

radix 的值

描述
undefined 或 0radix 会被当做 10 来处理,除了 0x or 0X 开头的字符串(这类会被当做16进制处理)
16需要字符串以 0x 或 0X 开头

函数处理过程:

  1. 将第一个参数字符串化 inputString = ToString(string)

    • 类型为 Object 情况处理
      1. primValue = ToPrimitive(input argument, hint String)
      2. 返回 ToString(primValue)
  2. 去开头的空字符(前导空格), S = trimStart(inputString)

  3. 初始化符号位 sign = 1

  4. 如果 S 不为空切第一个字符是负号 -sign = -1

  5. 如果 S 不为空切第一个字符是 +- ,就移除第一个字符

  6. 将精度参数值转成 32 位整型 R = ToInt32(radix)

  7. 设置 stripPrefix = true

  8. 如果 R ≠ 0 就执行:

    1. 如果精度值超出范围(R < 2 or R > 36) ,直接返回 NaN

    2. 如果 R ≠ 16 设置 stripPrefix = false

  9. 如果 R = 0R = 10

  10. 如果 stripPrefix = true

    1. 如果 S 大于 2,并且前两个字符是 0x0X ,然后就将前两个字符从 S
      去掉,并设置 R = 16
  11. 如果 S 包含了任意非精度数字,设置 Z 值为第一个这样的字符之前的所有字符组
    成的子串,否则 Z = S

  12. 如果 Z 是空的,返回 NaN

  13. 设置 mathInt 值为 Z 进制字符串代表的数字(比如:八进制 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.
}

图解

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若叶岂知秋vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值