1.属性的简洁表示法javascript
const foo = 'bar'; const baz = {foo}; baz // {foo: "bar"} // 等同于 const baz = {foo: foo};
ES6 容许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。java
let birth ='2000/01/01'; const Person={ name:'张三', //等同于birth: birth birth, // 等同于hello: function ()... hello(){ console.log('个人名字是', this.name); } };
2.属性名的表达式数组
let propKey = 'foo'; let obj = { [propKey]: true, ['a' + 'bc']: 123 };
let lastWord = 'last word'; const a = { 'first word': 'hello', [lastWord]: 'world' }; a['first word'] // "hello" a[lastWord] // "world" a['last word'] // "world"
ES6 容许字面量定义对象时,用(表达式)做为对象的属性名,即把表达式放在方括号内。
app
[object Object]
,这一点要特别当心。
const keyA = {a: 1}; const keyB = {b: 2}; const myObject = { [keyA]: 'valueA', [keyB]: 'valueB' }; myObject // Object {[object Object]: "valueB"}
3.属性的遍历ide
ES6 一共有 5 种方法能够遍历对象的属性。函数
(1)for...inthis
for...in
循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。spa
(2)Object.keys(obj)rest
Object.keys
返回一个数组,包括对象自身的(不含继承的)全部可枚举属性(不含 Symbol 属性)的键名。code
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames
返回一个数组,包含对象自身的全部属性(不含 Symbol 属性,可是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols
返回一个数组,包含对象自身的全部 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys
返回一个数组,包含对象自身的全部键名,无论键名是 Symbol 或字符串,也无论是否可枚举。
以上的 5 种方法遍历对象的键名,都遵照一样的属性遍历的次序规则。
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 }) // ['2', '10', 'b', 'a', Symbol()]
上面代码中,Reflect.ownKeys
方法返回一个数组,包含了参数对象的全部属性。这个数组的属性次序是这样的,首先是数值属性2
和10
,其次是字符串属性b
和a
,最后是 Symbol 属性。
4.对象的扩展运算符
(1)解构赋值
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; x // 1 y // 2 z // { a: 3, b: 4 }
上面代码中,变量z
是解构赋值所在的对象。它获取等号右边的全部还没有读取的键(a
和b
),将它们连同值一块儿拷贝过来。
undefined
或
null
,就会报错,由于它们没法转为对象。
let { ...z } = null; // 运行时错误 let { ...z } = undefined; // 运行时错误解构赋值必须是最后一个参数,不然会报错。
let { ...x, y, z } = someObject; // 句法错误 let { x, ...y, ...z } = someObject; // 句法错误
解构赋值的一个用处,是扩展某个函数的参数,引入其余操做。
function baseFunction({ a, b }) { // ... } function wrapperFunction({ x, y, ...restConfig }) { // 使用 x 和 y 参数进行操做 // 其他参数传给原始函数 return baseFunction(restConfig); }
(2)扩展运算符
let z = { a: 3, b: 4 }; let n = { ...z }; n // { a: 3, b: 4 }
因为数组是特殊的对象,因此对象的扩展运算符也能够用于数组。
let foo = { ...['a', 'b', 'c'] }; foo // {0: "a", 1: "b", 2: "c"}
扩展运算符能够用于合并两个对象。
let ab = { ...a, ...b }; // 等同于 let ab = Object.assign({}, a, b);
这用来修改现有对象部分的属性就很方便了。
let newVersion = { ...previousVersion, name: 'New Name' // Override the name property };
上面代码中,newVersion
对象自定义了name
属性,其余属性所有复制自previousVersion
对象。
与数组的扩展运算符同样,对象的扩展运算符后面能够跟表达式。
const obj = { ...(x > 1 ? {a: 1} : {}), b: 2, };