JS中&&和||用法

 

转载自:http://wenrunchang123.iteye.com/blog/1749802

 

&&和||在JQuery源代码内尤为使用广泛,由于本人没有系统的学习js,所以只能粗略的自我理解出来,希望大家指点下。
粗略理解如下:

a() && b() :如果执行a()后返回true,则执行b()并返回b的值;如果执行a()后返回false,则整个表达式返回a()的值,b()不执行;
a() || b() :如果执行a()后返回true,则整个表达式返回a()的值,b()不执行;如果执行a()后返回false,则执行b()并返回b()的值;
&& 优先级高于 ||

如下:
  
代码
复制代码 代码如下:

alert((1 && 3 || 0) && 4); //结果4 ①
alert(1 && 3 || 0 && 4); //结果3 ②
alert(0 && 3 || 1 && 4); //结果4 ③

分析:
语句①:1&&3 返回3 => 3 || 0 返回 3 => 3&&4 返回 4
语句②:先执行1&&3 返回3,在执行0&&4返回0,最后执行结果比较 3||0 返回 3
语句③:先执行0&&3 返回0,在执行1&&4返回4,最后执行结果比较 0||4 返回 4

注:非0的整数都为true,undefined、null和空字符串”" 为false。

<think>嗯,用户现在想知道在Angular的*ngIf指令中是否可以使用复杂的逻辑表达式,比如(a && b) || c。他们可能是在开发过程中遇到了需要根据多个条件组合来显示或隐藏元素的情况。我之前已经回答过关于Angular中!!!的区别,涉及到模板表达式类型转换,现在用户进一步询问复杂逻辑的使用,可能是想更灵活地控制视图的显示。 首先,我需要确认Angular的模板语法是否支持这样的逻辑表达式。根据之前的引用[^1],模板表达式是普通的JavaScript代码片段,但有一些限制。用户提到的(a && b) || c属于逻辑运算符的组合,这在JavaScript中是合法的,所以应该可以在*ngIf中使用。但需要提醒用户注意Angular模板表达式的限制,比如不能赋值或使用new运算符等。 然后,我需要考虑如何提供示例。最好给出一个具体的例子,比如在组件中定义几个布尔变量a、b、c,然后在模板中使用它们的组合。这样用户可以直接看到如何应用。例如: <ng-container *ngIf="(a && b) || c">...</ng-container> 同时,需要指出使用括号的重要性,因为逻辑运算符的优先级可能会影响结果,添加括号可以确保表达式按预期执行。 接下来,用户可能需要知道如何处理更复杂的逻辑,比如调用方法或涉及异步数据。这时候应该建议将复杂逻辑移到组件的方法中,保持模板简洁,并提到性能考虑,比如避免在模板中频繁调用方法,以免触发不必要的变更检测。 还要提到Angular的生命周期钩子,比如ngOnInitngDoCheck,引用[^2]中的内容,说明在组件初始化时如何处理数据,或者在变更检测时如何优化性能。例如,在ngOnInit中预先计算条件,而不是在模板中实时计算。 此外,用户可能关心代码的可读性维护性。应该建议将复杂表达式分解为多个变量或方法,这样模板更清晰,也便于调试。例如,在组件中定义一个getter方法: get showElement(): boolean { return (this.a && this.b) || this.c; } 然后在模板中使用: <div *ngIf="showElement">...</div> 最后,需要总结在*ngIf中使用复杂表达式的注意事项,包括语法正确性、性能影响最佳实践。同时,确保引用之前的引用内容,比如提到模板表达式的评估上下文变更检测的影响[^1][^2]。 可能用户还会遇到其他相关问题,比如如何处理异步数据在条件中的使用,或者如何在条件中包含函数调用,这些可以作为相关问题提出,帮助用户进一步探索。</think>在 Angular 的 `*ngIf` 指令中,**可以使用复杂逻辑表达式**,包括 `(a && b) || c` 这样的组合条件。以下是具体说明示例: --- ### **1. 复杂表达式语法规则** - **支持标准 JavaScript 逻辑运算符**:`&&`(与)、`||`(或)、`!`(非)。 - **可嵌套括号**:通过括号明确优先级,例如 `(a && b) || c`。 - **可结合组件属性/方法**:表达式可包含组件类中定义的属性或方法。 #### **示例代码** ```html <!-- 组件模板 --> <div *ngIf="(isLoggedIn && hasPermission) || isAdmin"> 敏感内容 </div> ``` ```typescript // 组件类 export class AppComponent { isLoggedIn: boolean = true; hasPermission: boolean = false; isAdmin: boolean = true; } ``` - **结果**:`(true && false) || true` → `true`,内容显示。 --- ### **2. 使用注意事项** #### **(1) 避免副作用操作** - **禁止赋值操作**:如 `*ngIf="(a = b) || c"` 会触发模板解析错误[^1]。 - **避免调用高开销方法**:频繁触发的方法会降低性能(如 `*ngIf="getData()"`)。 #### **(2) 明确优先级** - 使用括号消除歧义: ```html <!-- 推荐写法 --> <div *ngIf="(a && b) || c"></div> <!-- 不推荐(易混淆优先级) --> <div *ngIf="a && b || c"></div> ``` #### **(3) 复杂逻辑拆分** - **方案一**:通过组件方法封装逻辑 ```typescript // 组件类 shouldShowContent(): boolean { return (this.a && this.b) || this.c; } ``` ```html <!-- 模板 --> <div *ngIf="shouldShowContent()"></div> ``` - **方案二**:使用 `ng-container` 组合多个条件 ```html <ng-container *ngIf="a && b"> <div>内容 A</div> </ng-container> <ng-container *ngIf="c"> <div>内容 B</div> </ng-container> ``` --- ### **3. 常见问题示例** #### **场景:异步数据 + 复杂条件** ```typescript // 组件类 export class UserComponent implements OnInit { user: User | null = null; isLoading: boolean = true; ngOnInit() { this.loadUser(); } private loadUser() { this.userService.getUser().subscribe(user => { this.user = user; this.isLoading = false; }); } } ``` ```html <!-- 等待加载完成且用户为VIP或管理员 --> <div *ngIf="!isLoading && (user?.isVip || user?.isAdmin)"> 专属内容 </div> ``` --- ### **4. 性能优化建议** 1. **缓存复杂条件结果** 在组件中通过属性缓存布尔值,减少模板表达式计算次数: ```typescript private _showContent: boolean | null = null; get showContent(): boolean { if (this._showContent === null) { this._showContent = (this.a && this.b) || this.c; } return this._showContent; } ``` 2. **结合变更检测策略** 使用 `ChangeDetectionStrategy.OnPush` 减少不必要的检测[^2]: ```typescript @Component({ selector: 'app-example', changeDetection: ChangeDetectionStrategy.OnPush }) ``` --- ### **总结** | 操作 | 合法示例 | 非法示例 | |---------------------|--------------------------|-------------------------| | 逻辑运算符组合 | `(a && b) || c` | `a && b = c`(赋值操作)| | 方法调用 | `*ngIf="validate(a)"` | `*ngIf="a = validate()"`| | 嵌套属性访问 | `*ngIf="user?.isActive"` | `*ngIf="user.isActive"`(未处理 null)| ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值