12

当编程语言是静态类型时,编译器可以更精确地分配内存,因此通常性能更高(在所有其他条件相同的情况下)。

我相信 ES4 引入了可选的类型提示(据我了解,由于 actionscript,Adobe 在其规范中发挥了重要作用)。因此,javascript 是否正式支持类型提示?ES6 会支持原生变量的可选类型提示吗?

如果 Javascript 确实支持类型提示,是否有任何基准可以显示它在性能方面的回报?我还没有看到一个开源项目使用它。

4

5 回答 5

13

我的理解是,通过在各个站点上听过许多 Javascript 演讲,类型提示不会像人们想象的那样有帮助。

简而言之,如果您愿意,大多数 Javascript 对象往往具有相同的“形状”。也就是说,它们将具有以相同顺序创建的相同属性。这个“形状”可以被认为是对象的“类型”。一个例子:

function Point(x, y) {
  this.x = x;
  this.y = y;
}

所有由“Point”制成的对象都将具有相同的“形状”,并且更新的内部 Javascript 引擎可以做一些花哨的游戏来更快地查找。

在 Chrome(也许还有其他)中,它们使用高位标志来指示数字的其余部分是整数还是指针。

随着所有这些花哨的事情的发生,剩下的就是人类编码人员的打字工作。一方面,我真的很喜欢不必担心类型,也不会使用该功能。

不过,您是半正确的。类型提示是其中的一部分ActionScript 3——ECMAScript但提示从未成为标准。AFAIK,除了一厢情愿之外,还没有讨论过。

该视频更详细地描述了事情: http ://www.youtube.com/watch?v=FrufJFBSoQY

于 2012-09-11T23:25:31.313 回答
8

我迟到了,但由于没有人真正回答你有关标准的问题,我会加入。

是的,类型提示作为 ECMAScript 4 的一部分进行了讨论,看起来它将成为 JavaScript 的未来……直到 ES4 尘埃落定。ECMAScript 4 被放弃并且从未最终确定。ECMAScript 5(当前标准)没有包含许多为 ECMAScript 4 计划的东西(包括类型提示),实际上只是 ECMAScript 3.1 草案的快速增强版本——以提供一些有用的功能在 ES4 过早消亡之后。

正如您所提到的,现在他们正在开发 ECMAScript 6(它有一些非常棒的特性!),但不要期望看到类型提示。Adobe 人员在一定程度上与 ECMAScript 委员会分道扬镳,而 ES 委员会似乎对恢复它不感兴趣(我认为这是有充分理由的)。

如果这是您想要的,您可能需要查看TypeScript。这是一个全新的微软项目,基本上是对 ES6+类型的尝试。它是 JavaScript 的超集(除了包含类型之外几乎相同),并且可以编译为可运行的 JavaScript。

于 2012-11-01T05:56:39.373 回答
5

ES7(不会很快推出)有一个新的特性叫做guard可能就是你要问的那个。现在的语法有点类似于 ES4 和 TypeScript。所有使用:并将类型附加到变量。但它不确认语法。

于 2014-06-03T04:25:12.583 回答
5

JavaScript JIT 编译器必须做一些非常花哨的事情来确定表达式和变量的类型,因为类型对于许多优化至关重要。但是 JavaScript 编译器的编写者在过去的五年里一直在做所有这些工作。编译器现在真的很聪明。因此,可选的静态类型不会提高典型程序的速度。

令人惊讶的是,当值从无类型代码传递到有类型代码时,ActionScript 中的类型注释有时会要求类型检查(或隐式转换),从而使编译代码变慢。

您可能需要在编程语言中使用静态类型还有其他原因,但 ECMAScript 标准委员会对将它们添加到 JS 没有兴趣。

于 2012-09-12T00:03:59.050 回答
0

Javascript 是基于原型的,因此对象的“类型”是完全动态的,并且能够在其生命周期内发生变化。

看看 Ben Firshman 关于对象类型的 Javascript 性能的发现 - http://jsconf.eu/2010/speaker/lessons_learnt_pushing_browser.html

于 2012-09-11T23:46:08.440 回答