深入浅出es6----对象篇

1、Object.is()用来比较两个对象是否严格相等,相当于 ===
不同之处只有两个:一是 +0 不等于 -0 ,二是 NaN 等于自身。

+0 === -0  //true
NaN === NaN //false
Object.is(+0,-0)//false
Object.is(NaN,NaN)//true
2、Object.assign()用于对象的合并
第一个参数是目标对象,后面的参数都是源对象。
var target = {a:1}
var source1 = {b:2}
var source2 = {c:3}
Object.assign(target,source1,source2);
target//{a:1,b:2,c:3}
如果只有一个参数则返回其本身,如果其本身不是对象就先转换为对象然后返回。

typeof Object.assign(2)//'object'
undefined和null无法转换为对象,所以用Object.assign()的时候会报错

Object.assign(undefined)//报错
Object.assgin(null)//报错

其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。
Object.assign()方法实行的是浅拷贝,如果源对象的某一个属性的值是对象,那么目标对象拷贝得到的是这个对象值的引用。

var obj1 = {a:{b:2}};
var obj2 = Object.assign({},obj1)
obj2.a.b //2
对于嵌套的对象,遇到重名的情况,Object.assign()不会进行合并而是进行替换

var target = {a:{b:'c',d:'e'}}
var source = {a:{b:'hello'}}
Object.assign(target,source)
target//{a:{b:'hello'}}
Object.assign()可以处理数组,但是会将数组看做对象。

Object.assign([1,2,3],[4,5])//[4,5,3]
Object.assign()常用用途
1、为对象添加属性:

class Point{
     constructor(x,y){
         Object.assign(this,{x,y}) 
     }
}
2、为对象添加方法:

Object.assign(SomeClass.prototype,{
     someMethod(arg1,arg2){
         ... 
     },
     anotherMethod(){
         ... 
     }
})
3、克隆对象
这种方法只能克隆原始对象自身的值,继承来的不能克隆
function Clone(origin){
     return Object.assign({},origin)
}
如果想要保持继承链,可以这样写:

function clone(origin){
     let originProto =   Object.getPrototypeOf(origin);//返回对象的原型Object.getPrototypeOf()
     return Object.assign(Object.create(originProto), origin)// Object.create(Obj1)obj1是要继承的原型
}

function Car(){
     this.desc = '描述';
     this.color = '红色';
}
Car.prototype = {
     getInfo:function(){
          return 'A'+this.color+''+this.desc
     }
}
var car = Object.create(Car.prototype);
car.color = '蓝色'
alert(car.getInfo())//蓝色undefined
4、合并多个对象
将多个对象合并到某一个对象

const merge = 
     (target,...source) => Object.assign(target,...source)
如果希望合并后返回一个新对象,可以这样

const merge = (...source) => Object.assign({},...source)
5、为属性指定默认值

var DEFAULT = {
     logLevel:0,
     outputFormat:'html'
}
function proccessCOntent(options){
     options = Object.assign({},DEFAULT,options);
     console.log(options);
}
6、属性的可枚举性
对象的每个属性都有一个描述对象。Object.getOwnPorpertyDescciptor方法可以获取该属性的描述对象。

let obj = {foo:'123}
Object.getOwnPropertyDescriptor(obj,'foo')
描述对象的enumberable属性,成为‘可枚举性’,如果该属性为false,就表示某些操作会忽略当前属性。
7、属性的遍历
es6一共有5种方式可以遍历对象的属性

(1)for...in
for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
(2)Object.keys(obj)
Object.keys 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols 返回一个数组,包含对象自身的所有 Symbol 属性。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys 返回一个数组,包含对象自身的所有属性,不管属性名是 Symbol 或字符串,也不管是否可枚举。
以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
  • 首先遍历所有属性名为数值的属性,按照数字排序。
  • 其次遍历所有属性名为字符串的属性,按照生成时间排序。
  • 最后遍历所有属性名为 Symbol 值的属性,按照生成时间排序。
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })
// ['2', '10', 'b', 'a', Symbol()]

上面代码中, Reflect.ownKeys 方法返回一个数组,包含了参数对象的所有属性。这个数组的属性次序是这样的,首先是数值属性 2 10 ,其次是字符串属性 b a ,最后是 Symbol 属性。

7、Object.keys()
          返回对象的属性名的数组。

var obj = {'foo':'a','is':'b'}
Object.keys(obj)//['foo','is']

8、Object.values()
     返回对象的属性值

var obj = {'foo':'a','is':'b'}
Object.valeus(obj)//['a','b']
Object.values()只返回自身可遍历的属性。 p的描述属性 enumerable是false,Object.values()就不会返回,改成true就可以了的。

var obj = Object.create({},{p:{value:42}})
Object.values(obj)//[]

var obj = Object.create({}, {p:{value: 42,enumerable: true}});
Object.values(obj)//[42]

9、Object.entries()
返回一个数组,是参数对象自身的(不包括继承来的)所有可遍历的(enumberable)的属性键值对数组。

var obj = {foo:'bar,baz:322}
Objec.entries(obj)
//[['foo','bar'],['baz',322]
     Object.entries()的另一个用途是将对象转为真正的map结构

var obj = {foo:'bar',baz:42}
var map = new Map(Object.entries(obj))

10、对象的扩展运算符:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值