对象的新增方法
1、Object.is( )
ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。
它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。Javascript缺乏一种运算,在所有环境中,只有两个值是一样的,它们就应该相等。
ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
Object.is('foo','foo') //true
Object.is({},{}) //false
不同之处只有两个:
1、+0不等于-0
2、NaN等于自身
+0 === -0 //true
NaN === NaN //false
Object.is(+0,-0) //false
Object.is(NaN,NaN) //true
2、Object.assign( )
基本用法
Object.assign方法用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。
const target = {a:1};
const source1 = {b:2};
const source2 = {c:3};
Object.assign(target,source1.source2);
target //{a:1;b:2;c:3}
//Object.assign方法的第一个参数是目标对象,后面的参数都是源对象
`注意!~如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性`
const target = { a: 1, b: 1 };
const source1 = { b: 2, c: 2 };
const source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
//如果只有一个参数,Object.assign会直接返回该参数
const obj = {a:1};
Object.assign(obj) === obj //true
//如果该参数不是对象,则会先转成对象,然后返回
typeof Object.assign(2) //"object"
//由于undefined和null无法转成对象,所以如果他们作为参数会报错
Object.assign(undefined) //报错
Object.assign(null) //报错
//但是如果费对象参数参数出现在源对象的位置,那么出力规则就不同。
//这些参数会转成对象,无法转对象的就会跳过。
//这意味着如果undefined和null不在首参数,就不会报错。
注意点
1)浅拷贝
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
const obj1={a:{b:1}};
const obj2=Object.assign({},obj1);
obj1.a.b = 2; //2
2)同名属性的替换
对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。
const target = {a:{b:'c',d:'e'}}
const source = {a:{b:'hello'}}
Object.assign(target,source)
//{ a: { b: 'hello' } }
3、数组的处理
Object.assign可以用来处理数组,但是会把数组视为对象
Object.assign([1,2,3],[4,5])
//[4,5,3]
4、取值函数的处理
Object.assign只能进行值的赋值,如果要复制的值是一个取值函数,那么将求值后再复制
const source = {
get foo(){return 1}
};
const target = {};
Object.assign(target,source)
// { foo: 1 }