跳到主要内容

16 篇博文 含有标签「ECMAScript」

查看所有标签

理解ECMAScript规范,第三部分

· 阅读需 12 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测性规范观察者

所有系列文章

在本篇中,我们将深入了解ECMAScript语言及其语法的定义。如果您对上下文无关语法不熟悉,现在是学习基础知识的好时机,因为规范使用上下文无关语法来定义语言。请参阅《Crafting Interpreters》中的上下文无关语法章节以获得更易理解的介绍,或者查看维基百科页面以获取更数学化的定义。

理解 ECMAScript 规范,第2部分

· 阅读需 11 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测性规范观察者

让我们继续练习我们出色的规范阅读技巧。如果你还没有查看前一集,现在是个好机会!

所有章节

准备好进入第2部分了吗?

一个有趣的了解规范的方式是,从一个我们知道有的JavaScript功能开始,找出它是如何被规范定义的。

警告!本集包含从ECMAScript规范(截至2020年2月)中复制粘贴的算法。它们最终会过时。

我们知道属性是在原型链中查找的:如果一个对象没有我们尝试读取的属性,我们就沿着原型链向上查找,直到找到它(或者找到一个没有原型的对象)。

例如:

const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99

原型链查找在哪里定义?

让我们来找出这种行为是在哪里定义的。一个好的起点是查看对象内部方法的列表。

既有[[GetOwnProperty]],也有[[Get]]——我们感兴趣的是不限于自身属性的版本,所以我们选择[[Get]]

不幸的是,属性描述符规格类型也有一个名为[[Get]]的字段,因此在查看规范时,我们需要仔细区分这两种独立的用法。

“理解ECMAScript规范,第二部分”的额外内容

· 阅读需 3 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测的规范观察者

为什么o2.foo是一个AssignmentExpression?

o2.foo看起来不像一个AssignmentExpression,因为没有赋值。为什么它是一个AssignmentExpression

规范实际上允许AssignmentExpression既可以作为参数,也可以作为赋值的右侧。例如:

function simple(a) {
console.log('参数是 ' + a);
}
simple(x = 1);
// → 输出“参数是 1”。
x;
// → 1

…以及…

x = y = 5;
x; // 5
y; // 5

o2.foo是一个AssignmentExpression,但它实际上没有进行赋值。这源于以下语法规则,每一个规则都处理到“最简单”的情况直到最后一个:

AssignmentExpression不需要包含赋值,它也可以只是一个ConditionalExpression

AssignmentExpression : ConditionalExpression

(还有其他规则,这里我们只展示相关的规则。)

ConditionalExpression不需要包含条件(a == b ? c : d),它也可以只是一个ShortcircuitExpression

ConditionalExpression : ShortCircuitExpression

等等:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

理解 ECMAScript 规范,第一部分

· 阅读需 9 分钟
[Marja Hölttä](https://twitter.com/marjakh),规范观察者

所有章节

在本文中,我们将从规范中的一个简单函数入手,尝试理解它的符号。开始吧!

前言

即使你了解 JavaScript,阅读它的语言规范,ECMAScript 语言规范,简称 ECMAScript 规范,也可能会让人望而生畏。至少这是我第一次开始阅读时的感受。

更快且功能更丰富的国际化 API

· 阅读需 5 分钟
[சத்யா குணசேகரன் (Sathya Gunasekaran)](https://twitter.com/_gsathya)

ECMAScript 国际化 API 规范 (ECMA-402,或 Intl) 提供了关键的区域特定功能,如日期格式化、数字格式化、复数形式选择和排序。Chrome V8 和 Google 国际化团队一直在合作,为 V8 的 ECMA-402 实现添加功能,同时清理技术债务并改善性能和与其他浏览器的互操作性。

加速展开元素

· 阅读需 9 分钟
Hai Dang 和 Georg Neis

在 V8 团队的三个月实习期间,Hai Dang 改进了 [...array], [...string], [...set], [...map.keys()][...map.values()] 的性能(当展开元素处于数组字面量开头时)。他还大幅加速了 Array.from(iterable)。本文将解释他所做的一些详细修改,这些优化从 V8 v7.2 开始生效。

更快的异步函数和Promise

· 阅读需 19 分钟
Maya Armyanova([@Zmayski](https://twitter.com/Zmayski)),永远等待的预测者,以及Benedikt Meurer([@bmeurer](https://twitter.com/bmeurer)),专业性能承诺者

JavaScript中的异步处理传统上被认为速度不是特别快。更糟糕的是,调试实时JavaScript应用程序——特别是Node.js服务器——并不是一件容易的事,尤其是异步编程。幸运的是,时代正在改变。这篇文章探讨了我们如何优化V8中的异步函数和Promise(也在一定程度上优化了其他JavaScript引擎),并描述了我们如何改进异步代码的调试体验。

在V8中实现排序

· 阅读需 18 分钟
Simon Zünd ([@nimODota](https://twitter.com/nimODota)),一致的比较器

Array.prototype.sort是V8中最后几个用自托管JavaScript实现的内置函数之一。移植它为我们提供了实验不同算法和实现策略的机会,并最终在V8 v7.0 / Chrome 70中让它变得稳定

提升 V8 中 `DataView` 性能

· 阅读需 9 分钟
Théotime Grohens, <i lang="fr">低数据视图专家</i>,以及 Benedikt Meurer ([@bmeurer](https://twitter.com/bmeurer)),专业性能伙伴

DataViews 是 JavaScript 中低级内存访问的两种可能方式之一,另一种是 TypedArrays。到目前为止,V8 中的 DataViews 比 TypedArrays 的优化程度低得多,导致在诸如图形密集工作负载或解码/编码二进制数据的任务中性能较差。这些情况的原因主要是历史选择,例如 asm.js 选择了 TypedArrays 而不是 DataViews,从而导致引擎更专注于 TypedArrays 的性能。