And*_*ata 2 ecmascript-6 webpack babeljs
我有以下对象:
const action = {id: 100, name: 'Andres', age: 27, type: 'CREATE_USER'}
Run Code Online (Sandbox Code Playgroud)
我想将一些属性复制到另一个对象中.在最新版本的Chrome中,我可以:
const newUser = {id, name, age} = action;
Run Code Online (Sandbox Code Playgroud)
该newUser
对象包含:
{id: 100, name: 'Andres', age: 27}
Run Code Online (Sandbox Code Playgroud)
这在浏览器中工作正常.但是,使用我编译的JS代码它不起作用.我明白了:
error ReferenceError: id is not defined
Run Code Online (Sandbox Code Playgroud)
如果我删除id
,我会用不同的密钥获得相同的消息,依此类推.
我的设置:
"webpack": "2.1.0-beta.21"
"webpack-dev-server": "2.1.0-beta.0"
Run Code Online (Sandbox Code Playgroud)
而对于巴贝尔:
"babel-core": "6.x",
"babel-eslint": "6.x",
"babel-loader": "6.x",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-plugin-transform-runtime": "6.x",
"babel-polyfill": "^6.8.0",
"babel-preset-es2015": "6.x",
"babel-preset-es2015-native-modules": "^6.6.0",
"babel-preset-react": "6.x",
"babel-preset-stage-0": "6.x",
Run Code Online (Sandbox Code Playgroud)
Babel或Webpack是否缺少一些东西来实现我想要的东西?
这里的问题是你试图一次声明并分配给变量,而在严格模式语义下这是不允许的,这是由Babel强制执行的.因此,您的代码段比您预期的更多:
const newUser = {id, name, age} = action;
Run Code Online (Sandbox Code Playgroud)
作为其一部分评估解构表达,分配将被执行以id
,name
,age
,的引用不存在,这应该抛出一个ReferenceError
根据异常的规范.更具体地说,底部有一条说明:
当分配内严格模式代码出现时,它是如果一个运行时错误LREF在第一算法或第二算法的步骤7中它是一个不可解决的参考的步骤1.F.如果是,则抛出ReferenceError异常.
您可以尝试在控制台中运行此代码段来证明:
// Will work
(function () {
a = 5;
})();
// Won't work
(function () {
'use strict';
b = 5;
})()
Run Code Online (Sandbox Code Playgroud)
为了使用Babel,我认为你想要的方式,你将不得不放弃ES2015预设并手动包含所有插件,选择退出transform-strict-mode
.简而言之,您将自己打开一罐PITA.
正确的做法是声明要绑定到的属性的所有变量:
'use strict';
let a, b, c;
({fee: a, fii: b, foo: c} = {fee: 1, fii: 2, foo: 3});
console.log(a, b, c);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这仍然无法满足您的需求.解构表达式的结果是一个赋值表达式,其中返回的值将是赋值(析构)的值,因此您newUser
实际上不会像预期的那样成为新对象:
const action = {id: 100, name: 'Andres', age: 27, type: 'CREATE_USER'}
const newUser = {id, name, age} = action;
console.log(newUser === action);
Run Code Online (Sandbox Code Playgroud)
这导致我们采用以下解决方案.它可能不那么简洁,但它清楚地概述了正在执行的工作:
const action = {id: 100, name: 'Andres', age: 27, type: 'CREATE_USER'}
const {id, name, age} = action;
const newUser = {id, name, age};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
870 次 |
最近记录: |