• ES6 学习(10) ---对象的扩展


    1、Object.is(), // ES6 新增用来比较两个值是否完全相等

      一般比较值是否相等,我们通常使用 == 和 === 运算符,但是对于 -0 和 +0 的相等判断并不准确,同时还有 NaN 并不等于本身,因此ES6,新增Object.is() 方法用于判断两值是否完全相等,大部分情况同 === 运算符

     1 +0 === -0 //true
     2 NaN === NaN // false
     3 
     4 Object.is(+0, -0) // false
     5 Object.is(NaN, NaN) // true
     6 
     7 Object.is('foo', 'foo')
     8 // true
     9 Object.is({}, {}) // 栈中地址不同
    10 // false

    2、Object.assign() // 用于对象的合并,将源对象的所有枚举属性复制到目标对象。如果有同名属性那么后面的就会覆盖前面的;

    1 const target = { a: 1, b: 1 };
    2 
    3 const source1 = { b: 2, c: 2 };
    4 const source2 = { c: 3 };
    5 
    6 Object.assign(target, source1, source2);
    7 target // {a:1, b:2, c:3}

      Object.assign() 只能拷贝到可枚举属性,同时如果对象名为Symbol类型也会拷贝合并

    注意:

      1、此方法只是浅拷贝,并不是深拷贝,因此对象中属性值是引用类型,那么拷贝的也只是引用;

      2、同名属性会替换;

      3、如果是数组的话,由于数组的下标相当于对象属性,因此数组合并的话会替换index的值;Object.assign( [1, 2, 3], [4, 5] ) // [4, 5, 3]

      4、取值函数的处理: 如果是取值函数的话,并不会复制取值函数,而是拿到值后将这个值复制过去

    1 const source = {
    2   get foo() { return 1 }
    3 };
    4 const target = {};
    5 
    6 Object.assign(target, source)
    7 // { foo: 1 }

    3、Object.getOwnPropertyDescriptors() // 获取一个对象下所有的自身属性(非继承属性)的描述对象

      ES5 中 Object.getOwnPropertyDescriptor() 只是获取某一个自身属性

     1 const obj = {
     2   foo: 123,
     3   get bar() { return 'abc' }
     4 };
     5 
     6 Object.getOwnPropertyDescriptors(obj)
     7 // { foo:
     8 //    { value: 123,
     9 //      writable: true,
    10 //      enumerable: true,
    11 //      configurable: true },
    12 //   bar:
    13 //    { get: [Function: get bar],
    14 //      set: undefined,
    15 //      enumerable: true,
    16 //      configurable: true } }

    4、__proto__属性,Object.setPrototypeof(), Object.getPrototypeof() 

     __proto__ 用于读写对象的原型(prototype), 本质上算是一个内部属性,并不是一个对外的API,尽量避免使用此属性用于对象原型上的读写

     Object.setPrototypeof() 用于设置对象原型对象,如果传入的参数并不是一个对象,那么就会转换成对象,如果是undefined和null不能转成对象那么就会报错

     1 let proto = {};
     2 let obj = { x: 10 };
     3 Object.setPrototypeOf(obj, proto);
     4 
     5 proto.y = 20;
     6 proto.z = 40;
     7 
     8 obj.x // 10
     9 obj.y // 20
    10 obj.z // 40

     Object.getPrototypeof() 用于读取对象原型对象, 

    5、Object.keys(), Object.values(), Object.entries() 

      ES5 中Object.keys() 返回对象所有可遍历属性的键名所组成的数组;

      ES7 中新增了与其配套的Object.values() Object.entries() 的方法,一般配合 for...of 使用

      Object.values() 返回对象属性值所组成的数组,返回的数组成员的顺序与 属性遍历的 部分排列规则一致。

      Object.values() 只返回对象自身可遍历属性

      Object.entries() 返回对象自身可遍历属性的键值对数组,(如果属性名是Symbol类型的并不会遍历到)

    const obj = { foo: '123', baz: 42 };
    Object.entries(obj)
    // [ ["foo", "123"], ["baz", 42] ]
     1 // 基本用途是遍历对象的属性
     2 let obj = { one: 1, two: 2 };
     3 for (let [k, v] of Object.entries(obj)) {
     4   console.log(
     5     `${JSON.stringify(k)}: ${JSON.stringify(v)}`
     6   );
     7 }
     8 // "one": 1
     9 // "two": 2
    10 
    11 // Object.entries方法的另一个用处是,将对象转为真正的Map结构。
    12 
    13 const obj = { foo: 'bar', baz: 42 };
    14 const map = new Map(Object.entries(obj));
    15 map // Map { foo: "bar", baz: 42 }

    6、Object.fromEnties() // 此方法是Object.entries() 的逆操作,即:将键值对数组转换成对象

    1 Object.fromEntries([
    2   ['foo', 'bar'],
    3   ['baz', 42]
    4 ])
    5 // { foo: "bar", baz: 42 }

      一般也可以将Map对象转换成对象

     1 // 例一
     2 const entries = new Map([
     3   ['foo', 'bar'],
     4   ['baz', 42]
     5 ]);
     6 
     7 Object.fromEntries(entries)
     8 // { foo: "bar", baz: 42 }
     9 
    10 // 例二
    11 const map = new Map().set('foo', true).set('bar', false);
    12 Object.fromEntries(map)
    13 // { foo: true, bar: false }
  • 相关阅读:
    Asp.Net MVC4入门指南(3):添加一个视图
    Asp.Net MVC4入门指南(2):添加一个控制器
    Asp.Net MVC4入门指南(1): 入门介绍
    .net平台借助第三方推送服务在推送Android,IOS消息(极光推送_V2版本)
    ASP.NET网站实现中英文转换(本地化资源)
    .net 内置对象之Session对象和Session的过期时间
    SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
    Js键盘事件全面控制,回车按键事件,键盘对应按键码,按键事件兼容各个浏览器。
    C# WebBrowser控件详解
    html .net 网页,网站标题添图标
  • 原文地址:https://www.cnblogs.com/newttt/p/12669551.html
Copyright © 2020-2023  润新知