详解JS中单竖线“|”与双竖线“||”的区别及用法
本文深入解析JavaScript中单竖线“|”与双竖线“||”的用法。单竖线“|”用于位运算,可将数字转换为二进制进行按位或操作,常用于快速取整;双竖线“||”为逻辑或运算符,返回第一个有效值。文章对比了两者在性能、功能及底层实现上的差异,帮助开发者正确选择适用场景。
单竖线“|”与双竖线“||”概述
在JavaScript开发过程中,开发者经常会遇到单竖线“|”与双竖线“||”这两个符号。它们在运算中的具体含义和区别是什么?
当对整数进行操作时,单竖线“|”的作用类似于去除小数部分,其效果等同于parseInt()。对于正数,它相当于Math.floor();而对于负数,则相当于Math.ceil()。需要注意的是:
1. Math.ceil()函数用于向上取整。 2. Math.floor()函数用于向下取整。 3. Math.round()是数学中常用的四舍五入取整方法。
console.log(0.6|0)//0
console.log(1.1|0)//1
console.log(3.65555|0)//3
console.log(5.99999|0)//5
console.log(-7.777|0)//-7
单竖线“|”的运算规则
单竖线“|”的运算规则
通过上述示例,我们可以大致了解单竖线“|”可以用于取整运算,即只保留整数部分,去除小数部分。但“|0”是如何实现取整的?为什么“|0”能达到取整的目的?如果单竖线不与0结合,结果会是多少?
带着这些疑问,我们来看下面的例子:
console.log(3|4); //7
console.log(4|4);//4
console.log(8|3);//11
console.log(5.3|4.1);//5
console.log(9|3455);//3455
这里提到了单竖线“|”,但未涉及JavaScript的具体实现细节。
这里揭示答案:单竖线“|”实际上是先将数字转换为二进制,然后进行按位或(OR)运算得到结果。例如,以简单情况为例:
3|4
转换为二进制后为011 | 100,按位或运算得到111,即十进制的7。
4|4
转换为二进制后为100 | 100,按位或运算得到100,即十进制的4。
8|3
转换为二进制后为1000 | 011,按位或运算得到1011,即十进制的11。
以此类推,单竖线“|”的运算本质是将数字转换为二进制后进行按位或运算。
JS双竖线运算符“||”
JS双竖线运算符“||”
1. JS双竖线运算符“||”表示逻辑或比较。例如null||'1'返回'1';'2'||'1'返回'2'。在逻辑或运算中,如果第一个操作数为真,则不再计算第二个操作数,直接返回第一个操作数的值。因此,'2'||'1'的结果是'2'。
2. 在JavaScript中,使用双竖线运算符“||”会返回第一个有效值(即非假值)。
var objOne = undefined || 1 || null || new Date();
var objTwo = new Date();
var objThree = objOne || objTwo;
alert(objThree.toString()); //out put "1"
总结
性能与功能对比
性能上的比较
在逻辑运算符“&&”和“||”中,如果“&&”的第一个运算数是false,则不再考虑第二个运算数,直接返回false;如果“||”的第一个运算数是true,则不再考虑第二个运算数,直接返回true。而位运算符“&”和“|”则不同,它们总是需要比较两个运算数才能得出结果。因此,从性能角度来看,“&&”和“||”比“&”和“|”更高效。
功能用法
“&&”和“||”仅用于逻辑运算,而“&”和“|”除了可以进行逻辑运算外,还可以进行位运算。
位运算
“&”和“|”本质上是位运算符。它们之所以能进行逻辑运算,是因为JavaScript是无类型语言,各数据类型可以自由转换。当使用“&”和“|”进行逻辑运算时,实际上是将true转换为1,false转换为0,然后进行逐位运算:
document.write(true & false); //JS,结果为0
上述示例等同于将逻辑运算转化为位运算并执行:
document.write(1 & 0); //JS,结果为0
正是由于“&”和“|”是逐位运算符,才出现了前文所述的情况:它们必须比较两个运算数才能得出结果,这导致其性能低于“&&”和“||”。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
