关于Javascript:
除非你是添加界面而不是改变现有行为,否则是否有充分的理由避免使用它?
是的。最坏的情况是,即使您不修改
现有 行为,也可能损坏语言的
未来 语法。
这正是
Array.prototype.flatten
和
Array.prototype.contains
所发生的事情。简而言之,这些方法的规范被编写出来,它们的提案到达了
第三阶段,然后浏览器开始发布它们。但在两种情况下,发现有古老的库将内置的
Array
对象与其自己的方法
使用相同的名称 进行了修补,并且具有不同的行为;结果导致网站崩溃,浏览器不得不退出新方法的实现,并且必须编辑规范。(方法被重新命名。)
如果您在自己的浏览器、自己的电脑上改变内置对象(如
Array
),那么这是可以的,特别是对于用户脚本来说非常有用。但是,如果您在公共网站上改变内置对象,那就不太好了——这可能最终会导致像上面提到的问题一样的麻烦。如果您恰好控制着一个大型网站(比如stackoverflow.com),并且改变了内置对象,那么几乎可以保证浏览器将拒绝实现破坏您网站的新功能/方法(因为那么该浏览器的用户将无法使用您的网站,并且他们更有可能迁移到其他浏览器)。(请参见
此处,了解规范编写者和浏览器制造商之间这种交互的解释)
总之,关于您问题中的具体例子:
例如,向那些没有实现ECMAScript第5版的Web浏览器添加一个Array.map实现可能是不错的。
这是一种非常常见和可靠的技术,称为polyfill。
一个 polyfill 是一段代码,用于在不支持该功能的 web 浏览器上实现该功能。通常,它指的是一种 JavaScript 库,用于在旧版浏览器上实现 HTML5 网页标准,可以是某些浏览器支持的已建立标准,也可以是现有浏览器上未受任何浏览器支持的拟议标准
例如,如果您为 Array.prototype.map
(或者以更新的例子,为 Array.prototype.flatMap
)编写了一个 polyfill,它与官方阶段4规范完全一致,然后在没有这个功能的浏览器上运行定义了 Array.prototype.flatMap
的代码:
if (!Array.prototype.flatMap) {
Array.prototype.flatMap = function(...
}
}
如果您的实现是正确的,那么这是完全可以的,并且在整个网络上非常普遍,以便过时的浏览器可以理解较新的方法。
polyfill.io 是这种情况下常见的服务。