Object
.create(proto | null, descriptors?) -> object
.getPrototypeOf(object) -> proto | null
.defineProperty(target, key, desc) -> target, cap for ie8-
.defineProperties(target, descriptors) -> target, cap for ie8-
.getOwnPropertyDescriptor(object, key) -> desc
.getOwnPropertyNames(object) -> array
.keys(object) -> array
.seal(object) -> object, cap for ie8-
.freeze(object) -> object, cap for ie8-
.preventExtensions(object) -> object, cap for ie8-
.isSealed(object) -> bool, cap for ie8-
.isFrozen(object) -> bool, cap for ie8-
.isExtensible(object) -> bool, cap for ie8-
Array
.isArray(var) -> bool
#slice(start?, end?) -> array, fix for ie7-
#join(string = ',') -> string, fix for ie7-
#indexOf(var, from?) -> int
#lastIndexOf(var, from?) -> int
#every(fn(val, index, @), that) -> bool
#some(fn(val, index, @), that) -> bool
#forEach(fn(val, index, @), that) -> void
#map(fn(val, index, @), that) -> array
#filter(fn(val, index, @), that) -> array
#reduce(fn(memo, val, index, @), memo?) -> var
#reduceRight(fn(memo, val, index, @), memo?) -> var
#sort(fn?) -> @, fixes for some engines
Function
#bind(object, ...args) -> boundFn(...args)
String
#split(separator, limit) -> array
#trim() -> str
RegExp
#toString() -> str
Number
#toFixed(digits) -> string
#toPrecision(precision) -> string
parseInt(str, radix) -> int
parseFloat(str) -> num
Date
.now() -> int
#toISOString() -> string
#toJSON() -> string
Example
const person = {
printIntroduction: function () {
console.log(`My name is ${this.name}. Am I human? age ${this.age}`);
}
};
// Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
const me = Object.create(person, {
age: {
value: 18,
writable: true
},
});
> .5% and not last 2 versions
> .5% or not last 2 versions
> .5%, not last 2 versions
browserslist的常用查询条件
> 5%: browsers versions selected by global usage statistics. >=, < and <= work too.
cover 99.5%: most popular browsers that provide coverage.
maintained node versions: all Node.js versions, which are still maintained by Node.js Foundation.
node 10 and node 10.4: selects latest Node.js 10.x.x or 10.4.x release.
current node: Node.js version used by Browserslist right now.
ie 6-8: selects an inclusive range of versions.
Firefox > 20: versions of Firefox newer than 20. >=, < and <= work too. It also works with Node.js.
iOS 7: the iOS browser version 7 directly.
unreleased versions or unreleased Chrome versions: alpha and beta versions.
last 2 major versions or last 2 iOS major versions: all minor/patch releases of last 2 major versions.
since 2015 or last 2 years: all versions released since year 2015 (also since 2015-03 and since 2015-03-10).
dead: browsers without official support or updates for 24 months. Right now it is IE 10, IE_Mob 10, BlackBerry 10, BlackBerry 7, Samsung 4 and OperaMobile 12.1.
last 2 versions: the last 2 versions for each browser.
last 2 Chrome versions: the last 2 versions of Chrome browser.
defaults: Browserslist’s default browsers (> 0.5%, last 2 versions, Firefox ESR, not dead).
not ie <= 8: exclude browsers selected by previous queries.
目录
什么是polyfill
先看张图
要想使用es6+语法,且需要兼容低版本浏览器及手机系统就需要polyfill
polyfill的英文意思是填充工具,意义就是兜底的东西;为什么会有polyfill这个概念,因为ECMASCRIPT一直在发布新的api,当我们使用这些新的api的时候,在旧版本的浏览器上是无法使用的,因为旧的版本上是没有提供这些新的api的,所以为了让代码也能在旧的浏览器上跑起来,于是手动添加对应的api,这就是polyfill;
ECMASCRIPT近几年发布了哪些版本及新的api,兼容性总结
ECMASCRIPT 5 简称es5,首版发布于2009年,2012年发布了5.1
新增的api如下所示,列出常用的方法
Example
ECMASCRIPT 5 简称es5,兼容性,如下图所示
pc端ie9+,ff21+,ch23+,sf6+; mobile端ios6+,android4.4+; node端0.1+
上面的版本都是至少支持90%以上的语法特性,通过上述的兼容性,我们已经能够很好的判断自身所需的兼容性来;如果我们不需要去兼容ie9-及andriod4.4-,ios6-,那我们在使用es5的语法时,是不需要考虑兼容性的;如果我们其中使用来一些es6的语法及api,则需要babel转译及polyfill;
ECMASCRIPT 2015 简称es6,首版发布于2015年6月,且后面的ECMASCRIPT标准,每年发布一次,年号命名
新增的常用api如下所示
Example
ECMASCRIPT 2015,简称es6,兼容性如下图所示
pc端edge12+,ff54+,ch51+,sf10+; mobile端ios10+,android5+; node端6+
ECMASCRIPT 2016 简称es2016,2016年发布的版本
新增的常用api如下所示
Example
ECMASCRIPT 2017 简称es2017,2017年发布的版本
ECMASCRIPT 2018 简称es2018,2018年发布的版本
ECMASCRIPT 2019 简称es2019,2018年发布的版本
core-js是怎么去实现polyfill的
core-js2.x常用的引入方式如下所示
全局polyfill与单个api polyfill的区别,全局是引入es5、es6、es7等新增的所有api的polyfill;而单个只是引入某一个api的polyfill;所以在项目中如果知道使用了哪些api,那么仅引入对应的api的polyfill即可,这样可以减少包的体积;
全局polyfill与没有全局污染的polyfill的区别,有污染的指的是直接在window上添加静态方法or属性,在Array等构造函数上添加静态方法or原型方法,如findIndex方法,会直接添加到Array.prototype的原型上,这就直接污染了Array.prototype;而无污染指的是,不会直接在window上添加静态方法or属性,在Array等构造函数上添加静态方法or原型方法,而是放在了core全局变量or直接export该api;所以'core-js/library'引入的就是无污染的polyfill,源码的实现如下所示,已findIndex为例
全局polyfill与shim区别,shim仅包含标准方法,而全局polyfill除了包含标准方法还有一些非标准的方法,如非标准方法
如何使用browserslist
browserslist用于在不同前端工具之间共享目标浏览器和Node.js版本的配置,如Autoprefixer、babel等;告诉前端工具,当前项目运行的目标浏览器及node版本是,这样工具可以根据目标浏览器及node版本添加对应的css前缀及语法是否需要转化;以babel为例,已模版字符串及async函数为例
模版字符串的兼容性
async的兼容性
babel处理后的index.js
明显模版字符串及async都做例转化,因为我们的目标浏览器是ie >= 9,node版本是7.0.0;这些目标环境都是不支持模版字符串及async,所以都进行例转化;我们修改下目标参数
已支持async函数的版本为目标环境
babel转化后的index.js
明显模版字符串及async都没有做转化,因为我们的目标浏览器是edge >= 15,node版本是7.6.0;这些目标环境都是支持模版字符串及async,所以没有进行例转化;
已支持模版字符串的版本为目标环境
babel转化后的index.js
明显模版字符串没有做转化,而async则做了转化,因为我们的目标浏览器是edge >= 13,node版本是4;这些目标环境都是支持模版字符串但不支持async,所以模版字符串没有被转化,而async进行了转化;
通过babel中对browserslist的使用,可以看出其它前端工具使用browserslist的目的也是一样的;
browserslist的配置方式
browserslist中浏览器关键字
Android
for Android WebView.Baidu
for Baidu Browser.Chrome
for Google Chrome.Edge
for Microsoft Edge.Explorer
orie
for Internet Explorer.Firefox
orff
for Mozilla Firefox.iOS
orios_saf
for iOS Safari.Node
for Node.js.Safari
for desktop Safari.browserslist的组合查询,与、或、非
or
and
not
browserslist的常用查询条件
> 5%
: browsers versions selected by global usage statistics.>=, < and <=
work too.cover 99.5%
: most popular browsers that provide coverage.maintained node versions
: all Node.js versions, which are still maintained by Node.js Foundation.node 10
andnode 10.4
: selects latest Node.js 10.x.x or 10.4.x release.current node
: Node.js version used by Browserslist right now.ie 6-8
: selects an inclusive range of versions.Firefox > 20
: versions of Firefox newer than20. >=
,< and <=
work too. It also works with Node.js.iOS 7
: the iOS browser version 7 directly.unreleased versions or unreleased Chrome versions
: alpha and beta versions.last 2 major versions or last 2 iOS major versions
: all minor/patch releases of last 2 major versions.since 2015 or last 2 years
: all versions released since year 2015 (also since 2015-03 and since 2015-03-10).dead
: browsers without official support or updates for 24 months. Right now it is IE 10, IE_Mob 10, BlackBerry 10, BlackBerry 7, Samsung 4 and OperaMobile 12.1.last 2 versions
: the last 2 versions for each browser.last 2 Chrome versions
: the last 2 versions of Chrome browser.defaults
: Browserslist’s default browsers (> 0.5%, last 2 versions, Firefox ESR, not dead).not ie <= 8
: exclude browsers selected by previous queries.参考链接: https://github.com/browserslist/browserslist https://caniuse.com/ https://kangax.github.io/compat-table/es6/ https://github.com/zloirock/core-js