js中的 & 与 | 运算

介绍

在JavaScript中“&&”和“||”是逻辑运算符;“&”和“|”是位运算符,今天主要讲一讲位运算。

JavaScript中的位运算符:“&”

运算方法:将十进制转换为二进制,两个二进制数值每个分别相与,同时为1才得1,只要一个为0就为0。

例如:

20 & 2

20的二进制是10100,2的二进制是10, 补位后为10100和00010,最终得出得出00000,结果为十进制0。

let a=20 & 2
// 10100和00010=00000
console.log(a);  //0

22 & 2

22的二进制是10110,2的二进制是10, 补位后为10110和00010,最终得出得出00010,结果为十进制2。

let b=22 & 2
// 10110和00010=00010
console.log(b);  //2

JavaScript中的位运算符:“|”

运算方法:将十进制转换为二进制,两个二进制数值对应的位只要有一个为1,那么结果都为1。否则就为0。

例如:

20 | 2

20的二进制是10100,2的二进制是10, 补位后为10100和00010,最终得出得出10110,结果为十进制22。

let c=20 | 2
 // 10100 | 00010=10110  结果为十进制的22
console.log(c);  //22

22 | 2

20的二进制是10110,2的二进制是10, 补位后为10110和00010,最终得出得出10110,结果为十进制22。

let d=22 | 2
// 10110 | 00010=10110 结果为十进制的22
console.log(d);  //22

20.5 | 0

20.5的二进制是10100.1,0的二进制是0, 补位后为10100.1和00000,最终得出得出10100,结果为十进制20。

let e=20.5 | 0  
// 10100.1 00000   10100   20
console.log(e);

<think>嗯,用户想了解编程语言中的逻辑运算&&和||之间的区别。首先,我需要回忆这两个运算符的基本定义和用途。记得&&代表逻辑,而||代表逻辑或。两者的主要区别在于它们的运算条件和短路行为。 接下来,我应该整理它们的共同点和不同点。共同点可能包括都是二元运算符,都支持短路求值,用于条件判断等。不同点的话,比如&&需要两个条件都为真才返回真,而||只要有一个为真就返回真。此外,它们的优先级可能不同,通常&&比||高,不过用户可能更关注使用场景的不同。 然后,考虑用户可能的实际应用场景。比如在条件语句中如何组合使用这两个运算符,或者它们在不同编程语言中的行为是否一致。例如JavaScript中的类型转换,比如使用!!来强制转换为布尔值,这可能和引用中的例子有关,需要提到这一点。 还要注意用户提到的引用内容,比如引用[1]提到操作数应为primary-expressions,这可能涉及到运算符的使用规范。引用[2]中的例子展示了在JavaScript中如何用!!来转换布尔值,这可能和逻辑运算符的返回值有关,需要解释&&和||返回的是其中一个操作数的值,而不是单纯的布尔值,所以有时候需要转换。 另外,引用[4]中的循环例子可能涉及在条件判断中使用这两个运算符,比如在while或if语句中的条件组合。需要举例说明在不同控制结构中的应用。 最后,生成相关问题的时候,要确保覆盖用户可能进一步想知道的内容,比如运算符优先级、短路求值的应用、不同语言中的差异等。同时,检查是否有遗漏的重要区别,比如返回值的类型或实际编程中的常见错误。</think>### 逻辑运算符 `&&`(AND) `||`(OR)的区别 #### 1. **基础定义** - **`&&`(逻辑)** 当且仅当**所有操作数均为真**时,表达式结果为真。例如: ```javascript if (age > 18 && hasLicense) { /* 只有两者都为真时执行 */ } ``` 若第一个操作数为假,直接返回假,不计算第二个操作数(短路求值)[^1][^4]。 - **`||`(逻辑或)** 只要**任意一个操作数为真**,表达式结果为真。例如: ```python if (is_guest || has_permission) { /* 任一为真时执行 */ } ``` 若第一个操作数为真,直接返回真,不计算第二个操作数(短路求值)。 --- #### 2. **返回值类型** - **`&&`**:返回最后一个被求值的操作数。 例如:`"hello" && 0 && true` 返回 `0`(第一个假值)。 - **`||`**:返回第一个为真的操作数。 例如:`null || "default"` 返回 `"default"`[^2]。 --- #### 3. **优先级结合性** - **优先级**:`&&` 的优先级高于 `||`。例如: `a || b && c` 等价于 `a || (b && c)`[^3]。 - **结合性**:两者均从左到右结合。 --- #### 4. **应用场景** - **`&&` 的典型用例**: - 链式条件检查:`if (user && user.isAdmin)` - 替代简单 `if` 语句:`isValid && submitForm()` - **`||` 的典型用例**: - 设置默认值:`const name = inputName || "Anonymous"` - 错误回退:`const data = fetchData() || logError()` --- #### 5. **短路求值的实际意义** - **避免副作用**: ```javascript // 若 user 为 null,不会访问 user.isAdmin if (user && user.isAdmin) { ... } ``` - **优化性能**: 提前终止不必要的计算,例如: ```python while (index < 5 && data[index] != target) { ... } ``` --- §§ 相关问题 §§ 1. 如何利用短路求值优化代码性能? 2. 逻辑运算符在类型转换中的行为有何差异(如 JavaScript 的 `!!` Python 的 `bool()`)? 3. 运算符优先级如何影响条件判断的编写? 4. 如何避免逻辑运算符导致的隐式类型转换错误?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值