2019-03-01 对象的新增方法

2019-03-02  本文已影响0人  kathyever

对象的新增方法

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 }
上一篇下一篇

猜你喜欢

热点阅读