当前位置: 首页 > news >正文

JavaScript 模板字符串:更优雅的字符串处理方式

什么是模板字符串?

模板字符串(Template Literals)是 ES6(ES2015)引入的一种新的字符串表示方式,它提供了更强大、更灵活的字符串拼接功能。与传统的字符串使用单引号(')或双引号(")不同,模板字符串使用反引号(`)来包裹内容。

模板字符串的主要特点包括:

  • 支持多行字符串
  • 可以嵌入表达式
  • 支持标签模板(Tagged Templates)
  • 保留换行和缩进格式

基本语法

多行字符串

const message = `这是一个
多行
字符串`;console.log(message);
/* 输出:
这是一个
多行
字符串
*/

表达式嵌入

使用 ${expression} 语法可以在模板字符串中嵌入 JavaScript 表达式:

const name = 'Alice';
const age = 30;const greeting = `你好,我是 ${name},今年 ${age} 岁。`;
console.log(greeting); // 你好,我是 Alice,今年 30 岁。

表达式中可以使用任何 JavaScript 代码

const a = 10;
const b = 20;const result = `计算结果: ${a + b},${a * b}`;
console.log(result); // 计算结果: 30,200

标签模板(Tagged Templates)

标签模板是模板字符串的高级用法,它允许你使用函数来处理模板字符串。标签函数的第一个参数是一个包含字符串字面量的数组,后续参数是每个表达式的值。

function tag(strings, ...values) {console.log(strings);   // ['Hello ', ', your score is ', '.']console.log(values);    // ['Alice', 95]// 自定义处理return strings.reduce((result, str, i) => {return result + str + (values[i] !== undefined ? values[i] : '');}, '');
}const name = 'Alice';
const score = 95;const output = tag`Hello ${name}, your score is ${score}.`;
console.log(output); // Hello Alice, your score is 95.

实际应用场景

动态生成 HTML 片段

const users = [{ name: 'Alice', age: 25 },{ name: 'Bob', age: 30 },{ name: 'Charlie', age: 35 }
];const html = `
<ul>${users.map(user => `<li>${user.name} (${user.age})</li>`).join('')}
</ul>
`;console.log(html);
/* 输出:
<ul><li>Alice (25)</li><li>Bob (30)</li><li>Charlie (35)</li>
</ul>
*/

构建 URL

const baseUrl = 'https://api.example.com';
const endpoint = 'users';
const id = 123;const url = `${baseUrl}/${endpoint}/${id}`;
console.log(url); // https://api.example.com/users/123

条件表达式

const isLoggedIn = true;
const welcome = `欢迎${isLoggedIn ? '回来' : '注册'}`;
console.log(welcome); // 欢迎回来

多行 SQL 查询

const table = 'users';
const limit = 10;const query = `
SELECT * 
FROM ${table} 
WHERE age > 18 
LIMIT ${limit}
`;console.log(query);
/* 输出:
SELECT * 
FROM users 
WHERE age > 18 
LIMIT 10
*/

模板字符串与传统字符串的对比

传统字符串拼接

const firstName = 'John';
const lastName = 'Doe';
const fullName = 'Hello, ' + firstName + ' ' + lastName + '!';
console.log(fullName); // Hello, John Doe!

模板字符串

const fullName = `Hello, ${firstName} ${lastName}!`;
console.log(fullName); // Hello, John Doe!

注意事项

反引号中的转义

如果你需要在模板字符串中使用反引号,需要使用转义字符 \

const message = `这个字符串包含一个反引号 (\`)。`;
console.log(message); // 这个字符串包含一个反引号 (`)。

标签函数的参数处理

标签函数的第一个参数是字符串数组,后续参数是表达式的值。注意处理边界情况:

function tag(strings, ...values) {// 确保正确处理所有字符串和值return strings.reduce((result, str, i) => {return result + str + (values[i] !== undefined ? values[i] : '');}, '');
}

总结

模板字符串是 JavaScript 中一项非常实用的特性,它让字符串处理变得更加简洁、直观和灵活。通过支持多行字符串、表达式嵌入和标签模板,模板字符串为我们提供了强大的工具来构建复杂的字符串内容。

无论是动态生成 HTML、构建 URL、编写 SQL 查询,还是创建复杂的格式化字符串,模板字符串都能让你的代码更加优雅和易读。掌握这一特性,将使你编写的 JavaScript 代码更加现代化和高效。

希望这篇文章能帮助你更好地理解和应用 JavaScript 模板字符串!

相关文章:

JavaScript 模板字符串:更优雅的字符串处理方式

什么是模板字符串&#xff1f; 模板字符串&#xff08;Template Literals&#xff09;是 ES6&#xff08;ES2015&#xff09;引入的一种新的字符串表示方式&#xff0c;它提供了更强大、更灵活的字符串拼接功能。与传统的字符串使用单引号&#xff08;&#xff09;或双引号&am…...

DeepSeek智能时空数据分析(五):基于区域人口数量绘制地图散点-大模型搜集数据NL2SQL加工数据

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…...

PostSwigger 的 CSRF 漏洞总结

本文所提供的关于 web 安全的相关信息、技术讲解及案例分析等内容&#xff0c;仅用于知识分享与学术交流目的&#xff0c;旨在提升读者对 web 安全领域的认知与理解。以下仅仅是作者对 PostSwigger Web 安全的知识整理和分享&#xff0c;严禁任何非法犯罪活动。 限制 CSRF 的三…...

vue项目页面适配

vue项目页面适配 目的&#xff1a;结合动态设置根字体大小的脚本&#xff08;如通过 JavaScript 监听屏幕尺寸变化&#xff09;&#xff0c;实现页面元素在不同设备上的自适应缩放 1、安装postcss-pxtorem ### 若项目未集成 postcss&#xff0c;需同步安装&#xff1a; npm …...

AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok的客户端开源应用程序,集成了 Monaco 编辑器。

一、软件介绍 文末提供程序和源码下载学习 AI-Browser适用于 ChatGPT、Gemini、Claude、DeepSeek、Grok、Felo、Cody、JENOVA、Phind、Perplexity、Genspark 和 Google AI Studio 的客户端应用程序&#xff0c;集成了 Monaco 编辑器。使用 Electron 构建的强大桌面应用程序&a…...

Flutter Dart新特性NulI safety late 关键字、空类型声明符?、非空断言!、required 关键字

目录 late 关键字 required关键词: 常用的Model对象使用required Null safety翻译成中文的意思是空安全 null safety 可以帮助开发者避免一些日常开发中很难被发现的错误&#xff0c;并且额外的好处是可以改善性能后的版本都要求使用nul1 safety。Flutter2.2.0(2021年5月19日…...

CF2096G Wonderful Guessing Game 构造

题解 首先考虑没有 ? ? ? 回答的时候&#xff0c;答案是多少。 猜猜需要多少个询问。 ⌈ log ⁡ 2 n ⌉ ? ⌈ log ⁡ 3 n ⌉ ? \lceil \log_2n\rceil ? \lceil \log_3n\rceil ? ⌈log2​n⌉?⌈log3​n⌉? 可以构造一个表&#xff0c;行表示不同的询问&#xff0c;…...

制作一款打飞机游戏26:精灵编辑器

虽然我们基本上已经重建了Axel编辑器&#xff0c;但我不想直接使用它。我想创建一个真正适合我们当前目的的编辑器&#xff0c;那就是编辑精灵&#xff08;sprites&#xff09;。这将是今天的一个大目标——创建一个基于模板的编辑器&#xff0c;用它作为我们实际编辑器的起点。…...

深入Java JVM常见问题及解决方案

1. 简介 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心环境&#xff0c;但其复杂性可能导致内存泄漏、性能下降、类加载失败等问题。本文从内存管理、垃圾回收、性能调优、异常处理四大方向&#xff0c;结合工具使用与实战案例&#xff0c;详解JVM问题的排查与解…...

【MySQL】Java代码操作MySQL数据库 —— JDBC编程

目录 1. Java的JDBC编程 1.1 Java的数据库编程&#xff1a;JDBC 1.2 JDBC工作原理 1.3 如何在项目中导入数据库驱动包 如何下载数据库驱动包 jar包如何引入项目中 2. 编写JDBC代码 1. 创建并初始化一个数据源(DataSource) 2. 和数据库服务器建立连接 3. 构造 SQL 语句…...

Marmoset Toolbag 5.0 中文汉化版 八猴软件中文汉化版 免费下载

八猴安装包下载链接 https://pan.baidu.com/s/1Mgy3Mrlrb3Tvtc8w7Zn1nA?pwd6666 提取码&#xff1a;6666 Marmoset Toolbag是由Monkey公司推出一款专业动画渲染软件&#xff0c;也叫做八猴渲染器。该软件主要特征功能是可以进行实时模型观察、材质编辑和动画预览&#xff0c;…...

Java编程中常见错误的总结和解决方法

1. 找不到文件 问题描述&#xff1a;尝试编译一个名为ChangeCha.java的文件&#xff0c;但编译器找不到这个文件。错误信息&#xff1a;javac: 找不到文件: ChangeCha.java解决方法&#xff1a;检查文件名是否正确&#xff0c;文件是否存在于当前目录&#xff0c;或者路径是否…...

【GESP】C++三级练习 luogu-B2114 配对碱基链

GESP三级练习&#xff0c;字符串练习&#xff08;C三级大纲中6号知识点&#xff0c;字符串&#xff09;&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-3-luogu-b2114/ 【GESP】C三级练习 luogu-B2114 配对碱基链 | OneCoderGESP三级练…...

C++类设计新思路:封装结构体成员变量

C++类设计新思路:封装结构体成员变量 引言 在C++编程里,类是封装数据和行为的重要手段。常规的类设计直接把成员变量定义在类中,再通过成员函数访问和修改这些变量。不过,有时候我们可以采用不同的设计思路,例如将成员变量封装到结构体里,这样可能会带来一些好处。本文…...

图像预处理-形态学变换

针对二值化图像&#xff0c;其有两个输入&#xff0c;一个输出&#xff1a;输入为原图像、核&#xff08;结构化元素&#xff09;&#xff0c;输出为形态学变换后的图像。基本操作有腐蚀和膨胀。 一.核 联想到之前的卷积核&#xff0c;也是一种核。 此时的核就跟卷积核不太一…...

关于百度模型迭代个人见解:技术竞速下的应用价值守恒定律

就在前天&#xff0c;在 2025 年 4 月 25 日的百度 Create 开发者大会上&#xff0c;文心大模型 4.5 Turbo 与 X1 Turbo 的发布再次将 AI 行业带入 "涡轮加速" 时代。这两款模型不仅在多模态理解、逻辑推理等核心指标上实现突破&#xff0c;更以80% 的价格降幅重塑行…...

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 基础概念

从基础到实战的量化交易全流程学习&#xff1a;1.3 数学与统计学基础——概率与统计基础 | 基础概念 第一部分&#xff1a;概率与统计基础 第1节&#xff1a;基础概念&#xff1a;随机变量、概率分布、大数定律与中心极限定理 一、随机变量与概率分布&#xff1a;用数学描述市场…...

混沌工程领域常用工具的对比分析

以下是混沌工程领域常用工具的对比分析,涵盖主流工具的核心功能、优势、适用场景及局限性,帮助技术团队根据自身需求选择合适的工具: 一、故障注入工具对比 工具核心特点优势适用场景局限性生态集成开源/付费Chaos MonkeyNetflix 开源,随机终止生产环境实例,模拟硬件/进程…...

LINUX的使用(2)- 安装软件

0.防火墙相关 启动防火墙&#xff1a; sudo systemctl start firewalld #查看防火墙列表 firewall-cmd --list-ports 设置防火墙开机自启&#xff1a; sudo systemctl enable firewalld 检查防火墙状态&#xff1a; sudo firewall-cmd --state 允许某个端口&#xff08;如端…...

一主多从+自组网络,无线模拟量信号传输专治布线PTSD

无线模拟量信号传输模块通过无线方式实现模拟量信号的传输&#xff0c;采集工业现场标准4~20mA电流信号&#xff0c;并将其转换为无线信号进行传输。 以下是关于无线模拟量信号传输模块实现无线模拟量信号传输的详细介绍&#xff1a; 一、模块原理 无线模拟量信号传输模块的…...

IDEA中使用Git

Git工作流程 创建远程仓库 现在我们已经在本地创建了一个Git仓库&#xff0c;但是这只能满足我们单人开发&#xff0c;如果想要团队协作&#xff0c;还需要一个远程仓库 目前比较流行的远程仓库&#xff0c;有下面这两个&#xff1a; github&#xff1a;https://github.com …...

Go RPC 服务方法签名的要求

在 Go 中&#xff0c;RPC 方法的签名有严格的要求&#xff0c;主要是为了保证方法的调用能够通过网络正确地传输和解析。具体要求如下&#xff1a; 1. 方法必须是导出的 RPC 服务的方法必须是导出的&#xff08;即首字母大写&#xff09;。这是因为 Go 的反射机制要求服务方法…...

Ant(Ubuntu 18.04.6 LTS)安装笔记

一、前言 本文与【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】同批次&#xff1a;先搭建数据库&#xff0c;再安装JDK&#xff0c;后面肯定就是部署Web应用。其中Web应用的部署使用 Ant 方式&#xff0c;善始善终&#xff0c;特以笔记。 二、准备 &#xf…...

相机DreamCamera2录像模式适配尺寸

在开发中遇到 一个问题&#xff0c;相机切换视频模式时&#xff0c;预览时&#xff0c;界面不能充满屏幕两侧有黑边&#xff0c;客户要求修改&#xff0c;在此记录 一问题现象&#xff1a; 系统相机在视频模式下预览时如下现象如图1&#xff0c;期望现象如图2: 图1 …...

Animate 中HTMLCanvas 画布下实现拖拽、释放、吸附的拼图游戏

1.舞台上物体拖拽 2.松手以后&#xff0c;检查是否移动到范围内&#xff0c;是则自动吸附 3.播放音效 4.变量1&#xff0c;显示在舞台的动态文本中 1.实现拖拽 下面代码实现拖拽和释放 地图模块 //记录原始位置 var OriXthis.my_mc.x; var OriYthis.my_mc.y;this.my_mc.on(&q…...

第十一章-PHP表单传值

第十一章-PHP表单传值 一&#xff0c;核心概念 1. 表单的基本结构&#xff08;HTML&#xff09; 通过HTML的<form>标签定义表单&#xff0c;关键属性包括&#xff1a; action: 指定处理表单数据的PHP脚本路径&#xff08;如action"process.php"&#xff09…...

互联网大厂Java求职面试:从Java核心到微服务的深度探索

场景引入: 在一个阳光明媚的早上,谢飞机满怀信心地走进了一家知名互联网大厂的面试房间。面试官坐在桌子的另一端,手中拿着一份简历,面带微笑地开始了今天的面试。 第一轮提问:核心语言与平台 面试官: "谢飞机,你好。我看到你熟悉Java SE,能不能简单介绍一下Ja…...

微服务即时通信系统(十二)---入口网关子服务

目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 网关HTTP接口 网关WebSocket接口 总体流程 服务代码实现 客户端长连接管理封装(connectionManage.hpp) proto文件的编写 身份鉴权proto 事件通知proto 各项请求的URL的确定 服务端完成入口网关服务类…...

ES练习册

es索引结构和数据实例 这里提供索引结构和数据实例提供给大家使用练习&#xff0c;希望大家能够一起成长进步~~~~ #添加索引 PUT /ecommerce_products {"settings": {"number_of_shards": 3,"number_of_replicas": 1,"analysis": {&…...

运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级

运算符主要分为以下几类‌&#xff1a; ‌算术运算符‌&#xff1a;用于执行基本的数学运算&#xff0c;如加、减、乘、除、取模等。例如&#xff1a;、-、*、/、%‌。‌赋值运算符‌&#xff1a;用于将值赋给变量。例如&#xff1a;、、-、*、/、%‌。‌比较运算符‌&#xff…...

shell编程基础知识及脚本示例

文章目录 前言一、shell变量1.命名规则2.定义及使用变量 二、shell传递参数1.位置参数2. 任意参数 三、shell一维数组0.定义方式1.定义并获取数组的单个元素2.定义并获取数组的所有元素3.定义并获取数组的元素个数4.定义并获取数组的元素索引 四、shell条件判断语法五、shell常…...

再学GPIO(一)

GPIO输出模式 STM32的GPIO&#xff08;General Purpose Input Output 通用输入输出&#xff09;引脚支持多种输出模式&#xff0c;不同模式决定了引脚的驱动能力和信号特性。STM32的GPIO输出模式主要分为以下4种&#xff1a; 推挽输出&#xff08;Push-Pull Output&#xff09;…...

OpenCV彩色图像分割

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。彩色图像增加了色彩信息&#xff0c;可以通过不同的色彩值来分割图像&#xff0c;常用彩色空间HSV/HIS、RGB、LAB等都可以用于分割。本节使用inRange…...

django filter 排除字段

在Django中&#xff0c;当你使用filter查询集&#xff08;QuerySet&#xff09;时&#xff0c;通常你会根据模型的字段来过滤数据。但是&#xff0c;有时你可能想要排除某些特定的字段&#xff0c;而不是过滤这些字段。这里有几种方法可以实现这一点&#xff1a; 使用exclude方…...

多模态大语言模型arxiv论文略读(四十五)

CAT: Enhancing Multimodal Large Language Model to Answer Questions in Dynamic Audio-Visual Scenarios ➡️ 论文标题&#xff1a;CAT: Enhancing Multimodal Large Language Model to Answer Questions in Dynamic Audio-Visual Scenarios ➡️ 论文作者&#xff1a;Qil…...

Vue3 通过Vue3-Print-Nb在线工单打印 模板打印 自定义打印 打印下载

介绍 通过在应用中集成打印功能&#xff0c;用户可以直接从页面打印工单&#xff0c;不用导出文件或使用其他外部工具。节省时间&#xff0c;提高效率&#xff0c;特别是当需要大量打印时。同时也可以将文件模板上传到数据库&#xff0c;提供给部门工作自行下载。 开源文档&am…...

视觉“解锁”触觉操控:Franka机器人如何玩转刚柔物体?

集智联机器人&#xff08;Plug & Play Robotics&#xff09;&#xff0c;简称PNP机器人&#xff0c;是Franka Robotics和思灵机器人金牌合作伙伴&#xff0c;集智联机器人团队成员均来自于国内外机器人行业知名企业&#xff0c;具有较强的学术背景。PNP机器人致力于为客户提…...

FlinkUpsertKafka深度解析

1. 设计目标与工作机制 Upsert-Kafka Connector 核心功能&#xff1a;支持以 Upsert&#xff08;插入/更新/删除&#xff09; 模式读写 Kafka 数据&#xff0c;适用于需要动态更新结果的场景&#xff08;如聚合统计、CDC 数据同步&#xff09;。数据流类型&#xff1a; 作为 …...

百度Create大会深度解读:AI Agent与多模态模型如何重塑未来?

目录 百度Create大会亮点全解析&#xff1a;从数字人到Agent生态布局 数字人商业化&#xff1a;从"拟人"到"高说服力"的进化 Agent生态&#xff1a;从"心响"App看百度的Agent战略布局 "心响"App的技术架构与创新点 多模态大模型&a…...

新能源汽车运动控制器核心芯片选型与优化:MCU、DCDC与CANFD协同设计

摘要&#xff1a;随着新能源汽车产业的迅猛发展&#xff0c;汽车运动控制器的性能和可靠性面临着更高的要求。本文深入探讨了新能源汽车运动控制器中MCU&#xff08;微控制单元&#xff09;、DCDC电源管理芯片和CANFD总线通信芯片的选型要点、优化策略及其协同设计方案。通过综…...

【软件工程】 白盒测试简介

1. 前言 在软件测试过程中&#xff0c;白盒测试&#xff08;White-box Testing&#xff09;是一种重要方法&#xff0c;它通过检查程序内部结构来验证软件功能。本文以一道典型的伪代码程序为例&#xff0c;结合白盒测试的基本操作&#xff0c;设计语句覆盖测试用例&#xff0…...

uniapp自定义一个选择年月日时分的组件。

<template><view><u-popup :show"timePopShow" mode"bottom" close"close" open"open" :closeOnClickOverlay"true"><view class"popup-container"><!-- 自定义时间内容 --><vi…...

Git命令(Gitee)

三板斧&#xff1a; git init //初始化本地仓库 git add . //添加所有文件到缓存区 &#xff08;或指定文件&#xff09; git commit -m "备注" //提交&#xff0c;填写备注 git remote add origin <远程仓库链接> git push -u origin ma…...

Node.js 应用部署:镜像体积优化与安全的多阶段构建探索

Node.js 应用部署:镜像体积优化与安全的多阶段构建探索 在开发 Node.js 应用时,部署过程中的镜像体积优化和安全性保障是至关重要的环节。本文将通过两种不同的 Docker 部署方式,深入探讨如何实现高效的镜像体积优化和安全的部署环境。 传统的单阶段构建方式 许多开发者在…...

深度解析:Web Crawling与Web Scraping的区别与联系

在现代互联网数据驱动的时代&#xff0c;Web Crawling(网页爬取)和Web Scraping(网页抓取)成为数据采集领域的两大核心技术。尽管两者常被混用&#xff0c;但它们在技术实现、应用目的和操作流程上存在显著差异。本文将基于权威资料&#xff0c;特别是维基百科的定义&#xff0…...

C# 利用log4net 工作台打印和保存到文件

目录 ‌log4net‌简介引言1、添加引用库2、添加引用和构建实例3、添加属性配置4、添加配置文件最后 ‌log4net‌简介 log4net‌是一个开源的日志记录组件&#xff0c;专为.NET平台设计。它是Apache log4j框架在Microsoft .NET平台的实现&#xff0c;属于Apache Logging Servic…...

2025 VSCode中如何进行dotnet开发环境配置完整教程

我一直都是用Visual Studio 2019来开发C#项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。 所以就想来研究如何使用VS Code&#xff0c;看看它是如何构建代码、调试代码、如何运行C#应用程序。 本文将详细介绍如何…...

vscode本地化显示远程图形化界面

远程登陆到服务器端 sudo vim /etc/ssh/sshd_config修改文件中的参数&#xff0c;保存。主要参数如下 配置好上述后需要reload一下ssh,安装xclock。 service ssh reload # 安装x11-apps&#xff0c;这样就可以使用xclock apt install x11-apps查看环境变量,在其中并没有DISPL…...

STM32 CAN通信 HAL库实战教程:从零到测试成功

STM32 CAN通信 HAL库实战教程&#xff1a;从零到测试成功 <我打印的是陀螺仪的数据> 目录 简介&#xff1a;为什么学习CAN通信CAN通信基础概念STM32 CAN硬件配置CAN初始化详解CAN数据发送实现CAN数据接收实现测试与验证方法常见问题与解决总结与拓展 1. 简介&#xff1…...

数据结构强化篇

应用题 排序 插入排序 void InsertSort (ElemType A[], n int) {int i, j;for (i2; i<n; i) //依次将 A[2]&#xff5e;A[n]插入前面已排序序列if (A[i]<A[i-1]) { //若 A[i]关键码小于其前驱&#xff0c;将 A[i]插入有序表A[0]A[i]; //复制为哨兵&#xff0c;A[0]不存放…...