一.链判断运算符(?.)
用法;读取对象内部的某个属性,多层判断一下该对象是否存在
一般判断:
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判断运算符(??)
运用场景:读取对象属性的时候,如果某个属性的值是null或undefined,有时候需要为它们指定默认值。
一般写法:
const headerText = response.settings.headerText || 'Hello, world!';
// 这个存在问题 只要属性的值为null或undefined,默认值就会生效, 但是属性的值如果为空字符串或false或0,默认值也会生效。
新的写法:
const animationDuration = response.settings?.animationDuration ?? 300;
// 如果response.settings为null或者undefined,返回300,
或者response.settings.animationDuration为null或者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不等于-0,NaN等于自身。
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);
//字符串会以数组形式,拷贝入目标对象 其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错
// 数值和布尔值都会被忽略 因为没有可枚举属性。
// 只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性.