You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在未定义对象上使用三元运算符?赋值报错及优化方案咨询

解决三元运算符赋值时"Cannot set property 'po_no' of undefined"的问题

首先得澄清一个关键点:你遇到的错误不是三元运算符没有跳过cart[0]的访问,问题出在左边的this.order本身是undefined——你试图给一个不存在的对象的属性赋值,自然会抛出这个错误。哪怕你把右边的表达式换成固定字符串"P.O. Number",直接写this.order.po_no = "P.O. Number",同样会报一样的错。

第一步:先初始化this.order

在给po_no赋值前,必须确保this.order是一个可用的对象。最简单的写法是:

// 如果this.order未定义,就初始化为空对象
this.order = this.order || {};

第二步:安全地设置po_no(适配大量变量的简洁写法)

考虑到你项目里有大量这类变量,推荐结合**可选链操作符?.空值合并运算符??**来简化代码,同时避免深层属性访问的潜在错误:

this.order = this.order || {};
// 只要cart[0]、cart[0].order任意一层不存在,就用默认值
this.order.po_no = cart[0]?.order?.po_no ?? "P.O. Number";

这种写法甚至不需要手动判断cart.length > 0——如果cart是空数组,cart[0]undefined?.会直接返回undefined,然后??会把它替换成你指定的默认值"P.O. Number",逻辑更简洁也更安全。

如果你还是想用三元运算符,也可以结合可选链来保证安全:

this.order = this.order || {};
this.order.po_no = cart.length > 0 ? cart[0]?.order?.po_no : "P.O. Number";

为什么之前的代码会报错?

再回头说你疑惑的“三元运算符没跳过cart[0]”——其实它已经跳过了!当cart.length > 0false时,三元运算符会直接返回右边的"P.O. Number",根本不会执行cart[0]['order']['po_no']。你可以做个测试:把右边的表达式换成console.log('执行了吗?') || "P.O. Number",会发现当cart.length为0时,控制台不会打印这句话,说明确实没执行左边的分支。

真正的问题就是this.order未初始化,导致赋值操作本身失败。

内容的提问来源于stack exchange,提问作者ang

火山引擎 最新活动