对象的新增方法

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"}
    

注:

  1. 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}
    
  2. 对于嵌套的对象,一旦遇到同名属性,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方法),可以得到深拷贝的合并。
    
  3. 数组的处理

    var foo =Object.assign([1,2,3],[4,5])
            console.log(foo)//[4,5,3]
    Object.assign把数组视为属性名为012的对象,因此源对象的0号属性4覆盖了目标数组的0号属性1
    
  4. 取值函数的处理

           const source={
         
                get foo(){
         return 1}
            }
            const target = {
         };
            console.log(Object.assign(target,source))//{foo: 1}
    //source对象的foo属性时一个取值函数,Object.assign不会复制这个函数,只会拿到值后,将值复制过去
    
全部评论

相关推荐

11-13 20:32
门头沟学院 Java
面向未来编程code:我没看到他咋急,他不就问你个问题。。。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务