JavaScript运算符与逻辑中断

目录

JavaScript运算符

一、运算符分类与优先级

1. 运算符优先级表

二、算术运算符

1. 基础算术运算

2. 自增/自减运算符

三、比较运算符

1. 基础比较

2. 相等性判断

四、逻辑运算符

1. 基础逻辑运算

2. 短路求值(Short-Circuiting)

3. 逻辑赋值运算符(ES2021+)

五、位运算符

1. 基础位运算

六、其他运算符

1. 三元条件运算符

2. 空值合并运算符(??)

3. 可选链运算符(?.)

4. 展开运算符(...)

七、常见陷阱与最佳实践

1. == 的隐式类型转换

2. 浮点数精度问题

3. 短路求值的灵活应用

JavaScript逻辑中断

一、逻辑与 && 的短路

1. 假值列表

2. 示例

二、逻辑或 || 的短路

三、空值合并 ?? 的精准短路

四、实际应用场景

1. 条件执行函数

2. 链式属性访问

3. 组合使用

五、注意事项

六、总结


JavaScript运算符


一、运算符分类与优先级

1. 运算符优先级表

优先级从高到低排序(部分常见运算符):

优先级运算符说明
1()括号(强制优先级)
2++--!~typeof自增、自减、逻辑非、按位非等
3**指数(ES6+)
4*/%乘、除、取模
5+-加、减
6<<>>>>>位左移、右移、无符号右移
7<<=>>=比较运算符
8==!====!==相等性判断
9&按位与
10^按位异或
11|按位或
12&&逻辑与
13||逻辑或
14??空值合并(ES2020+)
15?:三元条件运算符
16=+=-=**= 等赋值运算符
17,逗号运算符(返回最后一个表达式)

二、算术运算符

1. 基础算术运算

运算符名称示例说明
+加法3 + 2 → 5数值相加或字符串拼接
-减法5 - 3 → 2
*乘法2 * 3 → 6
/除法6 / 2 → 3结果为浮点数(如 5 / 2 → 2.5
%取模7 % 3 → 1返回除法余数
**指数2 ** 3 → 8ES6+ 新增,等价于 Math.pow()

2. 自增/自减运算符

运算符示例说明
++let a = 1; a++后置自增:先返回值,再自增 → a 变为 2
--let b = 2; --b前置自减:先自减,再返回值 → b 变为 1
let i = 1
console.log(i++ + ++i + i)  //7

注意:避免在复杂表达式中混用前置和后置形式,易引发歧义。


三、比较运算符

1. 基础比较

运算符名称示例说明
>大于5 > 3 → true
<小于2 < 1 → false
>=大于等于5 >= 5 → true
<=小于等于3 <= 2 → false

2. 相等性判断

运算符名称示例说明
==宽松相等"5" == 5 → true类型不同时尝试转换再比较
===严格相等"5" === 5 → false值和类型均相同才返回 true
!=宽松不等"5" != 5 → false等效于 !(a == b)
!==严格不等"5" !== 5 → true等效于 !(a === b)

最佳实践:始终优先使用 === 和 !==,避免隐式类型转换导致的意外结果。


四、逻辑运算符

1. 基础逻辑运算

运算符名称示例说明
&&逻辑与true && false → false两边为 true 才返回 true
||逻辑或true || false → true任一边为 true 即返回 true
!逻辑非!true → false取反

2. 短路求值(Short-Circuiting)

  • && 短路:若左侧为假,直接返回左侧值,否则返回右侧值。

    console.log(0 && "Hello"); // 0(左侧为假,直接返回)
    console.log(2 && "Hello"); // "Hello"
  • || 短路:若左侧为真,直接返回左侧值,否则返回右侧值。

    console.log("" || "Default"); // "Default"
    console.log("Hello" || "Default"); // "Hello"

3. 逻辑赋值运算符(ES2021+)

运算符示例等效于
&&=a &&= ba = a && b
||=a ||= ba = a || b
??=a ??= ba = a ?? b(空值合并赋值)

五、位运算符

1. 基础位运算

运算符名称示例说明
&按位与5 & 3 → 1二进制位均为 1 时结果为 1
|按位或5 | 3 → 7二进制位任一为 1 则结果为 1
^按位异或5 ^ 3 → 6二进制位不同则结果为 1
~按位非~5 → -6取反码(二进制位取反)
<<左移5 << 1 → 10左移指定位数,右侧补 0
>>右移(有符号)-5 >> 1 → -3保留符号位,右侧补 0
>>>右移(无符号)-5 >>> 1 → 2147483645忽略符号位,左侧补 0

六、其他运算符

1. 三元条件运算符

  • 语法condition ? expr1 : expr2

    const status = age >= 18 ? "Adult" : "Minor";

2. 空值合并运算符(??)

  • 作用:左侧为 null 或 undefined 时返回右侧值,否则返回左侧值。

    const value = input ?? "default"; 
    // 等效于 input !== null && input !== undefined ? input : "default"

3. 可选链运算符(?.)

  • 作用:安全访问嵌套对象属性,避免因中间属性不存在而报错。

    const city = user?.address?.city; 
    // 若 user 或 address 为 null/undefined,返回 undefined

4. 展开运算符(...)

  • 数组展开

    const arr1 = [1, 2];
    const arr2 = [...arr1, 3]; // [1, 2, 3]
  • 对象展开(ES2018+):

    const obj1 = { x: 1 };
    const obj2 = { ...obj1, y: 2 }; // { x: 1, y: 2 }

七、常见陷阱与最佳实践

1. == 的隐式类型转换

console.log([] == ![]); 
// true([] 转为 0,![] 转为 false → 0)

解决方案:始终使用 === 和 !==

2. 浮点数精度问题

console.log(0.1 + 0.2 === 0.3); 
// false(实际结果为 0.30000000000000004)

解决方案:使用 toFixed() 或第三方库(如 decimal.js)处理精度。

3. 短路求值的灵活应用

// 条件执行函数
function init() { console.log("Initialized"); }
let isInit = false;
isInit || init(); // 若未初始化,则调用 init()

   

JavaScript逻辑中断


一、逻辑与 && 的短路

规则:当左侧表达式为 假值(falsy) 时,直接返回左侧值,不再执行右侧。

1. 假值列表

  • false

  • 0-00n(BigInt 零)

  • ""(空字符串)

  • null

  • undefined

  • NaN

2. 示例

// 示例 1:短路发生
console.log(0 && alert("不会执行")); // 输出 0(左侧为假,直接返回 0)// 示例 2:未短路
console.log(1 && "Hello"); // 输出 "Hello"(左侧为真,返回右侧值)// 实际应用:条件渲染(React/Vue)
isLoggedIn && <Dashboard />;

二、逻辑或 || 的短路

规则:当左侧表达式为 真值(truthy) 时,直接返回左侧值,不再执行右侧。

示例

// 示例 1:短路发生
console.log("Hello" || alert("不会执行")); // 输出 "Hello"// 示例 2:未短路
console.log(0 || "默认值"); // 输出 "默认值"// 实际应用:设置默认值(旧版写法)
const port = config.port || 3000; // 注意:0 会被覆盖!

三、空值合并 ?? 的精准短路

规则:仅当左侧为 null 或 undefined 时,才返回右侧值。

示例

// 示例 1:不短路
console.log(0 ?? "默认值"); // 输出 0(保留 0)// 示例 2:短路发生
console.log(null ?? "备用值"); // 输出 "备用值"// 实际应用:精准默认值(现代推荐)
const port = config.port ?? 3000; // 允许 0 或 ""

四、实际应用场景

1. 条件执行函数

// 仅当用户存在时调用函数
user.isAdmin && showAdminPanel();// 替代写法
if (user.isAdmin) showAdminPanel();

2. 链式属性访问

// 安全访问嵌套属性(旧版)
const city = user && user.address && user.address.city;// 现代替代方案:可选链操作符 `?.`
const city = user?.address?.city;

3. 组合使用

// 复杂条件判断
const result = (condition1 && value1) || (condition2 && value2) ?? fallback;

五、注意事项

  1. 优先级问题
    逻辑运算符优先级:&& > || > ??,建议用 () 明确优先级:

    console.log(true || false && false); 
    // 输出 true(等价于 true || (false && false))
  2. 副作用控制
    短路特性可能导致右侧代码未执行:

    let x = 0;
    false && x++; // x 仍为 0
  3. 避免过度使用
    虽然简洁,但过度使用会降低可读性:

    // ❌ 难以理解
    isValid && (isAdmin || isModerator) && submitForm();// ✅ 更清晰
    if (isValid && (isAdmin || isModerator)) {submitForm();
    }

六、总结

  • &&:用于 必须满足前置条件 的场景(如权限检查)。

  • ||:适合旧版默认值,但会覆盖假值(0、"")。

  • ??:现代默认值方案,精准处理 null/undefined


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity顶点优化:UV Splits与Smoothing Splits消除技巧

一、顶点分裂问题概述 1. 什么是顶点分裂 顶点分裂(Vertex Splits)是3D渲染中常见的性能问题&#xff0c;当模型需要为同一顶点位置存储不同属性值时&#xff0c;会创建多个顶点副本。主要分为两类&#xff1a; UV Splits&#xff1a;由UV不连续引起 Smoothing Splits&#…

OpenCV、YOLO与大模型的区别与关系

OpenCV、YOLO 和大模型的区别与关系 1. OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 定位&#xff1a;开源的计算机视觉基础库。功能&#xff1a;提供传统的图像处理算法&#xff08;如图像滤波、边缘检测、特征提取&#xff09;和基础工具&#xff…

CentOS 7 挂载与卸载文件系统笔记

挂载文件系统 挂载的基本概念 挂载是将存储设备&#xff08;如硬盘分区、U 盘、光盘等&#xff09;连接到 Linux 文件系统的特定目录&#xff08;挂载点&#xff09;&#xff0c;使得系统能够访问存储设备上的数据。 查看已挂载的文件系统 命令&#xff1a;mount 或 df -h mo…

Git项目要改变仓库地址

去掉原仓库git地址和清除原项目的git版本信息的方法 场景需求: 如果是使用自己以前的项目、或者拉取了别人的项目到自己本地。想在此基础上重新开发、初始化项目的话,最好先删掉以前的git信息。 因为如果不删除的话: 1.看着不舒服。根本不需要保留原来的版本信息。 2.我们…

NC,GFS、ICON 数据气象信息可视化--降雨量的实现

随着气象数据的快速发展和应用&#xff0c;气象信息的可视化成为了一项不可或缺的技术手段。它不仅能帮助气象专家快速解读数据&#xff0c;还能为公众提供直观的天气预报信息。今天&#xff0c;我们将从降雨量的可视化出发&#xff0c;带大家一起了解如何实现气象数据的可视化…

质量工程师的2025:从“找bug“到“造质量“的职业进化

想象一下&#xff0c;2025年的某天&#xff1a;阅读原文 早晨&#xff0c;AI测试助手已经自动运行了夜间回归测试&#xff0c;并将可疑问题标记出来 你喝着咖啡&#xff0c;通过质量数据看板分析系统健康度 下午的会议上&#xff0c;你正用业务语言向产品经理解释&#xff1a…

Python实现将字典中键相同的值合并

在Python字典中键是唯一的&#xff0c;但是业务需求是将不同的数据传递到不同的接口&#xff0c;接口列表中存在3个相同的接口&#xff0c;需要将3个接口对应的数据合并一同发送&#xff0c;逻辑实现如下 merge_dict {}for file in files:path os.path.join(folder_path, fil…

数据大屏点亮工业互联网的智慧之眼

在当今数字化飞速发展的时代&#xff0c;数据已成为企业决策的核心依据&#xff0c;而数据大屏作为数据可视化的重要工具&#xff0c;正逐渐成为工业互联网领域不可或缺的一部分。通过直观、动态的可视化展示&#xff0c;数据大屏能够将复杂的数据转化为易于理解的图表和图形&a…

洛谷题单1-B2005 字符三角形-python-流程图重构

题目描述 给定一个字符&#xff0c;用它构造一个底边长 5 5 5 个字符&#xff0c;高 3 3 3 个字符的等腰字符三角形。 输入格式 输入只有一行&#xff0c;包含一个字符。 输出格式 该字符构成的等腰三角形&#xff0c;底边长 5 5 5 个字符&#xff0c;高 3 3 3 个字符…

UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器&#xff0c;通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片&#xff0c;改名为五weaponIcon&#xff0c;勾选SizeToContent,锚点放在右下角&#xff0c;对齐改…

SpringMVC 请求与响应处理详解

引言 在 Java Web 开发中&#xff0c;SpringMVC 作为 Spring 框架的重要模块&#xff0c;提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式&#xff0c;结合实际案例&#xff0c;帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…

从零开始的 Kafka 学习(四)| 生产消息

1. 生产消息 1.1 生产消息的基本步骤 &#xff08;一&#xff09;创建Map类型的配置对象&#xff0c;根据场景增加相应的配置属性&#xff1a; 参数名参数作用类型默认值推荐值bootstrap.servers集群地址&#xff0c;格式为&#xff1a;brokerIP1:端口号,brokerIP2:端口号必…

k8s1.22 kubeadm 部署

k8s1.22 kubeadm 部署 1、更改hostname hostnamectl set-hostname master-001 && su root hostnamectl set-hostname node-001 && su root hostnamectl set-hostname node-002 && su root配置hsots cat >> /etc/hosts <<EOF 192.168.20.…

新手村:逻辑回归-理解04:熵是什么?

新手村&#xff1a;逻辑回归04&#xff1a;熵是什么? 熵是什么? 前置条件 在开始学习逻辑回归中的熵理论之前&#xff0c;需要掌握以下基础知识&#xff1a; 概率论与统计学&#xff1a; 概率分布&#xff08;如伯努利分布、正态分布&#xff09;。条件概率和贝叶斯定理。期…

STM32通用定时器结构框图

STM32单片机快速入门 通用定时器框图 TIM9和TIM12 通用定时器框图 TIM9和TIM12 &#xff08;二&#xff09; 通用定时器框图

3.28-2 jmeter读取mysql

jmeter操作mysql 1.下载数据驱动&#xff0c;安装数据驱动 &#xff08;1&#xff09;存放四个路径 a.jre下的lib C:\Program Files\Java\jre1.8.0_60\lib &#xff08;2&#xff09;存放在jre 下的lib 中的ext 路径&#xff1a; C:\Program Files\Java\jre1.8.0_60\lib\…

TDengine 中的保留关键词

简介 本节很重要&#xff0c;请大家收藏&#xff0c;避免在编写程序的时候踩坑。因为关键字是被 TDengine 系统使用的&#xff0c;如果你在 SQL 中使用了保留关键词&#xff0c;并且没有被反引号包括时&#xff0c;会报语法错误&#xff0c;当你不知道这个是保留关键词时&…

美摄科技开启智能汽车车内互动及娱乐解决方案2.0

在科技飞速发展的今天&#xff0c;汽车已不再仅仅是简单的代步工具&#xff0c;而是逐渐演变为集出行、娱乐、社交于一体的智能移动空间。美摄科技&#xff0c;作为前沿视觉技术与人工智能应用的领航者&#xff0c;凭借其卓越的技术实力和创新精神&#xff0c;携手汽车行业&…

Postman CORS 测试完全指南:轻松模拟跨域请求,排查 CORS 相关问题

在使用 Postman 进行 API 测试时&#xff0c;通常不会遇到跨域问题&#xff0c;因为 Postman 是一个独立的客户端应用程序&#xff0c;不同于在浏览器中运行的 JavaScript 代码&#xff0c;它没有同源策略&#xff08;SOP&#xff09;的限制。跨域资源共享&#xff08;CORS&…

基于SpringBoot和Vue的SQL TO API平台的设计与实现

文章目录 前言一、系统功能模块二、数据库设计1. 实体属性图1. 实体属性图1.1 职员表1.2 数据源配置表1.3 接口配置表1.4 请求记录表 2. E-R图 三、系统实现1. 登录页面2. 职员管理页面1.1 创建用户1.2 编辑用户 2. 数据源管理2.1 创建数据源2.2 编辑数据源 3. 接口管理3.1 创建…