JavaScript 中的逻辑运算符不仅是条件判断的核心,还能通过“短路特性”简化代码;结合 DOM 操作的实战案例,更能体现其灵活性。本文整理了逻辑运算符的个人理解、优先级规则,以及 4 个高频实战需求的实现方案,附个人思路与代码解析。
一、逻辑运算符:个人理解与核心规则
逻辑运算符(&&
、||
、!
)是 JS 中最常用的运算符之一,除了判断真假,其“短路求值”特性更是简化代码的关键。
1. 核心规则:用“个人翻译”讲透逻辑运算
我习惯用“选值逻辑”理解 &&
和 ||
,不用死记“true/false 组合表”,更贴近实际开发场景:
(1)逻辑与(&&
):“先看第一个,错了就选它,对了就选第二个”
- 运算原则:
A && B
- 若
A
为“假”(空字符串''
、0
、null
、undefined
、NaN
),直接返回A
(短路,不看B
); - 若
A
为“真”,返回B
(无论B
真假,都会执行到B
)。
- 若
- 个人翻译:比如
var res = a && b
,可以理解为“a 靠谱吗?不靠谱就用 a(代表错的),靠谱就用 b”。 - 示例:
console.log('abc' && 'def'); // 输出 'def'(A真,选B) console.log('' && 'def'); // 输出 ''(A假,选A) console.log(0 && 123); // 输出 0(A假,选A)
(2)逻辑或(||
):“先看第一个,对了就选它,错了就选第二个”
- 运算原则:
A || B
- 若
A
为“真”,直接返回A
(短路,不看B
); - 若
A
为“假”,返回B
(无论B
真假,都会执行到B
)。
- 若
- 个人翻译:比如
var res = a || b
,可以理解为“a 有用吗?有用就用 a,没用就用 b”。 - 示例:
console.log('abc' || 'def'); // 输出 'abc'(A真,选A) console.log('' || 'def'); // 输出 'def'(A假,选B) console.log(0 || 123); // 输出 123(A假,选B)
(3)逻辑非(!
):“把真假反过来”
- 运算原则:
!A
- 先将
A
转为布尔值,再取反(真变假,假变真)。
- 先将
- 个人翻译:“a 是对的吗?不是就返回 true,是就返回 false”。
- 示例:
console.log(!'abc'); // 输出 false('abc'是真,取反为假) console.log(!''); // 输出 true(''是假,取反为真) console.log(!0); // 输出 true(0是假,取反为真)
2. 优先级:“非” > “与” > “或”
三个逻辑运算符的执行顺序:!
(逻辑非) > &&
(逻辑与) > ||
(逻辑或),优先级高的先执行。
- 示例:
console.log(!false && true || false); // 执行顺序:!false → true,再 true && true → true,最后 true || false → true
3. 关键补充:“假值”的范围
判断 A
是“真”还是“假”,核心看是否属于“假值”,JS 中只有 6 种假值:
''
(空字符串)、0
、null
、undefined
、NaN
、false
,其余均为“真值”(包括 '0'
、1
、[]
、{}
等)。
二、实战案例:4 个高频需求的实现
结合逻辑运算符、DOM 事件绑定、数据类型转换等知识点,实现 4 个面试与开发中常见的需求。
案例 1:两种方式实现注册表单(含验证)
需求
用 type="submit"
和 type="button"
两种按钮,实现注册功能,验证账号/密码长度在 6-30 位之间。
方案 1:type="submit"
按钮(依赖表单 onsubmit
事件)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册表单(submit 按钮)</title>
</head>
<body>
<!-- 表单 onsubmit 事件:返回 false 阻止提交,true 允许提交 -->
<form action="success.html" method="get" onsubmit="return checkForm()">
<p>账号:<input type="text" id="username" name="username"></p>
<p>密码:<input type="password" id="pwd" name="pwd"></p>
<button type="submit">注册(submit)</button>
</form>
<script>
function checkForm() {
const username = document.getElementById('username').value;
const pwd = document.getElementById('pwd').value;
// 验证账号长度:用 || 判断“小于6”或“大于30”,满足则提示并阻止提交
if (username.length < 6 || username.length > 30) {
alert('账号长度需在 6-30 位之间');
return false; // 阻止表单提交
}
// 验证密码长度
if (pwd.length < 6 || pwd.length > 30) {
alert('密码长度需在 6-30 位之间');
return false;
}
// 验证通过,允许提交
return true;
}
</script>
</body>
</html>
方案 2:type="button"
按钮(手动触发表单提交)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册表单(button 按钮)</title>
</head>
<body>
<form id="regForm" action="success.html" method="get">
<p>账号:<input type="text" id="username" name="username"></p>
<p>密码:<input type="password" id="pwd" name="pwd"></p>
<button type="button" id="regBtn">注册(button)</button>
</form>
<script>
const regBtn = document.getElementById('regBtn');
const regForm = document.getElementById('regForm');
// 给 button 绑定点击事件
regBtn.addEventListener('click', function() {
const username = document.getElementById('username').value;
const pwd = document.getElementById('pwd').value;
// 同样的验证逻辑
if (username.length < 6 || username.length > 30) {
alert('账号长度需在 6-30 位之间');
return; // 验证失败,不执行后续代码
}
if (pwd.length < 6 || pwd.length > 30) {
alert('密码长度需在 6-30 位之间');
return;
}
// 验证通过,手动提交表单
regForm.submit();
});
</script>
</body>
</html>
案例 2:两种事件绑定实现交互功能
需求
用 addEventListener
和 onclick
两种绑定方式,实现:
- 点击按钮显示/隐藏图片;
- 点击按钮显示文本框内容;
- 移动鼠标显示坐标。
实现代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>事件绑定实战</title>
<style>
#img1 { display: none; } /* 初始隐藏图片 */
#coordTip { position: absolute; } /* 坐标提示框跟随鼠标 */
</style>
</head>
<body>
<!-- 功能按钮与元素 -->
<button id="showImgBtn">显示/隐藏图片</button>
<button id="showInputBtn">显示文本框内容</button>
<input type="text" id="infoInput" value="给 UP 主三连~">
<img id="img1" src="test.jpg" width="300" alt="测试图片">
<!-- 鼠标坐标显示区 -->
<div id="coordTip"></div>
<script>
window.onload = function() {
const img1 = document.getElementById('img1');
const infoInput = document.getElementById('infoInput');
const coordTip = document.getElementById('coordTip');
// 1. addEventListener 绑定:显示/隐藏图片(切换 display 属性)
document.getElementById('showImgBtn').addEventListener('click', function() {
img1.style.display = img1.style.display === 'block' ? 'none' : 'block';
});
// 2. onclick 绑定:显示文本框内容
document.getElementById('showInputBtn').onclick = function() {
alert('文本框内容:' + infoInput.value);
};
// 3. addEventListener 绑定:移动鼠标显示坐标
document.addEventListener('mousemove', function(e) {
// e.clientX/Y:鼠标相对于浏览器窗口的坐标
const x = e.clientX;
const y = e.clientY;
// 让提示框跟随鼠标(偏移 30px 避免遮挡)
coordTip.innerHTML = `鼠标坐标:X=${x}, Y=${y}`;
coordTip.style.left = x + 30 + 'px';
coordTip.style.top = y + 'px';
});
};
</script>
</body>
</html>
案例 3:包装 String 并修改 toString
方法
需求
- 定义一个字符串值类型变量;
- 包装成引用类型(
new String()
); - 修改其
toString
方法,使其返回字符串长度。
老师方案(核心:区分值类型与引用类型)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>修改 String 的 toString 方法</title>
<script>
// 1. 值类型字符串(无法修改 toString 方法)
var str = 'testing';
// 尝试修改值类型的 toString:无效,因为值类型不可变
str.toString = function() {
return this.length;
};
alert(str); // 输出 'testing'(修改失败)
// 2. 包装成引用类型(new String())
var strObj = new String(str);
// 修改引用类型的 toString 方法:有效
strObj.toString = function() {
return this.length; // this 指向 strObj,length 是字符串长度
};
alert(strObj); // 输出 7('testing' 长度为 7,修改成功)
</script>
</head>
<body></body>
</html>
我的方案(简化:直接获取长度并返回)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的 String 包装方案</title>
</head>
<script>
// 1. 值类型字符串
var str = '诗书画唱';
// 2. 包装成引用类型
var strObj = new String(str);
// 3. 修改 toString:直接返回长度(this.length 即 strObj.length)
strObj.toString = function() {
return this.length;
};
// 调用 toString 并打印:'诗书画唱' 长度为 4
console.log(strObj.toString()); // 输出 4
</script>
<body></body>
</html>
关键区别
- 值类型(
var str = 'abc'
):无法修改toString
等原型方法,因为值类型不可变; - 引用类型(
var strObj = new String('abc')
):是对象,可自定义方法,修改toString
后,alert
或打印时会自动调用该方法。
案例 4:用逻辑运算符实现“选值逻辑”
需求
创建两个文本输入框,用逻辑或(||
)实现:
- 若输入框 1 有内容,使用输入框 1 的值;
- 若输入框 1 为空,使用输入框 2 的值。
实现代码(含个人思路注释)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>逻辑运算符选值</title>
<script>
window.onload = function() {
const input1 = document.getElementById('input1');
const input2 = document.getElementById('input2');
const resultBtn = document.getElementById('resultBtn');
// 点击按钮,执行选值逻辑
resultBtn.addEventListener('click', function() {
// 核心逻辑:input1.value || input2.value
// 个人翻译:input1 有值吗?有就用 input1,没有就用 input2
const finalVal = input1.value || input2.value;
// 打印结果(若两个都为空,finalVal 为空字符串)
console.log('最终使用的值:', finalVal);
alert('最终使用的值:' + finalVal);
});
};
</script>
</head>
<body>
<input type="text" id="input1" placeholder="输入框1(优先使用)">
<input type="text" id="input2" placeholder="输入框2(备用)">
<button id="resultBtn">获取最终值</button>
</body>
</html>
逻辑验证
输入框 1 内容 | 输入框 2 内容 | 最终结果 | 原因 |
---|---|---|---|
‘abc’ | ‘def’ | ‘abc’ | input1 为真,选 input1 |
‘’ | ‘def’ | ‘def’ | input1 为假,选 input2 |
‘’ | ‘’ | ‘’ | 两个都为假,选 input2(空字符串) |
三、个人学习心得与补充知识点
1. 高效学习建议
- “翻译”知识点:把复杂概念换成自己的话(比如“逻辑或”翻译成“选第一个有用的”),比死记规则更易理解;
- 优先手动敲代码:JS 语法不复杂,像逻辑运算符、DOM 选择器这类高频内容,敲多了自然能记住,比复制粘贴高效;
- 记录“演示过程”:比如录制视频演示表单验证的编写步骤,复盘时能发现“哪里漏了验证条件”,进步更快。
2. 易混淆知识点补充
- 三元运算符 vs 逻辑运算符:三元运算符(
a ? b : c
)适合“二选一”的条件赋值,逻辑运算符适合“短路选值”(如a || b
); ==
vs===
:==
会自动类型转换(如0 == ''
为 true),===
严格比较(不转换类型,0 === ''
为 false),开发中优先用===
;- 元素选择器优先级:一次能找到元素用
getElementById
(如document.getElementById('btn')
),多级查找用querySelector
(如document.querySelector('.box #btn')
)。
3. 面试小贴士
- 遇到有歧义的题目,不用慌:只要逻辑正确,说明自己的理解即可(比如“三元运算符也叫三目运算符”,两种说法都对);
- 默写代码时,优先写核心逻辑:比如表单验证,先写“长度判断 + 阻止提交”,再补细节(如获取元素、提示框)。
这些案例和知识点覆盖了 JS 基础的核心场景,建议结合代码反复练习,尤其是逻辑运算符的“短路特性”和 DOM 事件绑定,能帮你在开发中写出更简洁、高效的代码。