[译]V8发布4.9版本

简介:

原文:V8 Release 4.9

作为发布流程的一部分,大约每隔6周,我们就会创建一个新的V8分支。每个版本都是在Chrome浏览器项目创建beta milestone分支前一刻从V8的master分支创建的。今天,我们很高兴宣布我们最新的分支4.9将处于beta阶段,直到它随Chrome 49稳定版本发布。V8 4.9版本带来一些对开发者的利好,所以我们想带你预览下几周后发布的这个版本的一些亮点。

常青浏览器项目一般每6周发布一次新版本,如Chrome,Edge,Firefox。V8的发布流程跟Chrome浏览器发布流程同步。

91% 的 ECMAScript 2015(ES6) 特性支持

在V8 4.9版本中,我们发布了有史以来最多的一批JavaScript ES2015 新特性,按照Kangax 兼容表(截止2016.1.26),我们已经达到了91%的完成度。V8现在支持解构(destructuring),默认参数,代理(Proxy)对象和反射(Reflect)API。4.9版本支持非严格模式下的块级结构,如classlet,还支持正则表达式的sticky标记和可自定义的Object.prototype.toString输出。

解构

变量声明、参数和赋值现在通过模式匹配支持对对象和数组的解构。例如:

let o = {a: [1, 2, 3], b: {p: 4}, c: {q: 5}};
let {a: [x, y], b: {p}, c, d} = o;            // x=1, y=2, p=4, c={q: 5}
[x, y] = [y, x];                              // x=2, y=1
function f({a, b}) { return [a, b] }
f({a: 4})                                     // [4, undefined]

数组形模式匹配可以通过剩余值模式把数组的剩余部分赋值:

let [x, y, ...r] = [1, 2, 3, 4];              // x=1, y=2, r=[3,4]

另外,模式匹配的元素可以给定默认值以处理没有对应属性的情况:

let {a: x, b: y = a} = {a: 4};                // x=4, y=4
let [x, y = 0, z = 0] = [1, 2];               // x=1, y=2, z=0

解构可以使从对象和数据获取数据的代码更紧凑。

Proxies & Reflect

经过几年的开发,V8现在有一个完全的proxies实现,完全同步到ES2015规范。通过一组开发者提供的钩子定制属性的访问,Proxies是一种强大的虚拟化对象和函数的机制。除此之外,proxies也可以用于实现属性设置的拦截、校验,简化调试和剖析,以及像membranes解锁高级抽象

欲代理一个对象,你必须创建一个定义了各种陷阱(trap)的占位句柄对象,并将它应用到代理虚拟化的目标对象:

let target = {};
let handler = {
  get(receiver, name="world") {
    return `Hello, ${name}!`;
  }
};

let foo = new Proxy(target, handler);
foo.bar

代理对象伴随着反射模块,其为所有代理陷阱定义了适合的默认操作:

let debugMe = new Proxy({}, {
  get(target, name, receiver) {
    console.log(`Debug: get called for field: ${name}`);
    return Reflect.get(target, name, receiver);
  },
  set(target, name, value, receiver) {
    console.log(`Debug: set called for field: ${name}, and value: ${value}`);
    return Reflect.set(target, name, value, receiver);
  }
});

debugMe.name = "John Doe";
// Debug: set called for field: name, and value: John Doe
let title = `Mr. ${debugMe.name}`; // "Mr. John Doe"
// Debug: get called for field: name

更多的关于Proxies和Reflect API的使用,可以参见MDN的Proxy页面的示例章节,及在 Web Fundamentals blog查看我们即将到来Proxies相关文章。

默认参数

在ES5或更低的规范中,可选参数在函数定义中的需要样板式的代码来检查是否参数是未定义:

function sublist(list, start, end) {
  if (typeof start === "undefined" || start === null) start = 0;
  if (typeof end === "undefined" || end === null) end = list.length;
  ...
}

ES2015现在允许函数参数可以具有默认值,以提供更清晰,更简明的函数定义:

function sublist(list, start = 0, end = list.length) { ... }
sublist([1, 2, 3], 1)  // sublist([1, 2, 3], 1, 3)

默认参数和解构当然也可以在一起使用:

function vector([x, y, z] = []) { ... }

sloppy模式下的Classes和词法声明

V8自版本4.1和4.2分别支持词法声明(let, const, 块级function)和类,但至今为止使用到它们需要严格模式。按照ES2015规范,V8 4.9版本中,所有这些特性现在在严格模式之外也启用。这使得可以在开发者工具控制台中制作原型容易得多,但我们还是鼓励开发者升级新代码到严格模式。

未指定模式的情况即是sloppy模式。

正则表达式

V8现在支持正则表达式的新的sticky标记。sticky标记切换字符串中的搜索是从前开始(normal)还是从lastIndexs属性开始(sticky)。在用多个不同正则表达式对任意长输入字符串进行高效解析时,这个行为是有用的。要启用sticky搜索,添加y标志到正则表达式即可:(e.g. var regex = /foo/y;)。

可定制的Object.prototype.toString输出

使用Symbol.toStringTag, 当传递用户定义的类型给Object.prototype.toString现在可以返回自定义的输出。直接或者作为字符串强制的结果:

class Custom {
  get [Symbol.toStringTag]() {
    return "Custom"
  }
}
Object.prototype.toString.call(new Custom)  // "[object Custom]"
String(new Custom)                          // "[object Custom]"

改进Math.random()

V8 4.9版本包含一个Math.random()的实现的改进。如上个月的公告,我们切换V8的PRNG算法到xorshift128+以提供更高质量的伪随机性。

V8 API

请检查我们的API修改汇总。每个主要版本发布后,该文件经常已经更新了几个礼拜了。

积极更新的开发者们可以使用git checkout -b 4.9 -t branch-heads/4.9来体验V8 4.9版本的新特性。另外你可以订阅Chrome’s Beta频道并自己尝试新功能。

目录
相关文章
|
JavaScript
js 使用fetch来上传文件 formdata()
js 使用fetch来上传文件 formdata()
|
存储 SQL NoSQL
ClickHouse和Doris超大数据集存储
ClickHouse和Doris超大数据集存储
1791 0
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文分享了基于FPGA的2ASK+帧同步系统硬件测试版本,包含ILA数据采集、VIO SNR设置及数据源模块。通过调整SNR(如45dB和10dB),实现对调制解调性能的验证。2ASK调制将数字信号转为二进制码,通过载波振幅变化传输;帧同步用于确定帧起始位置,确保数据正确解调。附带操作视频与核心Verilog代码,便于理解和复现。
156 9
|
云安全 存储 供应链
云上快报 | 阿里云混合云再攀新高 斩获信通院2项大奖 高分通过电子四院云基准评测获引领级
随着企业数字化转型进程推进,各行业企业在数字基础设施一体化云平台、研运数字化治理、客户服务、人力资源、供应链等业务单元对数字化产品平台以及相关服务商数字化服务能力的需求逐渐明晰,如何选择可信的数字化服务成为企业推进自身数字化工作的关键。近日,阿里云混合云凭借业界领先的能力,屡获多个国家权威级机构的认证和大奖:高分通过电子四院云基准评测获引领级、混合云解决方案顺利通过可信云【混合云安全能力要求】增强级(最高级)认证、全国首批通过数字化可信服务评估的企业等,成为政企数字化转型的首选技术基础设施。
4242 0
云上快报 | 阿里云混合云再攀新高 斩获信通院2项大奖 高分通过电子四院云基准评测获引领级
|
9月前
|
人工智能 自然语言处理 API
AppFlow:无代码部署Dify成为公众号客服
本文介绍如何通过计算巢AppFlow无代码部署Dify应用,并将其配置到微信公众号中作为智能客服使用。具体步骤包括:访问计算巢AppFlow模板中心选择Dify实例模版,创建连接流并配置Dify和微信公众号的鉴权凭证,完成部署后发布连接流。最终,您可以通过微信公众号发送消息,接收AI智能客服的回复。
1379 9
AppFlow:无代码部署Dify成为公众号客服
|
文字识别 算法 API
阿里云文档解析(大模型版)优化
阿里云文档解析(大模型版
给input框设置成选择日期,并且精确到时分秒
给input框设置成选择日期,并且精确到时分秒
721 1
|
缓存 NoSQL PHP
【PHP开发专栏】PHP缓存机制与实现
【4月更文挑战第29天】本文介绍了PHP缓存的基本概念、策略及实现方式。PHP缓存包括应用缓存、Web服务器缓存、数据库缓存和分布式缓存,常见策略有缓存预热、更新和懒加载。PHP的缓存实现包括文件缓存、APC、OPcache、Memcached和Redis。最佳实践包括缓存热点数据、控制粒度、设置失效策略、保证一致性和确保安全性。文中还提供了一个新闻列表和详情页的缓存实战示例,帮助开发者理解如何在实际项目中应用缓存。
379 1
|
机器学习/深度学习 PyTorch 算法框架/工具
ModelScope问题之训练的时候卡住如何解决
ModelScope训练是指在ModelScope平台上对机器学习模型进行训练的活动;本合集将介绍ModelScope训练流程、模型优化技巧和训练过程中的常见问题解决方法。
269 1
ModelScope问题之训练的时候卡住如何解决
|
开发工具 git
vscode设置 git提交代码忽略node_modules,dist,vscode如何设置不提交node_modules,dist
vscode设置 git提交代码忽略node_modules,dist,vscode如何设置不提交node_modules,dist
1923 0