zoukankan      html  css  js  c++  java
  • ES6 学习(9) ---对象

    1、对象属性简洁表达

      ES6 中,如果属性值是一个变量,如果对象的属性名和属性值相同,那么就可以使用简洁写法

    let key = "key"
    let value = "value"
    let obj = {key, value}

      属性的方法也可以简写

    let obj = {
      method() { console.log("方法简写") }          
    }
    
    // 常用于 setter 和 getter 
    const cart = {
      _wheels: 4,
    
      get wheels () {
        return this._wheels;
      },
    
      set wheels (value) {
        if (value < this._wheels) {
          throw new Error('数值太小了!');
        }
        this._wheels = value;
      }
    }

      需要注意的是,简写的方法不能用于构造函数

    2、属性名表达式

      ES6 中使用自变量定义对象属性名是,增加了可以使用表达式进行定义,只是需要将表达式用中括号括起来( [] ),但是不能与属性简洁表达一起使用

     1 let propKey = 'foo';
     2 
     3 let obj = {
     4   [propKey]: true,  // 表达式定义属性名
     5   ['a' + 'bc']: 123
     6 };
     7 // 对象的方法名同样可以使用表达式来定义
     8 let obj = {
     9   ['h' + 'ello']() {
    10     return 'hi';
    11   }
    12 };
    13 
    14 obj.hello() // hi
    15 
    16 // 不能与简洁表达式一起使用
    17 const foo = 'bar';
    18 const baz = { [foo] };

      注意:当定义属性名的表达式是一个对象的话,就会自动转换成字符串 [object object]

    3、 新增对象方法的name属性 // 返回方法的名

      如果是setter 和 getter ,则name属性不在此方法上而是在对象的get 和 set 方法上

    const obj = {
      get foo() {},
      set foo(x) {}
    };
    
    obj.foo.name
    // TypeError: Cannot read property 'name' of undefined
    
    const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');
    
    descriptor.get.name // "get foo"
    descriptor.set.name // "set foo"

      如果是bind绑定的函数或者Function构造的函数,name属性同函数name属性相同

      如果方法的名是用Symbol类型的,则返回这个Symbol类型的描述

    const key1 = Symbol('description');
    const key2 = Symbol();
    let obj = {
      [key1]() {},
      [key2]() {},
    };
    obj[key1].name // "[description]"
    obj[key2].name // ""

    4、属性的可枚举性和遍历

      对象的每个属性都有一个描述对象(Descriptor), 用来控制该属性的行为(可遍历、可修改、值、可配置)

      通过Object.getOwnPropertyDescriptor()方法来获取这些行为

    let obj = { foo: 123 };
    Object.getOwnPropertyDescriptor(obj, 'foo')
    //  {
    //    value: 123, // 值
    //    writable: true, // 可写
    //    enumerable: true, // 可枚举
    //    configurable: true  // 可配置
    //  }

    目前,有四个操作会忽略enumerablefalse的属性。

    • for...in循环:只遍历对象自身的和继承的可枚举的属性。
    • Object.keys():返回对象自身的所有可枚举的属性的键名。
    • JSON.stringify():只串行化对象自身的可枚举的属性。
    • Object.assign(): 忽略enumerablefalse的属性,只拷贝对象自身的可枚举的属性。

    5、对象的扩展运算符( ... ) // 同数组, 不同的是:数组解构按位,而对象解构时按住键名;

       对象的扩展运算符可以用来对象的浅拷贝 let obj = { ... {a:1, b:2} }

       可以进行对象的合并 let obj = { ...{a:1, b: 2}, ...{c: 3, d: 4} } 等同于 Object.assign( {}, {a:1, b: 2}, {c: 3, d: 4} ) ; 需要注意的是如果要合并的对象有同名属性,那么后者就会覆盖前者

    6、链判断运算符( ?. ) ( ES2020 新增 )

      在工作中调用接口,会出现获取对象多层内部中的某属性,然而如果其中间某个属性不存在就会报错,因此ES2020 新增链判断运算符;如果中间某个属性不存在就会返回 undefined  

    1 // 之前写法
    2 const firstName = (message
    3   && message.body
    4   && message.body.user
    5   && message.body.user.firstName) || 'default';
    6 
    7  // 链判断运算符
    8 const firstName = message?.body?.user?.firstName || 'default';

    7、 Null 判断运算符( ?? ) (ES2020 新增)

      一般对模型变量设置默认值是,我们会使用短路机制 str || "string", 那么str变量是 "", 0, null, undefined,false时就会赋值默认值,如果只有当变量是null 和 undefined时,才会使用默认值,那么就不能使用这种方法;

      因此ES2020新增了Null判断运算符,只有当变量值是 null 或 undefined时,才会赋值默认值

    const headerText = response.settings.headerText ?? 'Hello, world!';
    
    const animationDuration = response.settings.animationDuration ?? 300;
    
    const showSplashScreen = response.settings.showSplashScreen ?? true;

      需要注意的是,如果与多个逻辑运算符一起使用的时候,需要使用()表明优先级,否则就会报错

  • 相关阅读:
    第二次站立会议
    小组第一次站立会议
    用户场景描述
    本周学习总结
    构建之法阅读笔记之三
    本周的学习收获
    java连接Oracle数据库
    scott用户不存在
    大二暑假第五周总结
    业务用例分析
  • 原文地址:https://www.cnblogs.com/newttt/p/12601636.html
Copyright © 2011-2022 走看看