您好,欢迎访问一九零五行业门户网

除了 async 速度翻 10 倍,JavaScript 还带来了什么?

今天的 javascript 已经无处不在了,以传统的方式使用 javascript,开发者可以在各种 web 浏览器中创建 web 应用;通过 node.js,可以开发命令行工具与服务器等应用;而在桌面领域,通过基于 javascript 与 html、css 等 web 技术的 electron 框架可以构建跨平台桌面应用;react native 则可以用来开发跨平台移动应用;此外,javascript 甚至可以在 iot 设备上运行。
ecma tc39 管理着 ecmascript 生态的发展,它是当前 javascript 语言背后的标准,谷歌 v8 团队一直积极参与 javascript 相关标准化工作。
v8 是谷歌开源的 javascript 引擎(同时也是 webassembly 引擎),chrome、node.js 与 electron 等平台都基于 v8。同时除了 chrome,基于 chromium 的一系列 web 浏览器,如 opera 与即将正式发布的 microsoft edge 在底层也基于 v8。
推荐学习:《javascript视频教程》
在前几天的 google i/o 2019 上,v8 团队的 mathias bynens 与 sathya gunasekaran 分享了 javascript 的最新研发进展。
v8 团队表示,他们的使命是要领导现代 javascript 与 webassembly 高性能,值得关注的是,分享者用了“real-world”描述性能,并介绍所谓“real-world performance”是与那些单纯为了 benchmark 数据的性能相对的,谷歌强调想要达到的是实际上在现实生活中能够做到高性能的效果,而不是那么“出世”。
他们举了几个例子。自 chrome 61 以来,v8 团队将原始 javascript 解析速度提高了一倍,这些数据是在真实网站上测试得到的。同时他们已经成功从主线程中移除了 40% 的解析和编译工作,网页启动变得更加顺滑。
除了 chrome,速度提升在 node.js 中也有很明显的体现,node.js 12 相比 node.js 7,async 速度提升了 10 倍,promise.all 速度提升了 12 倍。
解析速度与运行时性能提高之外,内存占用也减少了,chrome 70 到 chrome 76,android 上运行实际 web 应用的内存消耗减少了 20%。
接下来演讲者分享了 javascript 的一些新特性,涵盖内容很多,下边简单介绍几个比较有意思的特性:
使用方言口语化显示时间短语 api
这是众多新 intl.* api 中的一种,也是观众讨论比较多的一个特性,intl.* 是指国际化特性。
我们日常生活中提到时间的时候会说“上周”、“上个月”与“42 秒前”等口语,使用新的 intl.relativetimeformat() 函数,程序可以使用特定语言返回这些短语,而不是方方正正的“one week ago”、“one month ago”和“42 seconds ago”。
演讲者使用英语与泰米尔语演示了该功能,效果如下:
目前该功能支持秒、分钟、小时、天、周、月与季的短语表示,并且支持多种语言(不清楚有没有中文支持),开发者不再需要维护一个专门的相对时间短语列表。
globalthis
想要编写适用于不同平台的 javascript,不管是 node.js 还是 web 浏览器,都需要有相应的代码来适配全局“this”,比如 web 浏览器,需要使用“window”来判断,但在“window”不可用的情况下,还需要用“self”检查,在 node 中可以用“global”判断,但如果是独立的 javascript shell 环境,那情况又有变化。
环境因素很复杂,各种平台环境需要进行繁杂的适配过程,这对于开发者来说会很痛苦,所以 v8 团队新增了一个“globalthis”特性,它可以在不依赖环境的情况下,轻松访问全局“this”。
目前 chrome、firefox、safari 与 node.js 都已经支持该特性,同时对于 polyfill 与其它需要全局访问“this”的库也适用,从这一点来说该特性是一个比较大的改进。
weakref
通常 javascript 中对象引用意味着只要对对象进行了引用,那么它就不会被 gc,而弱引用中,如果其它对象都不再引用该对象,那么 gc 机制会自动回收该对象所占用的内存,不考虑该对象是否还在该引用的结构中。
目前 javascript 中有 weakmap 与 weakset 两个弱引用方法,只要将对象添加到 weakmap 或 weakset 中,gc 在触发条件时就可以将其占用内存回收。
weakref 是一种更加高级的 api,它提供了一个进入对象生命周期的窗口,可以解决 weakmap 仅支持 object 类型作为 key 的场景。
演讲者以缓存图像为例,map 会锁住图像的 key 与 value,这样图像名和图像数据就不会被 gc,因为它一直被引用着。另一方面,弱引用 weakmap 在这里并不会起作用,因为图像名是一个字符串类型,而 weakmap 规定其 key 只能为 object 类型。
weakref 通过直接缓存图像对象的方法来解决这个问题,图像名作为 key,weakref 弱引用作为 value 存储在缓存中。但这会带来另一个问题:因为图像名是 key,那 map 仍然会一直保留着这些图像名字符串。理想的情况是这些字符串也要被 gc。
weakref 的解决方案是引入一个新的 api “finalizationgroup()”,注册一个回调函数,在 gc 触发时从缓存中删除前边提到的“残留的图像名字符串”。
除了这几点,新的 javascript 语言特性还包括:
class fileds 可以直接在 class 中初始化变量而不用写在构造函数中
私有 setter 与 getter
string.matchall 可以进行正则多次匹配
提高数字可读性,numeric seperators 可以在写数字的时候使用“_”作为分隔符
新的大数字类型 bigint
新增一些 intl.* api,也就是用于国际化的 api,比如 intl.numberformat 本地化格式化数字显示,intl.relativetimeformat() 与 intl.datetimeformat() 本地化显示时间
顶级 await,无需写 async
新的 promise 函数 promise.allsettled() 与 promise.any()
具体内容可以查看演讲视频:
https://www.youtube.com/watch?v=c0oy0vqkeze
以上就是除了 async 速度翻 10 倍,javascript 还带来了什么?的详细内容。
其它类似信息

推荐信息