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、对象的扩展运算符: