es6之对象的扩展和新增方法

129 阅读3分钟

一.链判断运算符(?.)

    用法;读取对象内部的某个属性,多层判断一下该对象是否存在

   一般判断:

 const firstName = (message && 
                    message.body&& 
                    message.body.user&&
                    message.body.user.firstName) || 'default';
判断四层,每一层是否有值,哪一层没有立马中断判断,执行给的'default'

 const firstName = message?.body?.user?.firstName || 'default';  
 //层层判断 左侧的对象是否为null或者undefined 如果是不往下执行,而是立马返回undefined const a  = [1,2,3]
 const b = a.match(1)?.[2,2,2]           //查询有没有1,有就返回[2,2,2]这个数组,没有就返回null

判断对象方法是否存在:
  let iterator = {
    fun:function(){......}
  }
iterator.fun?.()       // 存在就调用,不存在返回undefined

二.null判断运算符(??)

     运用场景:读取对象属性的时候,如果某个属性的值是nullundefined,有时候需要为它们指定默认值。

   一般写法:

const headerText = response.settings.headerText || 'Hello, world!';
// 这个存在问题 只要属性的值为null或undefined,默认值就会生效,   但是属性的值如果为空字符串或false或0,默认值也会生效。

新的写法:

const animationDuration = response.settings?.animationDuration ?? 300;
// 如果response.settings为null或者undefined,返回300,
   或者response.settings.animationDurationnull或者undefined,返回300。

很适合判断函数参数是否赋值
function Component(props) {
  const enable = props.enabled ?? true;
  // …
}

??与&&||的优先级孰高孰低。现在的规则是,如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

三.对象新增方法

    1.object.is()   (判断两个值是否相等)

       es5方法:

       ==(相等运算符):会自动转换数据类型

       ===(严格相等运算符):出现NaN不等于自身和+0等于-0问题

       这两的区别:==当两边值的类型相同时,直接比较值

                           ===当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化                                     为类型相同的值,再进行比较;

     ps:NaN和所有值包括自己都不相等

     绝大多数场合应该使用 === ,只有检测 null/undefined 的时候可以使用 

     x== null || undefined

     es6方法:

      object.is('1','1')        // true

      和===一样,并且解决了+0不等于-0NaN等于自身。

   2.object.assign()   (对象合并)

      此处的对象合并是浅拷贝,也就是对象的引用

  const target = { a: 1, b: 1 };
  const source1 = { b: 2, c: 2 };
  const source2 = { c: 3 };
  Object.assign(target, source1, source2);            // {a:1, b:2, c:3}
  ps:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  Object.assign([1, 2, 3], [4, 5])    //// [4, 5, 3]   
  // 合并数组  因为按下标来的  4,5下标也是0,1,所以覆盖前面数组的0,1下标

     参数不是对象,则会先转成对象,然后返回,
    如果undefined和null不在首参数,就不会报错,在就会报错

  const v1 = 'abc';
  const obj = Object.assign({}, v1, v2, v3);
  //字符串会以数组形式,拷贝入目标对象 其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错
  // 数值和布尔值都会被忽略 因为没有可枚举属性。
  // 只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性.