关于Javascript:
假设您要添加到界面而不更改现有行为,是否有充分的理由避免它?
是的。最坏的情况是,即使您不更改现有行为,也可能会损坏该语言的未来语法。
这正是和发生的Array.prototype.flatten
事情Array.prototype.contains
。简而言之,为这些方法编写了规范,他们的提案进入了第 3 阶段,然后浏览器开始发布它。Array
但是,在这两种情况下,都发现有一些古老的库用自己的方法修补了内置对象,这些方法与新方法的名称相同,并且具有不同的行为;结果,网站崩溃了,浏览器不得不退出他们对新方法的实现,并且不得不编辑规范。(这些方法已重命名。)
Array
如果您像在您自己的浏览器、您自己的计算机上那样改变一个内置对象,那很好。(这对于用户脚本来说是一种非常有用的技术。)如果您在面向公众的网站上改变一个内置对象,那就不太好 - 它最终可能会导致上述问题。如果你碰巧控制了一个大网站(比如 stackoverflow.com)并且你改变了一个内置对象,你几乎可以保证浏览器会拒绝实现破坏你网站的新功能/方法(因为那个浏览器的用户不会能够使用您的网站,他们将更有可能迁移到不同的浏览器)。(请参阅此处了解规范编写者和浏览器制造商之间的此类交互的解释)
所有这一切,关于你问题中的具体例子:
例如,将 Array.map 实现添加到不实现 ECMAScript 第 5 版的 Web 浏览器可能会很好
这是一种非常常见且值得信赖的技术,称为polyfill。
polyfill 是在不支持该功能的 Web 浏览器上实现该功能的代码。大多数情况下,它指的是实现 HTML5 Web 标准的 JavaScript 库,可以是旧浏览器上的既定标准(某些浏览器支持),也可以是现有浏览器上的提议标准(任何浏览器不支持)
例如,如果您编写了一个完全符合Stage 4 官方规范的polyfill for Array.prototype.map
(或者,以较新的示例,for Array.prototype.flatMap
),然后运行在尚未拥有它的浏览器上定义的代码:Array.prototype.flatMap
if (!Array.prototype.flatMap) {
Array.prototype.flatMap = function(...
// ...
}
}
如果你的实现是正确的,这完全没问题,并且在整个网络上都很常见,这样过时的浏览器就可以理解更新的方法。polyfill.io是此类事情的常用服务。