MDN解释:
从ECMAScript 2015开始,对象初始化语法开始支持计算属性名。其允许在[]中放入表达式,计算结果可以当做属性名。这种用法和用方括号访问属性非常类似,也许你已经用来读取和设置属性了。现在同样的语法也可以用于对象字面值了:
// Computed property names (ES6)
var i = 0;
var a = {
["foo" + ++i]: i,
["foo" + ++i]: i,
["foo" + ++i]: i
};
console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3
var param = 'size';
var config = {
[param]: 12,
["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4
};
console.log(config); // { size: 12, mobileSize: 4 }
ECMAScript 6入门解释:
js定义对象的属性,有两种方法
//方法一
obj.foo = true;
//方法二
obj['a' + 'b'] = 123
es5只能使用方法一(标识符)定义属性。
es6允许字面量定义对象时用方法二,即把表达式放在方括号内。
例子:
1、比如在react中修改state中的属性,就直接使用了计算属性名的方法
this.state = {
isGoing: true,
number: 3
}
handleChange(e){
const name = e.target.name
const value = name == 'isGoing' ? 'xxx': 'xxxxxxxxx'
// name可能为isGoging或者number
...
this.setState = {
[name]: value
}
}
2、
let lastword = 'last word';
const a = {
'first word': 'hello',
[lastword]: 'world'
};
a['first word'] // 'hello'
a['last word'] // 'word'
a[lastword] // 'word'
3、注意,属性名表达式如果是一个对象,默认情况下会自动将对象转换为字符串[object Object],这一点要特别小心
const keyA = {a: 1};
const keyB = {b: 2};
const myObject = {
[keyA]: 'valueA',
[keyB]: 'valueB'
};
myObject // Object {[object Object]: "valueB"}
参考资料:ES6入门(阮一峰)、MDN