JS ?? 和 ||
<style>.artBox { margin: 20px auto; font: normal 18px/26px sans-serif; }
.artBox mark { padding: 0 6px; background: rgba(0,100,100,0.35); }
.artBox p { margin: 12px 0; }
</style>
<div class="artBox">
<p>在 JavaScript,双问号 <mark>??</mark> 是<b>空值合并运算符</b>,双竖杠 <mark>||</mark> 是<b>逻辑或运算符</b>,<mark>OR</mark>。二者同属于<b>逻辑运算符</b>,语法结构一致:</p>
<div class="hEdiv"><pre class="hEpre">
function sayHi(user) {
return `Hi ${user ?? '某某'}!`;
}
function sayHello(user) {
return `Hello ${user || '某某'}!`;
}
console.log(sayHi()); // -> Hi 某某!
console.log(sayHi('李四')); // -> Hi 李四!
console.log(sayHello()); // -> Hello 某某!
console.log(sayHello('李四')); // -> Hello 李四!
</pre></div>
<p>上例的两个函数:</p>
<p>其一:<mark>sayHi(user)</mark> 返回一个问候语,如果参数 user 调用者按预期传值(字符串值或能转为字符串的值),则使用双问号 <mark>??</mark> 前的 user 作为问候对象,如果不传值或所传值为 <mark>null/undefined</mark>,问候对象就用“某某”代替。换言之,空值合并运算符 <mark>??</mark> 之前的值若已定义,用它,若值未定义,即为 null 或 undefined 则用“某某”代替。再换言之,函数 sayHi(user) 的 return 语句通过双问号空值合并运算符将两种可能合并成一个值,要么是传参值,要么是“某某”。再体会以下不同形式的 sayHi 调用:</p>
<div class="hEdiv"><pre class="hEpre">
// 空值属于已定义
console.log(sayHi('')); // -> Hi !
// true/false属于已定义
console.log(sayHi(true)); // -> Hi true!
console.log(sayHi(false)); // -> Hi false!
// null未定义
console.log(sayHi(null)); // -> Hi 某某!
// undefined 未定义
console.log(sayHi(undefined)); // -> Hi 某某!
</pre></div>
<p>其二:<mark>sayHello(user)</mark> 函数,return 语句语法结构和双问号的一致。作为逻辑或运算符,双竖杠工作机制是,若 user 不为空('')、不为 0、不为假(false)、不为未定义(null和undefined)就用它,否则用“某某”。体会更多的 sayHello 调用:</p>
<div class="hEdiv"><pre class="hEpre">
// 0
console.log(sayHello(0)); // -> Hello 某某!
// 非 0
console.log(sayHello(2)); // -> Hello 2!
console.log(sayHello(-0.5)); // -> Hello -0.5!
// 空值
console.log(sayHello('')); // -> Hello 某某!
// 空格值
console.log(sayHello(' ')); // -> Hello !
// true/false
console.log(sayHello(true)); // -> Hello true!
console.log(sayHello(false)); // -> Hello 某某!
// null/undefined
console.log(sayHello(null)); // -> Hello 某某!
console.log(sayHello(undefined)); // -> Hello 某某!
</pre></div>
<p>总而言之,双问号和双竖杠运算符都是逻辑运算符,二者语法结构相同,用于确定变量赋值(符号前的值合规,用它,反之用符号后给定的预设值);具体用法在规范上不尽相同,主要区别是,双问号前的值只要不是 null 或 undefined 就用它,反之就用后面设定的值;双竖杠管的宽一些,前面的值包含 ''、0、false、null、undefined 等,是这些值中的任意一个,就取 <mark>||</mark> 右侧预定义的值,否则取符号左侧的值。依此,现实应用中应灵活选用<b>空值合并运算符</b>或<b>逻辑或运算符</b>。</p>
</div>
<script type="module">
import hl from 'https://638183.freep.cn/638183/web/js/hl.js';
const divs = document.querySelectorAll('.hEdiv');
const pres = document.querySelectorAll('.hEpre');
divs.forEach((div,idx) => hl.hl(div, pres));
// 以下测试
function sayHi(user) {
return `Hi ${user ?? '某某'}!`;
}
console.log(sayHi('')); // -> Hi !
</script> 谢谢黑黑老师辛苦,学习了。{:4_187:} 马老师晚上好~~
看不懂,{:4_173:}那就键盘支持,祝您秋安!{:4_204:}{:4_190:}
梦江南 发表于 2026-8-21 17:49
谢谢黑黑老师辛苦,学习了。
{:4_190:} 霜染枫丹 发表于 2026-8-21 20:27
马老师晚上好~~
看不懂,那就键盘支持,祝您秋安!
{:4_190:} 这两个运算符的差别很小,只要记住差别之处,就能灵活运用了。
感谢黑黑的好帖,辛苦了{:4_187:} 红影 发表于 2026-8-22 08:42
这两个运算符的差别很小,只要记住差别之处,就能灵活运用了。
感谢黑黑的好帖,辛苦了
差别不小,很大。
实际应用场景中,当需要从一个变量值确定另一个变量值,选用 ?? 还是 || 视情况而定。
页:
[1]