ECMAScript (简称 ES)是 JavaScript 的规范。每年都会发布一个新版本,引入新的特性和改进现有的特性。ES2020 是 ECMAScript2019 的后继。其中,一个比较重要的新特性是 Intl.NumberFormat
。它允许将 Positive Integers 转换为 8、16或 32 位的有符号数。
本文将向大家详细介绍这个特性,希望能够帮助开发者更好地理解和使用它。
转换为有符号数
首先,我们需要理解什么是有符号数和无符号数。简单来说,如果一个数在二进制下最高位为 0,则表示它是正数,是无符号数;如果最高位为 1,则是负数,有符号数中的负数使用了二进制补码。对于有符号数,最高位代表符号。因此,有符号数的取值范围比无符号数要小一半。
在 ECMAScript 2020 中,我们可以使用 Intl.NumberFormat
将 Positive Integers 转换为有符号数,方法为 formatToParts
。这个方法会将转换后的数据返回为一个数组,数组的元素是一个对象,其中包含有符号数的各个部分,例如符号、整数和小数。
接下来,我们就来看下 Intl.NumberFormat
如何将 Positive Integers 转换为有符号数。
转换为 8 位有符号数
要将 Positive Integers 转换为 8 位有符号数,可以这样写代码:
const number = 128; const format = new Intl.NumberFormat('en', { style: 'unit', unit: 'byte', minimumFractionDigits: 0, maximumFractionDigits: 0, minimumSignificantDigits: 2, maximumSignificantDigits: 2, notation: 'compact', compactDisplay: 'short'}).formatToParts(number); const sign = format[0]; const integer = format[1].value; const eightBit = parseInt(integer, 10).toString(2).slice(-8);
在上面的代码中,我们先定义了一个变量 number
,它的值为 128。然后,我们使用 Intl.NumberFormat
来将 number
转换为有符号数,最后通过复制数组元素的方式将符号和整数提取出来,分别定义为 sign
和 integer
。
最后,我们将 integer
转换为二进制字符串(需要先将它转换为十进制数字类型),并且只取字符串中最右边的 8 位二进制数字,定义为 eightBit
。这就是 8 位有符号数。
转换为 16 位有符号数
将 Positive Integers 转换为 16 位有符号数方式与 8 位类似:
const number = 32768; const format = new Intl.NumberFormat('en', { style: 'unit', unit: 'byte', minimumFractionDigits: 0, maximumFractionDigits: 0, minimumSignificantDigits: 2, maximumSignificantDigits: 2, notation: 'compact', compactDisplay: 'short'}).formatToParts(number); const sign = format[0]; const integer = format[1].value; const sixteenBit = parseInt(integer, 10).toString(2).slice(-16);
这里我们定义一个 number
,赋值为 32768。使用 Intl.NumberFormat
转换后,需要先将符号和整数分别提取出来。接下来,我们再将整数值 integer
转换为二进制字符串。这里 slice(-16)
表示只取字符串中最后 16 位(二进制)的数字。
这就是 16 位的有符号数。
转换为 32 位有符号数
将 Positive Integers 转换为 32 位有符号数方式也与 8 位和 16 位类似:
const number = 2147483648; const format = new Intl.NumberFormat('en', { style: 'unit', unit: 'byte', minimumFractionDigits: 0, maximumFractionDigits: 0, minimumSignificantDigits: 2, maximumSignificantDigits: 2, notation: 'compact', compactDisplay: 'short'}).formatToParts(number); const sign = format[0]; const integer = format[1].value; const thirtyTwoBit = parseInt(integer, 10).toString(2).slice(-32);
在这个例子中,我们将 number
赋值为 2147483648,也就是 2 的 31 次方。同样,使用 Intl.NumberFormat
将其转换为有符号数,提取出符号和整数后,再将整数值 integer
转换为二进制字符串。这里 slice(-32)
表示只取字符串中最后的 32 位二进制数字。
这就是 32 位的有符号数。
总结
本文介绍了 ECMAScript2020 中一个重要的新特性:将 Positive Integers 转换为 8、16 或 32 位的有符号数。我们使用了 Intl.NumberFormat
的 formatToParts
方法将转换后的有符号数数组解析为有符号数的各个部分,并成功将其转换为 8、16 和 32 位的有符号数。
这个新特性对于一些需要将数据转换为有符号数的应用来说非常有用。对于一个完整的实现,我们也应该考虑负数的情况。使用这个新特性转换负数的方法也非常简单,只需要将正数翻转后加上 1 即可得到负数的补码。
希望这篇文章对大家学习 ECMAScript2020 和开发工作有所帮助。如果您有更好的想法或者更好的实现方式,欢迎在评论区与我们分享。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65473dc47d4982a6eb19bd5f