2020/10/26 进制

由于博客内容为空,暂无法提供包含关键信息的摘要。

在这里插入图片描述

在 JavaScript 中,将 **16进制字符串(Hex String)转换为十进制数字**,可以使用以下几种方法。最常用的是 `parseInt()` 和 `Number()`。 --- ## ✅ 方法 1:使用 `parseInt(hexString, 16)` —— 推荐基础用法 ```javascript const hex = "1A"; const num = parseInt(hex, 16); console.log(num); // 26 ``` > 🔹 第二个参数 `16` 表示以 16 进制解析 > 🔹 支持大写或小写:`"1a"` 或 `"1A"` 都可以 > 🔹 忽略前导空格,遇到非法字符停止解析 ### 更多例子: ```javascript console.log(parseInt("FF", 16)); // 255 console.log(parseInt("abc", 16)); // 2748 console.log(parseInt("0xFF", 16)); // 255(即使带 0x 前缀也能正确解析) console.log(parseInt("-A", 16)); // -10 ``` --- ## ✅ 方法 2:使用 `Number('0x' + hex)` 或 `Number(0x...)` —— 简洁现代方式 ```javascript const hex = "1A"; const num = Number(`0x${hex}`); console.log(num); // 26 ``` > 🔹 利用 JS 原生支持 `0x` 前缀的 16 进制字面量 > 🔹 更快(V8 引擎优化过) > 🔹 如果输入已带 `0x`,直接 `Number(hex)` 即可 ### 示例: ```javascript console.log(Number("0xFF")); // 255 console.log(Number("0xff")); // 255 console.log(Number(0xFF)); // 255(直接是数字) console.log(Number(`0x${"1A"}`)); // 26 ``` --- ## ✅ 方法 3:使用 `+` 操作符(隐式转换) ```javascript const hex = "FF"; const num = +`0x${hex}`; console.log(num); // 255 ``` > 🔹 `+` 可强制将字符串转为数字 > 🔹 写法简洁,但可读性稍差 --- ## 🧩 安全封装函数(带错误处理) 防止无效输入导致 `NaN`: ```javascript function hexToDecimal(hex) { const trimmed = hex.trim(); // 去除空格 if (!/^[0-9A-Fa-f]+$/.test(trimmed)) { throw new Error(`Invalid hexadecimal string: ${hex}`); } return parseInt(trimmed, 16); } // 使用示例 console.log(hexToDecimal("1A")); // 26 console.log(hexToDecimal("ff")); // 255 console.log(hexToDecimal(" ABC ")); // 2748 // console.log(hexToDecimal("GHI")); // 抛错:Invalid hex ``` --- ## ⚠️ 注意事项 | 情况 | 处理方式 | |------|----------| | 输入含 `0x` 前缀 | `parseInt("0xFF", 16)` 或 `Number("0xFF")` 都行 | | 输入不含前缀 | 用 `parseInt(str, 16)` 最安全 | | 输入为空或非法 | 返回 `NaN`,需验证 | | 超出安全整数范围 | 使用 `BigInt`(见下文) | --- ## ✅ 处理大数:使用 `BigInt`(超过 2^53 - 1) 如果 16 进制数非常大(如哈希值、颜色码以外用途),应使用 `BigInt`: ```javascript const bigHex = "ffffffffffffffff"; const bigNum = BigInt(`0x${bigHex}`); console.log(bigNum); // 18446744073709551615n ``` > 🔹 结果是 `BigInt` 类型(末尾有 `n`) > 🔹 不要与普通数字混用运算 --- ## 🆚 方法对比表 | 方法 | 语法 | 是否支持大数 | 兼容性 | 推荐场景 | |------|------|---------------|--------|-----------| | `parseInt(str, 16)` | `parseInt("FF", 16)` | ❌ 普通数字上限 | ✅ 所有环境 | 常规转换 | | `Number('0x'+str)` | `Number('0xFF')` | ❌ 同上 | ✅ ES3+ | 简洁写法 | | `+('0x'+str)` | `+'0xFF'` | ❌ | ✅ | 极简代码 | | `BigInt('0x'+str)` | `BigInt('0xFF')` | ✅ 支持任意长度 | ⚠️ ES2020+ | 大数、哈希、密码学 | --- ## ✅ 实际应用示例 ### 示例 1:颜色 16 进制转 RGB ```javascript function hexToRgb(hex) { const h = hex.replace(/^#/, ''); const r = parseInt(h.slice(0, 2), 16); const g = parseInt(h.slice(2, 4), 16); const b = parseInt(h.slice(4, 6), 16); return { r, g, b }; } console.log(hexToRgb("#FFA500")); // { r: 255, g: 165, b: 0 } ``` --- ## ✅ 最佳实践建议 - ✅ 日常使用:`parseInt(hex, 16)` - ✅ 简洁写法:`Number('0x' + hex)` - ✅ 大数处理:`BigInt('0x' + hex)` - ❌ 避免:`parseInt("0xFF")` 不传基数(虽然能识别,但不推荐) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值