如何修改库中压缩的if语句以避免d为null时的报错?
修复CKEditor Widget代码中的Null引用错误
我来帮你搞定这个问题!这段压缩后的代码里,问题根源很明确:d = b.getFirst(g.isParserWidgetElement)有时候会返回null,但后面直接访问d.attributes时没做任何检查,所以才会抛出TypeError。
先把原代码展开格式化,方便理解
原压缩代码展开后大概是这样:
if (c = a.instances[c["data-cke-widget-id"]]) { d = b.getFirst(g.isParserWidgetElement); f.push({ wrapper: b, element: d, widget: c, editables: {} }); // 这里d可能为null,直接访问d.attributes会触发错误 if ("1" != d.attributes["data-cke-widget-keep-attr"]) { delete d.attributes["data-widget"]; } }
修复方案:添加d的非空检查
你只需要在访问d.attributes之前,先确认d不是null或者undefined就行。这里有两种可靠的写法:
方案1:传统短路检查(兼容所有环境)
if (c = a.instances[c["data-cke-widget-id"]]) { d = b.getFirst(g.isParserWidgetElement); f.push({ wrapper: b, element: d, widget: c, editables: {} }); // 先检查d是否存在,再处理属性 if (d && "1" != d.attributes["data-cke-widget-keep-attr"]) { delete d.attributes["data-widget"]; } }
这里用d && ...的短路逻辑,只有当d不为null/undefined时,才会执行后面的属性判断和删除操作,从根源避免了null引用错误。
方案2:可选链语法(ES2020+环境适用)
如果你的项目运行环境支持ES2020及以上的语法,可以用更简洁的可选链操作符:
if (c = a.instances[c["data-cke-widget-id"]]) { d = b.getFirst(g.isParserWidgetElement); f.push({ wrapper: b, element: d, widget: c, editables: {} }); // 可选链自动处理null/undefined的情况 if ("1" != d?.attributes?.["data-cke-widget-keep-attr"]) { delete d?.attributes?.["data-widget"]; } }
d?.attributes会在d为null时直接返回undefined,不会抛出错误,代码看起来更清爽。
为什么之前添加检查没成功?
大概率是你把检查的位置放错了——比如可能在f.push之前就判断了d,但其实f.push里是允许element: d为null的,真正需要检查的是访问d.attributes的那一行。现在把检查放在属性操作的前面,就能完美解决问题啦。
内容的提问来源于stack exchange,提问作者chadb768
相关产品推荐
相关产品推荐

