JS的传统写法 vs 简写形式
一、条件判断与逻辑操作
-
三元运算符简化条件判断
// 传统写法 let result; if (someCondition) {result = 'yes'; } else {result = 'no'; }// 简写方式 const result = someCondition ? 'yes' : 'no';
-
短路求值
// 传统写法 if (condition) {doSomething(); }// 简写方式 condition && doSomething();
-
空值合并运算符
// 传统写法 const name = user.name !== null && user.name !== undefined ? user.name : 'default';// 简写方式 const name = user.name ?? 'default';
-
可选链操作符
// 传统写法 const street = user && user.address && user.address.street;// 简写方式 const street = user?.address?.street;
-
逻辑或和逻辑与赋值简写
// 传统写法 if (!value) value = defaultValue;// 简写方式 value ||= defaultValue; // 仅在 value 为假值时赋值// 类似逻辑 value &&= newValue; // 仅在 value 为真值时赋值
二、数组操作
-
数组去重
// 传统写法 function unique(arr) {return arr.filter((item, index) => arr.indexOf(item) === index); }// 简写方式 const unique = arr => [...new Set(arr)];
-
快速取整
// 传统写法 const floor = Math.floor(4.9);// 简写方式 const floor = ~~4.9;
-
数组展开(Spread Operator)
// 传统写法 const array1 = [1, 2, 3]; const array2 = [4, 5, 6]; const combined = array1.concat(array2);// 简写方式 const combined = [...array1, ...array2];
-
使用
reduce
进行累加操作// 传统写法 const numbers = [1, 2, 3, 4, 5]; let sum = 0; for (let i = 0; i < numbers.length; i++) {sum += numbers[i]; }// 简写方式 const sum = numbers.reduce((acc, num) => acc + num, 0);
-
使用
find
查找数组中的第一个匹配项// 传统写法 const users = [{ id: 1 }, { id: 2 }, { id: 3 }]; let foundUser = null; for (let i = 0; i < users.length; i++) {if (users[i].id === 2) {foundUser = users[i];break;} }// 简写方式 const foundUser = users.find(user => user.id === 2);
-
使用
map
创建新数组// 传统写法 const numbers = [1, 2, 3]; let doubledNumbers = []; for (let i = 0; i < numbers.length; i++) {doubledNumbers.push(numbers[i] * 2); }// 简写方式 const doubledNumbers = numbers.map(num => num * 2);
-
使用
filter
过滤数组元素// 传统写法 const numbers = [1, 2, 3, 4, 5]; let evenNumbers = []; for (let i = 0; i < numbers.length; i++) {if (numbers[i] % 2 === 0) {evenNumbers.push(numbers[i]);} }// 简写方式 const evenNumbers = numbers.filter(num => num % 2 === 0);
-
使用
every
检查所有元素是否满足条件// 传统写法 const numbers = [1, 2, 3, 4, 5]; let allEven = true; for (let i = 0; i < numbers.length; i++) {if (numbers[i] % 2 !== 0) {allEven = false;break;} }// 简写方式 const allEven = numbers.every(num => num % 2 === 0);
-
使用
some
检查是否有任意元素满足条件// 传统写法 const numbers = [1, 2, 3, 4, 5]; let hasEven = false; for (let i = 0; i < numbers.length; i++) {if (numbers[i] % 2 === 0) {hasEven = true;break;} }// 简写方式 const hasEven = numbers.some(num => num % 2 === 0);
-
数组扁平化
// 传统写法 const flattened = arr.reduce((acc, val) => acc.concat(val), []);// 简写方式 const flattened = arr.flat(); // 或指定深度:arr.flat(2)
-
快速生成连续数字数组
// 传统写法 const range = []; for (let i = 0; i < 5; i++) range.push(i);// 简写方式 const range = [...Array(5).keys()]; // [0, 1, 2, 3, 4]
-
使用
Boolean
过滤假值// 传统写法 const filtered = arr.filter(item => !!item);// 简写方式 const filtered = arr.filter(Boolean); // 过滤掉 null、undefined、0、'' 等
-
快速克隆数组
// 传统写法 const copyArr = arr.slice();// 简写方式 const copyArr = [...arr];
-
使用
Array.includes
替代多条件||
// 传统写法 if (value === 'a' || value === 'b' || value === 'c') {}// 简写方式 if (['a', 'b', 'c'].includes(value)) {}
-
使用
Array.at
访问数组末尾元素const arr = [1, 2, 3];// 传统写法 const last = arr[arr.length - 1]; // 3// 简写方式 const last = arr.at(-1); // 3 (也支持负数索引)
-
合并多个数组并去重
const mergedUnique = [...new Set([...arr1, ...arr2])];
-
获取数组最大/最小值
const max = Math.max(...arr); const min = Math.min(...arr);
-
使用
Array.from
快速生成序列// 生成 0-4 的数组 const arr = Array.from({ length: 5 }, (_, i) => i); // [0, 1, 2, 3, 4]
三、对象操作
-
合并对象
// 传统写法 const merged = Object.assign({}, obj1, obj2);// 简写方式 const merged = {...obj1, ...obj2};
-
对象属性简写
// 传统写法 const name = 'Alice'; const age = 25; const user = {name: name,age: age };// 简写方式 const user = { name, age }; // 当 key 和 value 名称一致时
-
动态对象属性
// 传统写法 const obj = {}; obj[dynamic + 'name'] = value;// 简写方式 const obj = {[`${dynamic}name`]: value };
-
快速克隆对象
// 传统写法 const copyObj = Object.assign({}, obj);// 简写方式 const copyObj = { ...obj };
-
深拷贝一个对象(非函数/循环引用)
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
-
使用
Object.entries
或Object.values
快速遍历对象const obj = { a: 1, b: 2 };// 遍历键值对 Object.entries(obj).forEach(([key, value]) => console.log(key, value));// 直接获取值 const values = Object.values(obj); // [1, 2]
-
判断是否为空对象
const isEmpty = obj => Object.keys(obj).length === 0;
四、字符串操作
-
字符串转数字
// 传统写法 const num = parseInt('456', 10); const floatNum = parseFloat('456.78');// 简写方式 const num = +'456'; // 转为整数或浮点数 const num2 = Number('456');
-
模板字符串
// 传统写法 const name = "John"; const greeting = "Hello, " + name + "!";// 简写方式 const greeting = `Hello, ${name}!`;
-
使用
String.repeat
快速重复字符串// 传统写法 let str = ''; for (let i = 0; i < 3; i++) str += 'ha';// 简写方式 const str = 'ha'.repeat(3); // 'hahaha'
-
使用
replaceAll
替换所有匹配字符串// 传统写法 const str = 'a-b-c'.replace(/-/g, '_'); // 'a_b_c'// 简写方式 const str = 'a-b-c'.replaceAll('-', '_'); // 'a_b_c'
五、函数与参数
-
默认参数值
// 传统写法 function greet(name) {name = name || 'Guest';console.log(`Hello ${name}`); }// 简写方式 const greet = (name = 'Guest') => console.log(`Hello ${name}`);
-
默认参数值与解构赋值结合
// 传统写法 function drawRectangle(width, height) {width = width || 50;height = height || 50;console.log(`Width: ${width}, Height: ${height}`); }// 简写方式 const drawRectangle = ({ width = 50, height = 50 } = {}) => {console.log(`Width: ${width}, Height: ${height}`); };
六、变量操作
-
解构赋值
// 传统写法 const first = arr[0]; const second = arr[1];// 简写方式 const [first, second] = arr;
-
交换变量值
// 传统写法 let a = 1, b = 2; let temp = a; a = b; b = temp;// 简写方式(使用解构) let a = 1, b = 2; [a, b] = [b, a]; // 一行交换两个变量
七、异步操作
-
使用
Promise.all
并行处理异步任务// 传统写法:依次等待 const res1 = await fetch(url1); const res2 = await fetch(url2);// 简写方式:并行执行 const [res1, res2] = await Promise.all([fetch(url1), fetch(url2)]);
八、类型转换
-
使用
!!
快速转换为布尔值// 传统写法 const isTruthy = Boolean(value);// 简写方式 const isTruthy = !!value; // 双感叹号强制转换
九、大数字处理
-
使用
BigInt
处理大数字// 传统写法(可能丢失精度) const bigNum = 9007199254740991;// 简写方式 const bigNum = 9007199254740991n; // 后缀加 'n'
十、日期/数字格式化
-
使用
Intl
简化日期/数字格式化// 格式化数字 const num = 123456.789; console.log(new Intl.NumberFormat('en-US').format(num)); // "123,456.789"// 格式化日期 const date = new Date(); console.log(new Intl.DateTimeFormat('zh-CN').format(date)); // "2023/7/20"
十一、DOM 操作
-
将类数组转换为数组(如 arguments 或 NodeList)
const arr = Array.from(document.querySelectorAll('div'));
相关文章:
JS的传统写法 vs 简写形式
一、条件判断与逻辑操作 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result yes; } else {result no; }// 简写方式 const result someCondition ? yes : no;短路求值 // 传统写法 if (condition) {doSomething(); }// 简写方式 condition &…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000
目录 🌐 访问Web服务 💻 分析源代码 ⬇️ 下载图片并保留元数据 🔍 提取元数据(重点) 👤 生成用户名列表 🛠️ 技术原理 图片元数据(EXIF 数据) Username-Anarch…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解
阅读时长 | 8分钟 适用读者 | 需要跨境调用OpenAI等AI服务的开发者/企业 一、问题背景:为什么需要代理? 最近在技术社区看到这样的求助: "公司服务器在国内,但业务需要调用OpenAI接口,直接访…...

【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...

React与原生事件:核心差异与性能对比解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
Go 并发编程基础:select 多路复用
select 是 Go 并发编程中非常强大的语法结构,它允许程序同时等待多个通道操作的完成,从而实现多路复用机制,是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句,但它用于监听多个通…...

暴雨新专利解决服务器噪音与性能悖论
6月1日,我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施,为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系,要求从设计隔声结构到运维定期监测实现闭环管控,加速…...

Go 语言中的内置运算符
1. 算术运算符 注意: (自增)和--(自减)在 Go 语言中是单独的语句,并不是运算符。 package mainimport "fmt"func main() {fmt.Println("103", 103) // 13fmt.Println("10-3…...
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南 在金融行业安全审计中,未启用HTTPS的Web应用被列为高危漏洞。通过正确配置HTTPS,可将中间人攻击风险降低98%——本文将全面解析Spring Boot中HTTPS的实现方案与实战避坑指南。 一、HTTPS 核心原理与…...
项目研究:使用 LangGraph 构建智能客服代理
概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具,可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪,并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中,…...

JS面试常见问题——数据类型篇
这几周在进行系统的复习,这一篇来说一下自己复习的JS数据结构的常见面试题中比较重要的一部分 文章目录 一、JavaScript有哪些数据类型二、数据类型检测的方法1. typeof2. instanceof3. constructor4. Object.prototype.toString.call()5. type null会被判断为Obje…...
创客匠人:如何通过创始人IP打造实现知识变现与IP变现的长效增长?
在流量红利逐渐消退的当下,创始人IP的价值愈发凸显。它不仅能够帮助中小企业及个人创业者突破竞争壁垒,还能成为企业品牌影响力的核心资产。然而,市场上IP孵化机构鱼龙混杂,如何选择一家真正具备长期价值的合作伙伴?创…...

【靶场】XXE-Lab xxe漏洞
前言 学习xxe漏洞,搭了个XXE-Lab的靶场 一、搭建靶场 现在需要登录,不知道用户名密码,先随便试试抓包 二、判断是否存在xxe漏洞 1.首先登录抓包 看到xml数据解析,由此判断和xxe漏洞有关,但还不确定xxe漏洞是否存在。 2.尝试xxe 漏洞 判断是否存在xxe漏洞 A.send to …...

开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 👉 欢迎关注,了解更多精彩内容 ultralytics-models-sam 1.sam-modules-tiny_encoder.py2.数据处理流程3.代码架构图(类层次与依赖)blocks.py: 定义模型中的各种模块结构 ,如卷积块、残差块等基础构建…...

Python[数据结构及算法 --- 栈]
一.栈的概念 在 Python 中,栈(Stack)是一种 “ 后进先出(LIFO)”的数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。 二.栈的抽象数据类型 1.抽象数…...

Unity VR/MR开发-开发环境准备
视频讲解链接: 【XR马斯维】UnityVR/MR开发环境准备【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)
深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前,我们得首先弄明白,什么是图像分割? 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程,即像素级别的…...
Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法
Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级
概述 在历经半个月的间歇性开发后,RagflowPlus再次迎来一轮升级,正式发布v0.4.0。 开源地址:https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码: git clone https://github.com/zstar1003/ragflow-plus.…...

智能照明系统:具备认知能力的“光神经网络”
智能照明系统是物联网技术与传统照明深度融合的产物,其本质是通过感知环境、解析需求、自主决策的闭环控制,重构光与人、空间、环境的关系。这一系统由智能光源、多维传感器、边缘计算单元及云端管理平台构成,形成具备认知能力的“光神经网络…...
ubuntu系统 | docker+dify+ollama+deepseek搭建本地应用
1、docker 介绍与安装 docker安装:1、Ubuntu系统安装docker_ubuntu docker run-CSDN博客 docker介绍及镜像源配置:2、ubuntu系统docker介绍及镜像源和仓库配置-CSDN博客 docker常用命令:3、ubuntu系统docker常用命令-CSDN博客 docker compose安装:4、docker compose-CS…...
Docker 镜像上传到 AWS ECR:从构建到推送的全流程
一、在 EC2 实例中安装 Docker(适用于 Amazon Linux 2) 步骤 1:连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2:安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…...

SpringSecurity+vue通用权限系统
SpringSecurityvue通用权限系统 采用主流的技术栈实现,Mysql数据库,SpringBoot2Mybatis Plus后端,redis缓存,安全框架 SpringSecurity ,Vue3.2Element Plus实现后台管理。基于JWT技术实现前后端分离。项目开发同时采 …...
如何在Spring Boot中使用注解动态切换实现
还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...

短视频时长预估算法调研
weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp(1−p)oddsTp(Tpodds…...
基于Java的离散数学题库系统设计与实现:附完整源码与论文
JAVASQL离散数学题库管理系统 一、系统概述 本系统采用Java Swing开发桌面应用,结合SQL Server数据库实现离散数学题库的高效管理。系统支持题型分类(选择题、填空题、判断题等)、难度分级、知识点关联,并提供智能组卷、在线测试…...
板凳-------Mysql cookbook学习 (十--2)
5.12 模式匹配中的大小写问题 mysql> use cookbook Database changed mysql> select a like A, a regexp A; ------------------------------ | a like A | a regexp A | ------------------------------ | 1 | 1 | --------------------------…...

设计模式域——软件设计模式全集
摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案,旨在解决常见的软件设计问题。它们是软件开发经验的总结,能够帮助开发人员在设计阶段快速找到合适的解决方案,提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…...

FTPS、HTTPS、SMTPS以及WebSockets over TLS的概念及其应用场景
一、什么是FTPS? FTPS,英文全称File Transfer Protocol with support for Transport Layer Security (SSL/TLS),安全文件传输协议,是一种对常用的文件传输协议(FTP)添加传输层安全(TLS)和安全套接层(SSL)加密协议支持的扩展协议。…...