资讯专栏INFORMATION COLUMN

近期的 smoothgate 事件有感乱侃

dance / 1860人阅读

摘要:然而不幸的是还做了一件恶心的事情它会把所有自定义的下方法实现复制到下是提供的自定义。有人在的官方仓库发了个戏谑说建议把改名为,引发大讨论,甚至有人信以为真导致事件越发扩大。于是官博专门发文辟谣。

本文属于乱侃,其中语言可能包含语句不通甚至颠三倒四前后不搭的部分。如引起各位看官的不适请见谅

于是 Array.prototype.flatten 终于变成 Array.prototype.flat 了:https://github.com/tc39/propo...。方法名变成了一个名词或形容词。

我相信这不是标准制定者所情愿的(虽然有人 强行 解释了一下)。万恶之源就是这个叫做 Mootools 的库。我没有用过,但是听说在多年以前的国外被广泛使用。我不想细谈其内部细节,有兴趣的可以看谷歌的这篇博文:https://developers.google.com...

其实类似事情之前就发生过一次。问题出在同一个库身上,相同的解决方案:Array.prototype.contains 最终变成了 Array.prototype.includes

所谓兼容性就是抗历史包袱。如果一个新版本浏览器发布导致用户经常浏览的网站挂掉,他们不会认为这是网站的不对——他们根本不知道类似 Mootools 这种奇葩的存在。他们只知道:我原来用得好好的,怎么升级之后就坏了?从而加固“跟新有风险,升级需谨慎”的印象,甚至形成“升级恐惧症”。

其他语言或多或少都有一些历史包袱,异常沉重的有如 C++,但是这类编译型语言一旦被编译为目标代码,兼容性包袱便转抛给了操作系统。而前端代码不一样,他们被浏览器下载到了客户端解释(或预编译)执行,语言级别的包袱会一直持续下去。语言设计者们已经做过了尝试,比如这个神奇的 "use strict",但是它永远不可能默认开启。

所以 Mootools 那帮人在私自扩展原生对象的原型属性时,有没有想到着可能是一件会阻碍人类文明的发展进程的严重问题呢?

还是补充说明这次 smoothgate 事件的缘由。

Firefox 基于 Array.prototype.flatten 提议(旧版本,现在已经改为 flat)发布了支持该 API 的新版浏览器,导致了至少一个著名站点出现了异常。

Firefox 提供的 Array.prototype.flatten 实现并没有 bug,问题在于网站使用的一个叫 Mootools 的库。它提供了自己 非标准的 Array.prototype.flatten 版本实现。

Array.prototype.flatten = /* 非标准实现 */;

Mootools 提供的实现跟标准不同,然而这不是问题所在。Mootools 会强制覆盖浏览器原生的 Array.prototype.flatten 实现,依赖 MootoolsArray.prototype.flatten 实现的网站并不会因为原生版本和 Mootools 版本不一致而产生问题。

然而不幸的是 Mootools 还做了一件恶心的事情:它会把所有自定义的 Array.prototype 下方法实现复制到 Elements.prototype 下(ElementsMootools 提供的自定义 API)。

for (var key in Array.prototype) {
  Elements.prototype[key] = Array.prototype[key];
}

for-in 循环只会遍历 可枚举的(enumerable)的属性,例如 Array.prototype.sortArray.prototype.push 这些原生的方法都是默认不可枚举的(enumerable: false),新的 Array.prototype.flatten 同样如此。Mootools 用自己的实现覆盖了原生的 Array.prototype.flatten,但是并没有改变方法的 enumerable 属性——Array.prototype.flatten 仍然是不可枚举的,导致 Array.prototype.flatten 不会被复制到 Elements.prototype 下。

于是:所有依赖 Elements.prototype.flatten 的代码全部挂掉了。有人在 TC39 的官方 github 仓库发了个 PR 戏谑说建议把 flatten 改名为 smooth,引发大讨论,甚至有人信以为真导致事件越发扩大。于是 Google Update 官博专门发文辟谣。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95312.html

相关文章

  • Java技术转(兼顾)产品经理——读《快速转行做产品经理》有感

    摘要:第四章总结最后的章节其实是一些自学路上的建议与避免小白走错路的坑。结语感谢作者的分享,也看出作者在行业的丰富经验,同时此书确实很适合小白阅读,阅读轻松而且没有太多专业性词汇,让很多人都能对有一个大致的概念。 博客 猫叔的博客 前言 年前部门一次性购买了一批书,我知道这次我应该会被指派阅读一些偏向于管理类的书籍,但是没想到美女领导直接给了我这本书《快速转行做产品经理》,其实一开始我有点...

    MockingBird 评论0 收藏0
  • 每周分享第 1 期

    摘要:由于微信不能访问外链,需要点击页尾左下角的阅读原文,才能访问本文中的链接。接下来让我带你走进高级前端的世界,在进阶的路上,共勉如果你想加群讨论每期面试知识点,公众号回复加群即可 (关注福利,关注本公众号回复[资料]领取优质前端视频,包括Vue、React、Node源码和实战、面试指导)showImg(https://segmentfault.com/img/remote/1460000...

    Carbs 评论0 收藏0
  • 异常高效使用小窍门 -- 读Scala源码有感

    摘要:关键字是用抛异常来实现的,这样就能提前脱离代码块了。通常的异常有三类。于是我们要知道抛异常为什么慢咋解决的和都是很快很快的,毕竟只是几个地址操作,慢的是这一步,这里要让取得当前的一大串填充进去,开销约为个的程度。 另载于 http://www.qingjingjie.com/blogs/11 熟悉Scala的人知道返回值是代码块的最后一句,一般不能提前返回。return关键字是用抛异常...

    endiat 评论0 收藏0
  • Vuejs 实战观书有感 C1

    摘要:还有一点比较重要的是,如何在快速迭代的软件开发周期内,去解放生产力。于是就会大量涌现很多优秀的开源框架和扩展库,去解决现实生活中的实际问题。而这一切都是在朝着提高开发效率,降低维护成本而前进。结合书中的观点去总结和思考。 关于 Vue.js showImg(https://segmentfault.com/img/bVbk73v?w=252&h=253); 简单小巧的核心(代码压缩后大...

    赵连江 评论0 收藏0
  • Vuejs 实战观书有感 C1

    摘要:还有一点比较重要的是,如何在快速迭代的软件开发周期内,去解放生产力。于是就会大量涌现很多优秀的开源框架和扩展库,去解决现实生活中的实际问题。而这一切都是在朝着提高开发效率,降低维护成本而前进。结合书中的观点去总结和思考。 关于 Vue.js showImg(https://segmentfault.com/img/bVbk73v?w=252&h=253); 简单小巧的核心(代码压缩后大...

    weapon 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<