### 对象属性和方法的简洁表示法
- 在ES6中允许只写属性名,不写属性值,此时的属性值就是属性名对应的变量的值
```
var birth = '2000/01/01'
var person = {
name:'张三',
birth,//等同于 birth : birth
hello(){console.log('hello world')} // 等同于 hello:function(){...}
}
```
### 新的对象API
#### Object.is()
- 判断两个值是否严格相等
- 场景:在ES5中NaN是不等于自身的,可以通过Object.is()来判断
```
Object.is(+0,-0) //false 在ES5中两者相等
Object.is(NaN,NaN) //true
```
#### Object.assign(target,source1,source2)
- 用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
- 如果只有一个参数,则返回该参数
- undefined和null不能做为参数,因为它们不能转成对象(作为首参数报错,做为source参数无值)
- Object.assign()是浅拷贝,而不是深拷贝。(即:如果源对象某个属性的值是对象,那目标对象拷贝得到的是这个对象的引用)
- 当target和source有同名属性时,会替换,而不是添加
```
var obj1 ={
name:'haha',
age:18
}
var obj2={}
Object.assign(obj2,obj1) // Object.assign(target,source1,source2,...)
# 浅拷贝
var obj1 ={a:{b:1}}
var obj2 = Object.assign({},obj1)
obj1.a.b=2;
obj2.a.b // 2
# 合并多外对象
var merge = (...sources)=>Object.assign({},...sources)
# 为类对象属性赋值
class Point{
constructor(x,y){
Object.assign(this,{x,y})
}
}
# 设置初始值
let options = Object.assign({},DEFAULTS,options)
```
> Object.assign的作用
1. 浅拷贝对象的属性和方法
2. 为类对象赋值
3. 设置对象属性指定默认值
4. 合并多个对象
5. 克隆对象
#### 对象的遍历方法
1. for...in
> for...in 循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)
2. Object.keys(obj)
> Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性
3. Object.getOwnPropertyName(obj)
> 返回一个数组,饮食对象所有属性
4. Object.getOwnPropertySymbols(obj)
> 返回数组,饮食对象自身的所有Symbol属性
5. Reflect.ownKeys(obj)
> 返回数组,饮食对象自身的所有属性(饮食Symbol属性和可枚举及不可枚举的)
#### 对象属性获取API
1. Object.keys()
> 返回key数组,获取对象的所有可遍历属性的键名,
2. Object.values()
> 返回value数组,获取对象所有可遍历属性的值
3. Object.entries()
> 返回[key,value]为元素的数组,获取对象所有可遍历属性的键值数组
#### Rest解构赋值
> ...运算符用于解构。对象的Rest解构赋值用于从一个对象取值,相当于将所有可遍历的、但尚未被读取的属性,分配到指定的对象上面。
> 注意点:
- Rest解构赋值必须是最后一个参数,否则会报错
- 解构赋值是浅拷贝
- 不会拷贝继承自原型对象的属性