阿里云优惠活动,点击链接进行购买: 一年仅需96.9元即可以购买服务器~
腾讯云优惠活动, 点击链接进行购买一年仅需99元
腾讯云限时开团活动, 点击链接进行购买一年仅需95元
原文链接: http://2ality.com/2019/01/future-js.html 作者:Axel Rauschmayer ; 著有《JavaScript for impatient programmers》、《Speaking JavaScript
近年来,JavaScript的规模已经大大增加。这篇博客文章探讨了仍然缺失的内容。
说明:
有关前两个问题的更多想法,请参阅语言设计部分 (opens new window) (http://2ality.com/2019/01/future-js.html#language-design)。
目前,JavaScript只比较原始值,例如字符串值(通过查看其内容)
> 'abc' === 'abc'
true
相比之下,对象通过引用进行比较(对象仅严格等于自身):
> {x: 1, y: 4} === {x: 1, y: 4}
false
如果有一种方法可以创建按值进行比较的对象,那将是很好的:
> #{x: 1, y: 4} === #{x: 1, y: 4}
true
另一种可能性是引入一种新的类(具体细节待定)
@[ValueType]
class Point {
// ···
}
提示:将类标记为值类型,是基于装饰器的草案。
当对象通过引用进行比较时,将它们放入(non-weak)ECMAScript 数据结构(如Maps)中是没有意义的:
const m = new Map();
m.set({x: 1, y: 4}, 1);
m.set({x: 1, y: 4}, 2);
assert.equal(m.size, 2);
可以通过自定义值类型修复此问题。 或者可以自定义Set属性和Map键的管理。 例如:
Hash Map 意思是会给每个对象分配一个哈希值,来代表唯一性。但是对于这个传入的对象,需要是不可变的,否则的话,容易破坏数据结构。
Tree Map 或者需要比较两个对象的值操作以此来管理储存的值。
https://yikun.github.io/2015/04/06/Java-TreeMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/
https://juejin.im/entry/57bfab077db2a20068ebf9d2
https://blog.csdn.net/github_26672553/article/details/77185003
https://286.iteye.com/blog/2189266
https://www.cnblogs.com/skywang12345/p/3310928.html
JavaScript数字总是64位(双精度),它为整数提供53位加号。这意味着超过53位,你不能再代表每个数字了:
> 2 ** 53
9007199254740992
> (2 ** 53) + 1 // can’t be represented
9007199254740992
> (2 ** 53) + 2
9007199254740994
在某些情况下,这是一个相当大的限制。 现在有一个关于 BigInts 的提案
[1],即实数整数,其精度随着需要的增长而增长:
[1]提案地址:http://2ality.com/2017/03/es-integer.html
> 2n ** 53n
9007199254740992n
> (2n ** 53n) + 1n
9007199254740993n
BigInts 还支持强制转换,它可以给你提供固定位数的值:
const int64a = BigInt.asUintN(64, 12345n);
const int64b = BigInt.asUintN(64, 67890n);
const result = BigInt.asUintN(64, int64a * int64b);
JavaScript的数字是基于IEEE 754标准的64位浮点数(双精度数)。鉴于它们的表示形式是base-2,在处理小数分数时可能会出现舍入误差:
> 0.1 + 0.2
0.30000000000000004
这在科学计算和金融技术(金融科技)中尤其成问题。目前有一项关于10进制数的建议处于 stage0。它们可能最终被这样使用(注意十进制数的后缀m)
提案地址:https://github.com/tc39/proposals/blob/master/stage-0-proposals.md