Object.is
这个方法用来判断两个值是否相等
在Es5中我们使用
=
=
(
相
等
运
算
符
)
\color{red}{==(相等运算符)}
==(相等运算符)
=
=
=
(
严
格
相
等
运
算
法
)
\color{#c7254e}{===(严格相等运算法)}
===(严格相等运算法) 这两个来比较,相等运算符会自动转换类型而严格相等运算符不会
红色文字
console.log('1'==1);
console.log('1'===1);
console.log(NaN == NaN);
console.log(NaN === NaN);
console.log(-0 === 0);
console.log('------------------------');
console.log(Object.is('1',1));
console.log(Object.is(1,1));
console.log(Object.is(NaN,NaN));
console.log(Object.is(-0,0));
Object.is与 ===判断符只有两个差别
- Object.is判断NaN等于 NaN 而===判断为false
- Object.is判断 -0和0 是不相等的 而 === 判断 -0和0 是相等的
Object.assign
Object.assign()方法用于对象合并
定义:Object.assign(target,obj1,obj2…)
第一个参数是目标对象
第二个参数开始为 要合并的对象
let obj = {
name:'zhangsan'
}
let obj2 = {
age:18
}
let obj3 = {
job:'Programer'
}
Object.assign(obj,obj2,obj3)
console.log(obj); //{name: "zhangsan", age: 18, job: "Programer"}
Object.assign方法首参数不能接受null和undefined值并且当参数不是对象是会转换成对象
console.log(Object.assign(1)); //Number {1}
console.log(Object.assign(obj,null)); //{name: "zhangsan", age: 18, job: "Programer"}
console.log(Object.assign(obj,undefined)); //{name: "zhangsan", age: 18, job: "Programer"}
console.log(Object.assign(null)); //报错
console.log(Object.assign(undefined)); //报错
注意在Object.assign拷贝对象是浅拷贝不是深拷贝
浅拷贝:新对象是对旧对象的一个引用,并且对新对象上的操作会反应到旧对象上反之对旧对象操作也会反应到新对象上
深拷贝:把原本的旧对象拷贝新的一份放在内存中,新旧对象的操作互不影响
Object.assign非首参数对于 布尔值和空字符串数字都是跳过处理只有字符串会处理
console.log(Object.assign({},true,'',1,'a')); //{0: "a"}
let obj = {
name:'zhangsan'
}
let obj2 = {
age:18
}
let obj3 = {
name:'lisi',
job:'Programer'
}
Object.assign(obj,obj2,obj3); //后续的属性会覆盖前面的属性
console.log(obj);//{name: "lisi", age: 18, job: "Programer"}
Object.assign无法拷贝不可枚举类型的属性
let obj = {
name:'zhangsan'
}
Object.assign(obj,Object.defineProperty({},'job',{
enumrable:false,
value:'Programer'
})); //Object.assign无法拷贝不可枚举类型的属性
console.log(obj);//{name: "zhangsan"}
Object.assign方法的用途
- 添加属性
- 克隆对象
- 合并对象
let obj = {
name:'zhangsan'
}
let obj2 = {
job:'Programer'
}
Object.assign(obj,{age:18}); //添加属性
Object.assign(obj,obj2); //合并对象
function clone(obj){
return Object.assign({},obj);//克隆对象
}
Object.getOwnPropertyDescriptors()
在Es5引入了Object.getOwnPropertyDescriptors()用于获取某个对象的属性某数在es6引入Object.getOwnPropertyDescriptors()
let obj = {
name:'zhangsan',
age:'18'
}
console.log(Object.getOwnPropertyDescriptors(obj));
操作原型的方法
- Object.setPrototypeOf() 用来设置原型对象
- Object.getPrototypeOf() 用来获取原型对象
- Object.create()
Object.setPrototypeOf(obj, prototype)
参数:
Obj要设置原型的对象
prototype 新的原型对象
设置前**proto**指向Object
设置后**proto指向 新的原型 新的原型又有proto**指向Object
Object.getPrototypeOf(obj);
参数:
obj获取原型的对象
返回值:
原型对象
let obj = {
name:'zhangsan',
age:'18',
func:function(){
console.log(test);
},
set foo(value) {
console.log(value);
}
}
let obj2 = {
name:'lisi',
age:20
}
Object.setPrototypeOf(obj,obj2)
console.log(obj);
console.log(Object.getPrototypeOf(obj));
可以看出获取到了原型对象
Object.keys、Object.values、Object.entries
- Object.keys 获取所有可遍历(可枚举)的属性键值
- Object.values 获取所有可遍历(可枚举)的属性值
- Object.entries 上面两个方法的合并,获取所有可遍历的属性简直及属性值
let obj = {
name:'zhangsan',
age:'18',
func:function(){
console.log(test);
},
set foo(value) {
console.log(value);
}
}
let obj2 = {
name:'lisi',
age:20
}
console.log(Object.keys(obj)); //["name", "age", "func", "foo"]
console.log(Object.values(obj)); //["zhangsan", "18", ƒ, undefined]
console.log(Object.entries(obj)); //[Array(2), Array(2), Array(2), Array(2)]