Angular中ngOnChanges内currentValue与previousValue是否可能相等?判断代码是否合理?
Angular ngOnChanges中判断currentValue与previousValue是否相等的意义及边缘场景
一、这段代码的实际意义
从Angular的核心机制来看,这段代码通常是多余的。因为Angular触发ngOnChanges的前提是:通过浅比较(===)检测到输入属性的当前值与上一次值不相等。也就是说,正常进入ngOnChanges时,changes.steps.currentValue !== changes.steps.previousValue必然为true,这个if判断不会起到过滤作用。
但如果你的真实需求是深比较(比如判断对象/数组的内容是否真的变化,而不是仅仅引用变化),那这段代码的逻辑就不对了,应该换成深比较的实现(比如用JSON.stringify或者自定义深比较函数)。
二、二者意外相等的边缘场景
虽然极少出现,但确实存在ngOnChanges被触发,但currentValue与previousValue相等的情况:
NaN的特殊比较逻辑:由于NaN === NaN的结果是false,当父组件连续两次给输入属性赋值NaN时,Angular会认为值发生了变化,触发ngOnChanges。但此时currentValue和previousValue都是NaN,如果用==比较会得到false,但用!==的话结果是true(因为NaN !== NaN为true);若你的代码误用==判断,就会出现二者“实际相等但判断不成立”的情况。- 手动变更检测的异常场景:在复杂场景下(比如混用
ChangeDetectorRef的detectChanges、markForCheck等方法,或是OnPush策略下的非常规变更触发),可能出现Angular误判输入属性变化的情况,导致ngOnChanges被触发,但实际值并未改变。这种情况多是代码逻辑不规范导致的极端边缘情况。 - 输入属性初始值的特殊情况:组件初始化时,若输入属性初始值为
undefined,父组件第一次绑定也赋值undefined,理论上Angular不会触发ngOnChanges;但如果是异步赋值逻辑导致Angular在变更检测周期中误判值变化,也可能触发ngOnChanges,此时currentValue和previousValue都是undefined,二者相等。
总结
如果需求是基于Angular的浅比较逻辑执行操作,这段代码的判断完全多余;如果是想做深比较,这段代码的逻辑不正确,需要替换为深比较实现。而currentValue与previousValue意外相等的场景非常罕见,大多是特殊值处理或不规范代码导致的。
内容的提问来源于stack exchange,提问作者Qiimiia
相关产品推荐
相关产品推荐

