我原以为
array.push
是一个非常基本的功能,所以我很惊讶地看到 Chromium 浏览器的 Babel polyfill array.push
。我检查了 MDN 文档中的 array.push 并看到它说:
另请参阅
core-js 中 Array.prototype.push 的 Polyfill 并修复了此方法
我检查了core-js文档及其实现,但不清楚它如何“修复”Chromium浏览器中的问题。
那么问题出在哪里呢? Firefox/Safari 的实现与 Chromium 的实现有何不同?检查以下输出以供参考。
The corejs3 polyfill added the following polyfills:
es.object.to-string { "ie":"10" }
es.promise { "ie":"10" }
web.dom-collections.for-each { "ie":"10" }
es.array.from { "ie":"10" }
es.string.iterator { "ie":"10" }
es.array.push { "chrome":"115", "edge":"110", "ie":"10" } //Only for Chromium, not for FF & Safari
...
我的第二个问题是,如果我不想让 Babel 进行 Polyfill
array.push
(但需要它来 Polyfill 其他缺失的功能),我该怎么办?以下设置不行。
"useBuiltIns": "usage",
"shippedProposals": true,
"corejs": {
"version": 3.33
"proposals": false
}
那么问题出在哪里?
当浏览器允许将数组长度设为不可写(如此处所示)时,它会影响
Array.push()
方法,因为 Array.push()
将指定元素添加到数组末尾并返回数组的新长度。 如果数组长度设置为不可写,则数组将无法更新它。这会导致错误。不幸的是,这没有被考虑到需要引用所以当发现错误时,必须解决它。这就是你刚刚遇到的