JavaScript中大数处理

112 阅读2分钟

最大安全数

JavaScript的Number类型为双精度 IEEE 754 64 位浮点类型。它的最大安全数是Number.MAX_SAFE_INTEGER

Number.MAX_SAFE_INTEGER // 9007199254740991 - 16位数字
Number.MAX_SAFE_INTEGER === Math.pow(2,53)-1 // true

如果数字超过了JavaScript的最大安全值,在转化成字符串的时候可能会出问题。

举例:

'232493080146659329'.length // 18
String(232493080146659329) // 232493080146659330

模板

如何正确的转化呢,如果出现了大数?可以考虑使用模板。

ES6新增了模板的概念。用模板来转换是对的。

`232493080146659329` // 232493080146659329

在JS中,可执行的只有语句或表达式吗?肯定也不是,现在说的模板也算是一种特殊的可执行结构。

模板的语法是:

let name = 'juejin'
console.log(`${name}`) // juejin

在大括号内部,可以是任何语句或表达式。

再接着刚才说的可执行结构,还有哪些呢?

参数列表应该也算,很特殊,当函数调用的时候,参数间会有对应的映射关系进行匹配,ES6中还新增了缺省参数和给参数赋默认值等扩展参数功能。

还有种情况,如下:

let obj = {
  a: 1,
  b: 2
}
let {a, b} = obj

这种赋值模板,左操作数的标识符属性和由操作数的对象中属性进行映射赋值。

再看看模板的原理,有人说,它是上述说的几种甚至更多的这些可执行结构的集大成者。它本身是一个特殊的可执行结构,它调动了包括引用、求值、标识符绑定、内部可执行结构存储,以及执行函数调用在内的几乎全部能力。或许是这样,但这种特殊的可执行结构或其他的东西在一门语言中不宜过多,这也是容易产生坏味道的来源。