Javascript 为什么在使用babel loader时Object.assign()需要多边形填充?

Javascript 为什么在使用babel loader时Object.assign()需要多边形填充?,javascript,ecmascript-6,webpack,babeljs,Javascript,Ecmascript 6,Webpack,Babeljs,我试图在Babel用webpack编译的ES6 web应用程序中使用Object.assign(),但出现错误: Uncaught TypeError: Object.assign is not a function 我已经在使用将ES6传输到ES5,所以我的所有其他ES6代码都正常工作。然而,Object.assign()仅在我在代码库中导入“babel core/polyfill”之后才起作用。我知道我也可以解决这个问题,但我想理解为什么Object.assign()需要的比babel-l

我试图在Babel用webpack编译的ES6 web应用程序中使用
Object.assign()
,但出现错误:

Uncaught TypeError: Object.assign is not a function

我已经在使用将ES6传输到ES5,所以我的所有其他ES6代码都正常工作。然而,
Object.assign()
仅在我在代码库中导入“babel core/polyfill”之后才起作用。我知道我也可以解决这个问题,但我想理解为什么
Object.assign()
需要的比
babel-loader
执行的更多-不应该
babel-loader
预处理一切,包括
Object.assign()

babel,通过
babel-loader
,跨越ES6语法的差异。Babel本身完全没有添加ES6标准库功能(如
Object.assign
)。加载多边形填充将为您加载单独的多边形填充,但您可以加载所需的任何多边形填充

甚至有些语法转换依赖于特定的polyfill功能来加载,因为有些语法依赖于库代码中实现的算法和行为。每个ES6功能都列出了假定已加载的标准库功能。

Object.assign()
是ES6规范的一部分,是一个新的API,因此大多数浏览器尚未实现。见:

因此,当您导入
babel core/polyfill
时,它会将polyfill添加到该API和其他新API中,以便您的ES6代码可以使用它们


babel loader
只是将ES6语法转换为ES5兼容代码的传输工具。

如果您深入了解兼容性,您会发现Web和Mobile for object.assign都不支持IE 11。它还为你提供了pollyfill

if(type of Object.assign!=“function”){
Object.assign=函数(target,varArgs){
"严格使用",;
如果(target==null){//TypeError如果未定义或为null
抛出新的TypeError('无法将未定义或null转换为对象');
}
var to=对象(目标);
for(var index=1;index
如果使用巴别塔

如果使用NPM


我也面临同样的问题。我认为在巴贝尔的支持下,我可以安全地使用所有ES2015+功能。但正如上面提到的,babel只填充语法,不填充函数(Object.assign、Array.includes仅举几个例子)。 对于Object.assign,我不喜欢使用多边形填充,而是使用排列运算符。在这种情况下,babel实际上会填充Object.assign(如果未找到)。请看下面的代码:

let obj = {a: 1};
let obj2 = {...obj};
let obj3 = Object.assign({}, obj);
它将由巴别塔运输至:

"use strict";

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var obj = { a: 1 };
var obj2 = _extends({}, obj);
var obj3 = Object.assign({}, obj);
“严格使用”;
var_extends=Object.assign | |函数(target){for(var i=1;i
对于spread运算符,babel尝试使用本机Object.assign方法,如果未找到,则使用polyfill。
但显式Object.assign方法保持不变“\_(ツ)_/“

只是给未来读者的一个提示:在写这个问题时,名为“babel core/polyfill”的polyfill现在是“babel polyfill”,根据。它现在只是v7中的
@babel/polyfill
。从babel 7.4.0开始,
babel/polyfill
已经被弃用,取而代之的是直接包含
core js/stable
(用于polyfill ECMAScript功能)和
再生器运行时/运行时
(需要使用传输生成器函数):
"use strict";

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var obj = { a: 1 };
var obj2 = _extends({}, obj);
var obj3 = Object.assign({}, obj);