Polyfill “腻子”(装修的时候,可以把缺损的地方填充抹平)。
比如,html5 的 storage(session, local),不同浏览器,不同版本,兼容性不一样。
Polyfill 就为解决这样的问题而产生的。通过写对应的Polyfill(判断当前浏览器是否支持某功能,如果不支持就写一些支持的补丁代码),把不支持的变成支持。
再如,有些旧浏览器不支持 Number.isNaN 方法,相应的Polyfill如下:
if(!Number.isNaN) {
Number.isNaN = function(num) {
return(num !== num);
}
}
如果浏览器没有 Number.isNaN 方法,就给它添加上去,Polyfill 就是这样解决 API 的兼容问题的。
对 html5 各个特性支持的 Polyfill:https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills。
shim 和 polyfill 有什么区别:
shim 是一个库,它将一个新的 API 引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现一个 polyfill 就是一个用在浏览器 API 上的 shim。 我们通常的做法是先检查当前浏览器是否支持某个 API,如果不支持的话就加载对应的 polyfill。 然后新旧浏览器就都可以使用这个 API 了。
es5-shim 是一个 shim(而不是 polyfill)的例子,它在 ECMAScript 3 的引擎上实现了 ECMAScript 5 的新特性,而且在 Node.js 上和在浏览器上有完全相同的表现(因为它能在 Node.js 上使用, 不光浏览器上, 所以它不是 polyfill)。