Spread运算符无法在Object.assign()中工作

时间:2018-02-13 22:06:41

标签: ecmascript-6

我尝试使用spread运算符从旧对象填充新对象,而不复制旧对象的指针。但新对象空洞。 :(

这是我的代码:

const obj = {
  a: 'a',
  b: 'b',
  c: 'c'
};

const test1 = Object.assign({}, ...obj);
const test2 = {};

console.log('obj', obj);
console.log('test1', test1);
console.log('test2', test2);

test1应该在控制台中显示与obj相同的内容,但它是空的。

我做错了什么?是否有另一种方法,而不使用Object.assign()

(也在jsbin中有这个。)

更新:

我试过了:

const test = {...obj};

但是我继续在传播的第一个点上获得意外的令牌。它适用于JSBin,但不适用于我的本地。所以我想我可能已经用Webpack或Babel做了一些不可思议的事情。

这是我的webpack.config.js

var path = require('path');

const DEV = process.env.NODE_ENV === 'dev';
const PROD = process.env.NODE_ENV === 'prod';

module.exports = {
    devtool: 'source-map',
    entry: './src/index.js',
    module: {
        loaders: [{
            test: /\.js$/,
            loaders: ['babel-loader'],
            exclude: /node_modules/
        },{
            test: /\.(png|jpg|gif)$/,
            loaders: ['url-loader'],
            exclude: /node_modules/
        },{
            test: /\.(css|sass|scss)$/,
            use: ['style-loader', 'css-loader?importLoaders=2', 'sass-loader'],
            // exclude: /node_modules/
        },{
            test: /\.(svg)$/,
            use: ['file-loader'],
            // exclude: /node_modules/
        },
        {
            test: /\.(otf)(\?.*)?$/,
            loader: 'url-loader?limit=10000&mimetype=application/font-sfnt'
        }]
    },
    output: {
        path: path.join(__dirname, 'dist'),
        publicPath: '/dist/',
        filename: 'bundle.js'
    }
}

这是.babelrc

{
    "presets": ["env", "react"]
}

2 个答案:

答案 0 :(得分:2)

展开对象时,需要将其包装在对象体内(对于数组也是如此):

const test1 = Object.assign({}, {...obj});

话虽如此,我认为组合Object.assign与对象传播没有任何好处 你可以这么做:

const test1 = {...obj};

或者这个:

const test1 = Object.assign({}, obj);

修改
我应该提一下,对象扩展语法是proposal (in stage 3),你需要babel插件babel-plugin-transform-object-rest-spread来支持它。

只是做:

npm install --save-dev babel-plugin-transform-object-rest-spread

并将其添加到.babelrc文件中:

{
  "plugins": ["transform-object-rest-spread"]
}

答案 1 :(得分:0)

在这种情况下,传播操作符未正确使用。

您只想:Object.assign({}, obj),或者:test1 = { ...obj }。你在做什么更像Object.assign({}, obj.a, obj.b, obj.c);