抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

“#smoosh 门”引发 Web 兼容性上的挑战

2018 年 3 月 28 日

TC39 提案 Array.prototype.flatten 会导致旧网站在 Firefox Nightly 版中无法正常显示。在回应这一软件缺陷报告时,该新特性的建议者开玩笑称会考虑将“flatten”改名为“smoosh”。这在JavaScript 社区引发了大范围的口诛笔伐。

这场争论之所以愈演愈烈,不仅在于建议更改名称这个玩笑,更是因为在不破坏Web 兼容性的条件下如何推进JavaScript 语言的问题上存在着挑战。

作为一项提案, Array.prototype.flatten 意在解决一个通常由 JavaScript 软件库和架构解决的问题,即如何将嵌套数组展平为单一数组。例如:

复制代码
var arr1 = [1, 2, [3, 4]];
arr1.flatten();
// [1, 2, 3, 4]

该 API 的更改,本身是对 JavaScript 中的一个常见模式的改进。不幸的是,一些 JavaScript 软件库和框架,例如 Prototype 和 MooTools 等,其早期版本中为添加对此特性的支持,采用了一种扩展内建语言特性原生原型的模式。很多软件库最终认识到,这并非是一种好做法,因而决定另辟蹊径去实现语言上的改进。

问题由一家名为“ wetteronline ”的德国气象网站爆出。最终,问题的讨论转向对为什么 Space Jam 网站自 1996 年至今一直正常工作的关注,尽管 Space Jam 网站本身并未受到“#smoosh 门”的影响。

MooTools 中定义的 Array.prototype.flatten,是一种不同于 TC39 建议标准的非标准版本。MooTools 覆盖了浏览器的原生实现,这一做法本身并不存在问题。但是,MooTools 将其定制的数组方法克隆到 Elements.prototype API。JavaScript 的“for-in”只支持遍历可枚举属性,不包括原生方法。如果工程师覆写了一个不可枚举属性,该属性依然是不可枚举的。这样,原生版本的 Array.prototype.flatten 并未拷贝到 MooTools 的 Elements API,破坏了 MooTools 的 Elements.prototype.flatten。

当前 Web 网站上的挑战已转变为,一旦旧软件库中已实现了一些限制引入非破坏性更改能力的特性,人们难以确定如何扩展 Web。一些从长期缺乏维护的网站虽然依然工作,但是一旦添加了不兼容的改进,就会不工作。这时,让编写网站的人去实现升级可能并不现实,或许在网站不再需要活跃维护的情况下才有可能。

为避免将来出现此类问题,不鼓励工程师去扩展或替换原生的对象或特性,也不要扩展全局命名空间。就当前的 ES2015+ 而言, Symbols 等特性提供了更好的机制,可在需要时扩展原生对象,而不会更改内建原生对象的行为。

为终结该提案以添加到 ECMAScript 的将来版本中,所考虑的一些替代方案包括:对 flatten 更名(当然不是 smoosh)、将 flatten 作为 Array.prototype 上的值存取器(accessor pair),以及为 flatten 新建一个固有对象。

“#smoosh 门”并非 JavaScript 生态系统中首次爆发的大规模辩论。以前曾发生过涉及“ left-pad ”和“尾随分号”(trailing semicolons)等问题的辩论。

查看英文原文: #smooshgate and the Challenges of Web Compatibility

2018 年 3 月 28 日 19:00704
用户头像

发布了 381 篇内容, 共 99.2 次阅读, 收获喜欢 229 次。

关注

评论

发布
暂无评论
发现更多内容

港美股交易系统开发框架构造简述篇

软件开发大鱼V15724971504

国际配售 港股交易系统开发 证券交易系统 资管系统 港股打新系统

构师训练营第八周学习笔记

李日盛

笔记

装机必备:借用IDM实现百度云高速下载

懒得勤快

恕我直言!有了这份MySQL学习文档,你收藏夹里的其他MySQL学习资料都可以扔了

Java架构之路

Java 程序员 架构 面试 编程语言

使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘

华为云开发者社区

LiteOS 脚本 语言

JS&Swift

ios swift

话题讨论 | 程序员自己电脑中毒是甚么体验?

xcbeyond

话题讨论

我哭了!Centos6停止更新只能切换7,哪些习惯也需要切换

996小迁

Java 架构 面试 Centos6

三分钟看懂新一代.Net Core3.1工作流引擎平台

Philips

敏捷开发 工作流

github上标星70.5k,贼火的Java突击手册,全面详细对标阿里P7

Crud的程序员

Java 多线程 架构师 java面试 java基础

什么是802.11ax(Wi-Fi 6)

服务于阿里、滴滴、华为等一线互联网公司的分布式消息中间件RocketMQ核心笔记

Java架构追梦

Java 架构 面试 RocketMQ 消息中间件

动态高并发时为什么推荐ReentrantLock而不是Synchronized?

moon聊技术

JVM 并发 synchronized ReentrantLock 锁升级

官方活动 | 盘点2020有奖征文

InfoQ写作平台官方

活动专区 盘点2020

我哭了!Centos6停止更新只能切换7,哪些习惯也需要切换

小Q

Java Linux centos 学习 面试

训练营第八周作业

大脸猫

极客大学架构师训练营

Spark-submit执行流程,了解一下

华为云开发者社区

spark 技术 流程

华为云亮相QCon2020深圳站,带你体会大厂的云原生玩法与秘诀

华为云开发者社区

专家 华为云 深圳

了解OAuth2.0

环信

请问如何短时间突击 Java 通过面试?

Java架构师迁哥

一周信创舆情观察(11.30~12.6)

统小信uos

训练营第八周总结

大脸猫

极客大学架构师训练营

刚拿到蚂蚁金服架构师offer!大佬教你如何成为offer收割机

比伯

Java 编程 架构 面试 计算机

最简单的Go Dockerfile编写姿势,没有之一!

万俊峰Kevin

go Docker Dockerfile

LeetCode题解:515. 在每个树行中找最大值,DFS,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

滴滴DoKit-功能介绍之文件同步助手

工具 文件 DoKit

SGY奇点交易所系统软件APP开发

开發I852946OIIO

系统开发

DolphinDB与Elasticserach在金融数据集上的性能对比测试

DolphinDB

数据处理 金融 时序数据库 tsdb DolphinDB

《迅雷链精品课》第十二课:PoW共识算法

迅雷链

区块链

让垃圾分类开发“极快致简”的好物件,零基础的开发小白也能轻松驾驭它!

华为云开发者社区

数据 分类

助力孩子走上学霸之路,K12学习神器现已面世!

新闻科技资讯

Study Go: From Zero to Hero

Study Go: From Zero to Hero

“#smoosh门”引发Web兼容性上的挑战-InfoQ