对象的新增方法
Object.is()
源自:http://es6.ruanyifeng.com/#docs/object-methods#Object-getOwnPropertyDescriptors
-
ES5比较两个值只有2个运算符,相等(==)和严格相等(==)
相等运算符:会自动转换数据类型
严格相等运算符:NaN不等于自身,+0等于-0
-
ES6提出同值相等算法解决以上2个缺点
当用来比较两个值是否严格相等时,Object.is于(===)行为基本一致 var foo = Object.is('foo', 'foo')//true var bar = Object.is({}, {})//false
-
不同点
Object.is(+0,-0)//false Object.is(NaN,NaN)//true
Object.assign
-
Object.assign()用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
第一个参数是目标对象target 后面的参数都是源对象source const target = { a: 1 }; const source1 = { b: 2 }; const source2 = { c: 3 }; Object.assign(target,source1,source2)//{a: 1, b: 2, c: 3}
-
如果只有一个参数,则直接返回该参数
-
如果该参数不是对象,则会先转为对象,然后返回
typeof Object.assign(2)// 'object'
-
由于undefined和null无法转成对象,所以如果它们作为第一个参数,则报错
-
如果第一个参数不是对象,则都先转成对象,若无法转成对象,则跳过,意味着undefined和null不在首参数就不会报错
-
字符串在首参数时,会以字符串数组的形式,拷贝到目标对象
const v1 = 'obj'; const v2 = true ; const v3 = 10 ; const obj = Object.assign({ },v1,v2,v3) console.log(typeof obj)//{0: "o", 1: "b", 2: "j"} //只有字符串类型的转成了字符串数组形式返回
-
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性,也不拷贝不可枚举的属性,enumerable:false)
var foo = Object.assign({ b:'c'}, Object.defineProperty({ },'invisible',{ enumerable:true, value:'hello' }) ) //当enumerable为true时:{b: "c", invisible: "hello"} //~ 为false时, console.log(foo)//{b: "c"} //Object.assign要拷贝的对象只有一个不可枚举属性invisible,这个属性并没有被拷贝进去。
-
属性名为Symbol值的属性,也会被Object.assign拷贝
var bar = Object.assign({ a:"b"},{ [Symbol('c')]:'d'}) console.log(bar)//{a: "b", Symbol(c): "d"}
注:
-
Object.assign方法实行的是浅拷贝,意味着,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
const obj1 = { a:{ b:1}}; const obj2 = Object.assign({ },obj1) obj1.a.b=2 console.log(obj2)//a: {b: 2} obj2.a.b=3 console.log(obj1)//a: {b: 3}
-
对于嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,不是添加
const target = {a:{b:'c',d:"e"}} const source = {a:{b:"hello"}} console.log(Object.assign(target,source))//a: {b: "hello"} //一些函数库提供Object.assign的定制版本(比如 Lodash 的_.defaultsDeep方法),可以得到深拷贝的合并。
-
数组的处理
var foo =Object.assign([1,2,3],[4,5]) console.log(foo)//[4,5,3] Object.assign把数组视为属性名为0,1,2的对象,因此源对象的0号属性4覆盖了目标数组的0号属性1
-
取值函数的处理
const source={ get foo(){ return 1} } const target = { }; console.log(Object.assign(target,source))//{foo: 1} //source对象的foo属性时一个取值函数,Object.assign不会复制这个函数,只会拿到值后,将值复制过去