<output id="ilehw"><bdo id="ilehw"><nobr id="ilehw"></nobr></bdo></output>
        <dl id="ilehw"><font id="ilehw"></font></dl>
          1. 除了 async 速度翻 10 倍,JavaScript 还带来了什么?

            h4cd
             h4cd
            发布于 2019年05月14日
            收藏 78

            今天的 JavaScript 已经无处不在了,以传统的方式使用 JavaScript,开发者可以在各种 Web 浏览器中创建 Web 应用;通过 Node.js,可以开发命令行工具与服务器等应用;而在桌面领域,通过基于 JavaScript 与 HTML、CSS 等 Web 技术的 Electron 框架可以构建跨平台桌面应用;React Native 则可以用来开发跨平台移动应用;此外,JavaScript 甚至可以在 IoT 设备上运行。

            Ecma TC39 管理着 ECMAScript 生态的发展,它是当前 JavaScript 语言背后的标准,谷歌 V8 团队一直积极参与 JavaScript 相关标准化工作。

            V8 是谷歌开源的 JavaScript 引擎(同时也是 WebAssembly 引擎),前面提到的 Chrom、Node.js 与 Electron 等平台都基于 V8。同时除了 Chrome,基于 Chromium 的一系列 Web 浏览器,如 Opera 与即将正式发布的 Microsoft Edge 在底层?#19981;?#20110; V8。

            在前几天的 Google I/O 2019 上,V8 团队的 Mathias Bynens 与 Sathya Gunasekaran 分享了 JavaScript 的最新研发进展。



            V8 团队表示,他们的使命是要领导现代 JavaScript 与 WebAssembly 高?#38405;埽?#20540;得关注的是,分享者用了“real-world”描述?#38405;埽?#24182;介绍所谓“real-world performance”是与那些单纯为了 benchmark 数据的?#38405;?#30456;对的,谷歌强调想要达到的是?#23548;?#19978;在现实生活中能够做到高?#38405;?#30340;效果,而不是那么“出世”。

            他们举了几个例子。自 Chrome 61 以来,V8 团队将原始 JavaScript 解析速度提高了一倍,这些数据是在真实网站?#21916;?#35797;得到的。同时他们已经成功从主线程中移除了 40% 的解析和编译工作,网页启动变得更加顺滑。

            除了 Chrome,速度提升在 Node.js 中也有很明显的体现,Node.js 12 相比 Node.js 7,async 速度提升了 10 倍,Promise.all 速度提升了 12 倍。

            解析速度与运行时?#38405;?#25552;高之外,内存占用?#24067;?#23569;了,Chrome 70 到 Chrome 76,Android 上运行?#23548;?nbsp;Web 应用的内存消耗减少了 20%

            接下来演讲者分享了 JavaScript 的一些新特性,涵盖内容很多,下边简单介绍几个比较有意思的特性:

            使用方言口语化显示时间短语 API

            这是众多新 Intl.* API 中的一种,也是观众讨论比较多的一个特性,Intl.* 是指国际化特性。

            我们日常生活中提到时间的时候会说“上周”、“上个月”与“42 秒前”等口语,使用新的 Intl.RelativeTimeFormat() 函数,程序可以使用特定语言返回这些短语,而不是方方正正的“one week ago”、“one month ago”和“42 seconds ago”。

            演讲者使用英语与泰米尔语演示了该功能,效果如下:

            目前该功能支持秒、?#31181;印?#23567;时、天、周、月与季的短语表示,并且支持多种语言(不清楚有没有中文支持),开发者不再需要维护一个专门的相对时间短语列表。

            globalThis

            想要编写适用于不同平台的 JavaScript,?#36824;?#26159; Node.js 还是 Web 浏览器,都需要有相应的代码来适配全局“this”,比如 Web 浏览器,需要使用“window”来判断,但在“window”不可用的情况下,还需要用“self”检查,在 Node 中可以用“global”判断,但如果是独立的 JavaScript shell 环?#24120;?#37027;情况又有变化。

            环境因素很复杂,各种平台环境需要进行繁杂的适配过程,这对于开发者来说会很?#32431;啵?#25152;以 V8 团队新增了一个“globalThis”特性,它可以在不?#35272;?#29615;境的情况下,轻松访问全局“this”。

            目前 Chrome、FireFox、Safari 与 Node.js 都已经支?#25351;?#29305;性,同?#20493;?#20110; 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 可以进行正则多次匹配
            • 提高数字可?#21015;裕琻umeric seperators 可以在写数字的时候使用“_”作为分隔符
            • 新的大数字类型 BigInt
            • 新增一些 Intl.* API,也就是用于国际化的 API,比如 Intl.NumberFormat 本地化格式化数字显示,Intl.RelativeTimeFormat() 与 Intl.DateTimeFormat() 本地化显示时间
            • 顶级 await,无需写 async
            • 新的 Promise 函数 Promise.allSettled() 与 Promise.any()

            具体内容可以查看演讲视频:

            本站文章除注明转载外,均为本站原创或编译。?#38431;?#20219;何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
            转载请注明:文章转载自 OSCHINA 社区 [http://www.bswx.tw]
            本文标题:除了 async 速度翻 10 倍,JavaScript 还带来了什么?
            加载中

            精彩评论

            红薯
            红薯
            原来逆天的是 JavaScript !
            青衿
            青衿
            一切能用js实现的终将被js实现!
            k
            keep_wan
            然并卵。啥都想干。啥都干不了。 rn跨平台那是建立在调原生组件基础上。同时维护三套代码。nodejs 大多数情况下都是当成工具使用。 而不是做成真正的后端.
            南漂一卒
            南漂一卒
            new WeakMap().set(Object('xxx'), object)
            也可以解决基本值不能做弱引用键的问题
            我没有抓狂
            我没有抓狂
            尾递归啥时候支持

            最新评论(32

            LeoXu1990
            LeoXu1990
            Nodejs正在慢慢统治Handless爬虫界.
            xybin1990
            xybin1990

            引用来自“帅的冒泡美的掉渣”的评论

            牛逼牛逼????,昊天不灭,Java永存
            西陵??
            帅的冒泡美的掉渣
            帅的冒泡美的掉渣
            牛逼牛逼????,昊天不灭,Java永存
            iman123
            iman123
            在Chrome开发者工具中尝试了一下,支?#31181;?#25991;的,赞


            rtf=new Intl.RelativeTimeFormat('zh', {numeric:'auto'})
            rtf.format(-1,'day')

            Nodejs 12.0.0 还不支持,指定 zh,单输出的还是 yesterday
            音符乱弹
            音符乱弹
            开发者不是一直?#19981;?#25512;翻这个,改进那个么。我要坐等有人推翻JS,抛弃html。
            云飞9731
            chrom上yy好像从去年就一直?#35272;#?#25171;开网页看视频,过一会就内存爆涨?#35272;#?#25110;是莫名?#35272;#?#30452;到74才好了
            l
            linhuijun

            引用来自“hxb0113”的评论

            :bowtie:
            ??
            hxb0113
            hxb0113

            引用来自“红薯”的评论

            原来逆天的是 JavaScript !
            ??
            hxb0113
            hxb0113
            :bowtie:
            waylau
            waylau
            看好!

            itest(爱测试) 3.3.1 小改紧急发布,敏捷测试管理 & BUG 跟踪管理软件

            v3.3.1 下载地址 :itest下载 itest 简介:查看简介 用户反馈并强烈要求增强的功能实现: 测试包”一心两用“ 测试包中增加预计开始时间,预?#24179;?#26463;时间,?#23548;?#24320;始时间,以便不以迭代的方式执...

            itestAndy
            昨天 22:56
            0

            坑爹代码 | 这个 unsigned 我看了半天才想明白

            下面这段再简单?#36824;?#30340;代码,你能猜出是什么结果吗? int main() { unsigned int i = 10; for(i ; i >=0; i--) { printf("@[email protected]<-->@[email protected]\n"); } printf...

            红薯
            昨天 22:43
            2

            SOFALookout 发布 v1.6.0 | 蚂蚁金服开源轻?#32771;都?#25511;分析系统

            发布 SOFALookout v1.6.0 , 主要变更如下: i. 服务器端代码正式发布(Add metrics server-side code) SOFALookout 简介: SOFALookout 是一个利用多维度的 metrics 对目标系统进行度量和监...

            SOFAStack
            昨天 17:38
            0

            Proxy-Go SDK v7.6 发布,强化智能DNS,新增连接重定向!

            Proxy-Go全平台SDK是android和ios平台下面可以直接调用的sdk类库,基于此类库,APP开发者可以轻松的开发出各种形式的代理工具。 更新内容: http(s)\socks\sps\tcp\内网穿透 代理底层传输协议增...

            狂奔的蜗牛.
            昨天 17:08
            2

            Mybatis-Plus 3.1.2 发布,日常优化

            Mybatis-Plus 3.1.2 发布了,Mybatis-Plus是一款MyBatis的增强工具包,简化 CRUD 操作。启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。Mybatis-Plus 启动注入非拦...

            青苗
            昨天 16:42
            5

            没有更多内容

            加载失败,请刷新页面

            加载更多

            返回顶部
            顶部
            广东快乐十分实时开奖

                  <output id="ilehw"><bdo id="ilehw"><nobr id="ilehw"></nobr></bdo></output>
                  <dl id="ilehw"><font id="ilehw"></font></dl>

                            <output id="ilehw"><bdo id="ilehw"><nobr id="ilehw"></nobr></bdo></output>
                            <dl id="ilehw"><font id="ilehw"></font></dl>
                              1. 2019北京pk10直播视频 排球垫球用力顺序 御金娱乐城代理 上海基诺KENO开奖 贵州快三遗漏数据 黑龙江22选5规则 秒速时时彩在线计划 广州电子游戏国际产业展 上海快3一定牛预测 双色球6十5怎么投注 深圳风采三个 3d彩票走势图软件下载 最新内蒙古11选5走势图 3d真人游戏机 甘肃十一选五18022走势图