16 篇博文 含有标签「ECMAScript」
查看所有标签理解ECMAScript规范,第三部分
在本篇中,我们将深入了解ECMAScript语言及其语法的定义。如果您对上下文无关语法不熟悉,现在是学习基础知识的好时机,因为规范使用上下文无关语法来定义语言。请参阅《Crafting Interpreters》中的上下文无关语法章节以获得更易理解的介绍,或者查看维基百科页面以获取更数学化的定义。
理解 ECMAScript 规范,第2部分
让我们继续练习我们出色的规范阅读技巧。如果你还没有查看前一集,现在是个好机会!
准备好进入第2部分了吗?
一个有趣的了解规范的方式是,从一个我们知道有的JavaScript功能开始,找出它是如何被规范定义的。
警告!本集包含从ECMAScript规范(截至2020年2月)中复制粘贴的算法。它们最终会过时。
我们知道属性是在原型链中查找的:如果一个对象没有我们尝试读取的属性,我们就沿着原型链向上查找,直到找到它(或者找到一个没有原型的对象)。
例如:
const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99
原型链查找在哪里定义?
让我们来找出这种行为是在哪里定义的。一个好的起点是查看对象内部方法的列表。
既有[[GetOwnProperty]]
,也有[[Get]]
——我们感兴趣的是不限于自身属性的版本,所以我们选择[[Get]]
。
不幸的是,属性描述符规格类型也有一个名为[[Get]]
的字段,因此在查看规范时,我们需要仔细区分这两种独立的用法。
“理解ECMAScript规范,第二部分”的额外内容
为什么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
:
(还有其他规则,这里我们只展示相关的规则。)
ConditionalExpression
不需要包含条件(a == b ? c : d
),它也可以只是一个ShortcircuitExpression
:
等等:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
理解 ECMAScript 规范,第一部分
在本文中,我们将从规范中的一个简单函数入手,尝试理解它的符号。开始吧!
前言
即使你了解 JavaScript,阅读它的语言规范,ECMAScript 语言规范,简称 ECMAScript 规范,也可能会让人望而生畏。至少这是我第一次开始阅读时的感受。
更快且功能更丰富的国际化 API
ECMAScript 国际化 API 规范 (ECMA-402,或 Intl
) 提供了关键的区域特定功能,如日期格式化、数字格式化、复数形式选择和排序。Chrome V8 和 Google 国际化团队一直在合作,为 V8 的 ECMA-402 实现添加功能,同时清理技术债务并改善性能和与其他浏览器的互操作性。
加速展开元素
在 V8 团队的三个月实习期间,Hai Dang 改进了 [...array]
, [...string]
, [...set]
, [...map.keys()]
和 [...map.values()]
的性能(当展开元素处于数组字面量开头时)。他还大幅加速了 Array.from(iterable)
。本文将解释他所做的一些详细修改,这些优化从 V8 v7.2 开始生效。
更快的异步函数和Promise
JavaScript中的异步处理传统上被认为速度不是特别快。更糟糕的是,调试实时JavaScript应用程序——特别是Node.js服务器——并不是一件容易的事,尤其是异步编程。幸运的是,时代正在改变。这篇文章探讨了我们如何优化V8中的异步函数和Promise(也在一定程度上优化了其他JavaScript引擎),并描述了我们如何改进异步代码的调试体验。
在V8中实现排序
Array.prototype.sort
是V8中最后几个用自托管JavaScript实现的内置函数之一。移植它为我们提供了实验不同算法和实现策略的机会,并最终在V8 v7.0 / Chrome 70中让它变得稳定。
提升 V8 中 `DataView` 性能
DataView
s 是 JavaScript 中低级内存访问的两种可能方式之一,另一种是 TypedArray
s。到目前为止,V8 中的 DataView
s 比 TypedArray
s 的优化程度低得多,导致在诸如图形密集工作负载或解码/编码二进制数据的任务中性能较差。这些情况的原因主要是历史选择,例如 asm.js 选择了 TypedArray
s 而不是 DataView
s,从而导致引擎更专注于 TypedArray
s 的性能。