js中 || 与??的区别
:值1 ?? 值2
值1 || 值2
使用?? 只有当值1 为null或者undefined时才返回值2
使用 || 值1 会转换为布尔值判断,为true返回 值1 ,false 返回值2
??非空运算符
??=空赋值运算符
,仅当值为null/undefined时才会赋值
空赋值运算符和默认参数的区别:
空赋值在没有赋值或者时null undefined时,才会赋值
默认参数,当有参数时除了undefined,都会被赋值
demo:
function demo1(options){
options.a??=1;
options.b??=2;
return options;
}
function demo2(a=1,b=2){
return {"a":a,"b":b}
}
demo1(null,undefined); {a:1,b:2}
demo2(null,undefined); {a:null,b:2}
?.链判断运算符
允许开发人员读取深度嵌套在对象链中的属性值,而不必验证每个引用。当引用为空时,表达式停止计算并返回undefined
var travelPlans = {
destination: 'DC',
monday: {
location: 'National Mall',
budget: 200
}
}
console.log(travelPlans.tuesday?.location) // => undefined
Object.defineProperty与proxy的区别
Object.defineProperty
Object.definedProperty() 方法会直接在一个对象山定义一个新属性,或者修改一个对象的现有属性,并返回此对象
检测不到对象属性的添加和删除
数组API方法无法监听到
需要对每个属性进行遍历监听,如果嵌套对象,需要深层监听,造成性能问题
proxy
proxy的监听是针对一个对象的,那么对这个对象的所有操作会被被进入监听操作,这就完全可以代理所有的属性了