前言
大家好我是前端新手小猿同学,这篇文章主要给大家简单介绍一下ES6关于对象新增的Object.is()和Object.assign()方法的使用以及原理的简单分析,希望对大家的学习进步有所帮助,当然文章中可能存在理解不正确的地方希望大家可在评论区相互讨教,共同进步。
一、Object.is()
ES5 比较两个值是否相等,只有两个运算符:相等运算符()和严格相等运算符(=)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。
ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
相等运算和严格等运算的缺点分析:
- 自动转换数据类型
- NaN不等于自身
- +0, -0 相等
console.log(1==true)
console.log(NaN===NaN)
console.log(+0===-0)
Object.is()就是为了解决相等运算和严格等运算的缺点诞生的:
console.log(Object.is(NaN,NaN))
console.log(Object.is(+0, -0))
二、Object.assign()
Object.assign()方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象,简单来说就是可以将两个对象中不同的属性进行合并,比如:const obj1 = {a:1}
const obj2 = {b:2}
const obj3 = {}
Object.assign(obj3,obj1,obj2)
console.log(obj3);
输出:
但是如果目标对象中有和源对象同名的属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性:
const obj = { a: 1, b: 1 };
const obj1 = { b: 2, c: 2 };
const obj2 = { c: 3 };
Object.assign(obj, obj1, obj2);
console.log(obj);
输出:
如果源对象中只有一个参数那么assign()会直接返回这个参数,如果遇到这个参数不是对象,assign()会先将这个参数转换成为对象,然后返回。
注意:由于undefined和null无法转成对象,所以如果它们作为目标对象参数,就会报错。所以我们在选择目标对象的时候要尽量避开undefined和null。
const obj1 = {a:1}
// 报错
const obj2 = Object.assign(undefined,obj1)
console.log(obj2)
// 不报错
const obj3 = Object.assign(obj1,null)
console.log(obj3)
// 不报错
const obj3 = Object.assign(obj1,undefined)
console.log(obj3)
输出:
原因分析:
Object.assign()
默认第一个参数,是做为目标对象,会将后面的参数和并到第一个目标对象中,所以第一个参数的类型必须是Object类型,如果不是Object类型assgin()可以自动转换,但是null和undefind无法转换成为Object类型所以会报错,但是当null和undefind做第二个参数的时候,如果类型转换失败就会跳过,只是不会和目标对象合并,所以不会报错。
说明: 关于Object.assgin()浅拷贝相关的知识点本片文章暂时不涉猎,后面会专门写一篇js深拷贝和浅拷贝相关的文章,关注博主不迷路,定期更新前端学习文章,共同进步。