<Javascript>浅谈js“三元表达式” (三元运算符)

前言

各位大神,大家好,相约周三。我们又见面了。
众所周知,三元表达式在代码量上比if…else语句更简洁一些。但是博主在可读性上更加偏向于if…else语句。三元表达式不仅在js中使用,在很多后台程序语言,比如java、php中都有使用,不过在js中对于三元表达式的要求貌似要松很多。废话不多说。下面一起看看三元表达式。

三元表达式

素质N连问

首先 为什么叫三元表达式?
顾名思义,有三个元素组成的表达式。

哪三个元素呢?
“条件”“真结果”“假结果”。

三元表达式的基本格式是什么呢?
条件?真结果:假结果

三元表达式是如何对应if…else语句的?
条件 ? 真结果 : 假结果
if(条件){真结果}else{假结果}

我们来看一下官方的解释。W3C把“三元表达式”叫做"ECMAScript 条件运算符"这里写图片描述
诶!中间为什么空了一块呢?
我给它补上:
boolean_expression ? true_value : false_value
这行代码的意思官方也给了具体的说明,这里不再赘述。

三元表达式结果执行多行代码表达:

大家也看到了,在官方的w3c文档中,给的只有一条结果执行语句,但是博主之前说过,至少在js中,三元表达式和if…else语句是可以相互替换的。
那么既然if…else语句都可以在结果执行时写多行代码,三元表达式为什么不行呢?
其实是可以的。

		<script>
		var a='';
		var b='';
		var age=prompt("Input your age:");
		age>18 ? (a='成年人',b='18岁以上') : (a='未成年人',b='18岁以下');
		alert(a);
		alert(b);
		</script>

这下看明白了吗?只要在结果中多条语句之间加上“,”就可以了。

三元表达式在for循环中的运用

<script>
		var a='';
		var b='';
		for(var i=0;i<4;i++){
			i>2 ? (a='成年人',b='18岁以上') : (a='未成年人',b='18岁以下');
			alert(a);
			alert(b);
		}
		</script>

以上代码打印一次 ‘成年人’,‘18岁以上’ 三次‘ 未成年人’,‘18岁以下’。(此处感谢 @nimapier 指出错误)

三元表达式的嵌套
if…else语句可以嵌套多层,那想必三元表达式也可以进行嵌套吧!没错,三元表达式可以进行嵌套,而且理论上可以无限嵌套下去。为什么说理论上?因为暂时没有见过有人嵌套过多行三元表达式。首先不利于代码的阅读,其次对于逻辑能力不强的人来说,确实是一种脑力的摧残!大家自行感受一下。

		<script>
		var a='';
		var b='';
		var age=prompt("Input your age:");
			age<18 ?  (a='儿童',b='18岁以下'):( age>50 && age<80 ? (a='老年人',b='50岁以上') : (age>=80 ? (a='长寿者',b='80岁以上'):(a='你的年龄是以下两种',b='18、50')));
			alert(a);
			alert(b);
		</script>

其实这块代码看起来感觉还不是很明显,但是博主在调试过程中已经有点晕了,特别是在最后三个括号那里,纠结了!

所以归纳一下三元表达式的嵌套:
条件1 ? 真结果1:( 条件1.1 真结果1.1 : (条件1.1.1 ? 真结果1.1.1:假结果1.1.1))
简便的写法可以不用括号
是不是眼睛都看花了?

三元表达式的局限性

最后,大家注意,三元表达式在使用过程中不能使用break,continue等语句。否则…
这里写图片描述

最最后谢谢各位大神赏脸阅读鄙人拙劣的博客。撰写不恰当之处还希望各位大佬指出共同学习。

<think>好的,用户的问题是在JSP中使用<c:forEach>标签遍历图片列表时,如何为<img>标签设置默认图片路径作为后备方案。之前已经给过两种方法,用户现在再次提问,可能需要更详细的步骤或者不同的方法。 首先,我需要回顾之前的回答,确保这次回答一致但不过于重复。用户提供的引用内容里,引用[1]是JSP页面示例,涉及EL表达式,可能和默认图片设置相关。用户之前的问题和我的回答都集中在EL表达式和JSTL标签处理默认路径,所以可能需要强调这些点。 用户当前的JSP代码中有${xq.zs}作为图片路径,这里需要处理当zs属性为空或路径无效时显示默认图片。根据之前的回答,EL表达式结合三元运算符是一个方法,比如${not empty xq.zs ? xq.zs : '/images/default.png'}。同时,使用onerror事件处理加载失败的情况。 需要确保路径正确,尤其是上下文路径的处理,使用${pageContext.request.contextPath}来避免路径错误。另外,用户代码中的图片路径是"zs/${xq.zs}",可能需要检查zs是否在正确的目录下,或者是否需要添加上下文路径。 另外,用户可能没有考虑到默认图片的位置是否可访问,需要提醒将默认图片放在正确目录下,比如Web应用的/images目录,并通过绝对路径引用。同时,使用<c:url>标签来生成正确的URL,避免路径问题。 可能还需要提到使用JSTL的<c:catch>来处理异常,但这种方法可能不太常见,不如EL和onerror事件直接。因此,重点应放在EL表达式和onerror的结合使用,以及路径处理上。 需要检查用户提供的代码示例中的<img>标签,发现用户原来的代码是src="zs/${xq.zs}",这可能是一个相对路径,容易出问题,建议改为使用绝对路径,结合上下文路径,例如src="${pageContext.request.contextPath}/zs/${xq.zs}",但需要考虑zs目录的位置。 总结解决方案:在EL表达式中判断zs是否为空,为空则替换为默认图片路径,并添加onerror事件作为双重保险,同时使用绝对路径确保图片正确加载。同时,给出具体的代码修改示例,帮助用户直接替换原有代码。</think>根据你的JSP代码结构和需求,可以通过 **EL表达式空值判断 + JavaScript容错** 实现图片默认路径,以下是具体改造方案: ### 改造后的代码示例 ```jsp <div id="contentCon"> <c:forEach items="${somexq}" var="xq" varStatus="status"> <c:if test="${status.index%3==0}"><ul></c:if> <li class=""> <div> <ol> <li> <a href="Queryxq?id=${xq.id}" class="yili"> <img src="${not empty xq.zs ? 'zs/'+=xq.zs : '/images/default.png'}" alt="${xq.name}" onerror="this.src='${pageContext.request.contextPath}/images/default.png'" > </a> </li> <li>${xq.name}</li> <p>¥${xq.price}</p> </ol> </div> </li> <c:if test="${status.index%3==2}"></ul></c:if> <c:if test="${status.index%3!=2 && len==status.index+1}"></ul></c:if> </c:forEach> </div> ``` --- ### 关键实现解析 1. **EL表达式空值处理** - 表达式 `${not empty xq.zs ? 'zs/'+=xq.zs : '/images/default.png'}` 实现: - 当`xq.zs`(数据库存储的图片路径)存在时,拼接完整路径`zs/xq.zs` - 当`xq.zs`为空时,直接返回默认图片绝对路径`/images/default.png`[^1] 2. **JavaScript容错机制** - `onerror`事件会在以下情况触发替换为默认图片: - 图片路径拼接错误(如`zs/xq.zs`实际不存在) - 服务器文件丢失/权限问题 - 使用`${pageContext.request.contextPath}`确保绝对路径正确性[^3] 3. **路径规范建议** - 默认图片应存放在`WebRoot/images/`目录下 - 动态图片建议存放在`WebRoot/zs/`目录(与代码中`zs/xq.zs`对应) --- ### 扩展优化方案 如果项目已启用JSTL,可进一步优化: ```jsp <%-- 在页面顶部声明变量 --%> <c:set var="defaultImg" value="${pageContext.request.contextPath}/images/default.png"/> <%-- 在循环中使用标准化路径 --%> <img src="${not empty xq.zs ? 'zs/'+=xq.zs : defaultImg}" alt="${xq.name}" onerror="this.src='${defaultImg}'"> ``` - 优点:统一管理默认路径,降低维护成本 - 原理:`<c:set>`创建的变量可在整个页面作用域使用[^2] --- ### 效果验证 | 场景 | 处理逻辑 | 结果 | |--------------------|---------------------------------|------------------| | xq.zs字段为空 | EL表达式直接返回默认路径 | 显示默认图片 | | zs/xq.zs文件存在 | 正常加载目标图片 | 显示实际图片 | | zs/xq.zs文件损坏/丢失 | onerror事件触发替换 | 显示默认图片 | | 服务器上下文路径变更 | 通过pageContext自动适配新路径 | 无需修改代码自动生效 |
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值