在 ES6 之前,JS 的多行字符串一直是开发难题,在处理多行字符串时,各种各样的方案都有~~

在 JS 中,如果直接这样写多行字符串:

const str1 = '第一行
第二行';

那浏览器转过来就打脸,分分钟报错:

Uncaught SyntaxError: Invalid or unexpected token

ES5 多行字符串

以下多种方式都输出:

公众号:
前端路引

1、使用加号拼接:

在每行字符串后面添加 + ,拼接跨行的字符串。

const str2 = '公众号:' +
'前端路引';
console.log(str2);

2、反斜线转义换行

在每行末尾添加 \,可以做到跨行书写字符串。

const str3 = '公众号:\n\
前端路引';
console.log(str3);

3、利用数组保存多行字符串

利用数组的 join 方法,可以实现多个数组元素拼接成字符串。

const str4 = [
'公众号:',
'前端路引'
].join('\n');
console.log(str4);

4、使用注释保存多行字符串

此方法有点邪门,很早之前就看到过,也不知道出至哪位大佬~~

注意:注释内容在代码压缩时候可能会被删除。

function multiline(fn) {
return fn.toString()
.replace(/^[^\/]+\/\*!?/, '') // 删除函数定义和注释起始符
.replace(/\*\/[^\/]+$/, ''); // 删除注释结束符
}
const str5 = multiline(function() {
/*公众号:
前端路引
*/
});
console.log(str5);

5、使用 HTML 标签保存多行字符串

使用 type="text/plain" 的 script 标签多行文本内容,再 JS 中获取 textContent 即可得到跨行字符串。

此方法是很多浏览器端的模板引擎做法,包括 Vue 不使用 Vite 打包时都可以这么玩~~

<script id="multiText" type="text/plain">公众号:
前端路引</script> <script>
const str6 = document.querySelector('#multiText').textContent;
console.log(str6);
</script>

ES5 多行字符串在使用方法上,总感觉有一点歪门邪道,直到 ES6 模版字符出现,终于实现了大统一~~

ES6 模版字符

使用反引号两个 (``)包起来的字符串就是模板字符串,模板字符串的各种用法如下:

1、多行字符串

const str7 = `公众号:
前端路引`;
console.log(str7);

2、字符串插值

模板字符串重点不是用来显示多行字符串,而是在字符串中间可以插入变量,再也不需要使用 + 拼接了。

const name = '前端路引';
const str8 = `公众号:
${name}`;
console.log(str8); // ES5 必须使用 + 拼接
const str9 = '公众号:\n' + name;
console.log(str9);

模板字符串插值 ${} 中,既然可以使用变量,肯定是也能使用 JS 中的各种表达式,包括函数调用等。比如

const temp1 = `随机数:${Math.random()}`
const temp2 = `是否大于0.5:${Math.random() > 0.5 ? '是' : '否'}`

模板字符串的骚操作开始,以下用法在开发中不是很常见~~

3、模板标签

此写法第一次见到的时候,一度以为存在语法错误~~

function tag(strings, ...values) {
let result = "";
strings.forEach((str, i) => {
result += str;
if (i < values.length) result += `<tag>${values[i]}</tag>`;
});
return result;
}
const name2 = '前端路引';
const age2 = 1
console.log(tag`公众号:${name2},年龄:${age2}`);
// 输出 公众号:<tag>前端路引</tag>,年龄:<tag>1</tag>

重点代码:

tag`公众号:${name2},年龄:${age2}`

说实话,当时是第一次见到 JS 的 function 调用时候不需要使用括号~~

4、原始字符串

JS 中的字符串,如果存在反引号 \ ,那么就会被当做转义字符处理,可通过 String.raw 让字符串不要转义。

输出 C:\user\Web3Dev\Documents 这个字符串:

// 不使用 raw 方法就必须使用 `\\` 两个反引号
console.log('C:\\user\\web3dev\\Documents'); // 使用 raw 方法
console.log(String.raw`C:\user\web3dev\Documents`);

写在最后

IE 时代,JS 的字符串拼接性一度当做性能优化课题存在,开发建议永远不要使用 + 去拼接字符,一直都是建议使用数组 join 方法拼接字符串,直到 Chrome 崛起,V8 引擎这个性能怪兽终于让 JS 的字符串性能飙升,开发者也不用再考虑字符串拼接的性能问题了~~

Web前端入门第 78 问:JavaScript 比较少见的模版字符串用法的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  3. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  4. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  5. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  6. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  7. Android零基础入门第78节:四大组件的纽带——Intent

    前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Activity,而是通过Intent来表达自己的意图 ...

  8. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  9. web前端——实例中学习css,javascript

    最近闲暇时候在研究前端的样式和js,以前都是从w3school上看看那些选择器和DOM操作方法很少去实际做demo来研究,做的过程当中才真切感觉到纸上得来终觉浅,看得懂跟能做出东西完全两码事,尤其在定 ...

  10. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript

    本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...

随机推荐

  1. 为什么 Spring 循环依赖需要三级缓存,二级不够吗?

    Spring循环依赖解决机制中引入了三级缓存,这是因为仅使用二级缓存无法灵活处理代理Bean的早期暴露需求.以下是为什么需要三级缓存的详细分析: 1. 二级缓存的局限性 二级缓存通常用于存储早期暴露的 ...

  2. 在 MySQL 中存储金额数据,应该使用什么数据类型?

    在MySQL中存储金额数据时,最推荐使用 DECIMAL 类型(有时也叫做 NUMERIC).DECIMAL 类型是一种精确的数字类型,适合存储具有小数位的金额数据,因为它不会像浮点数类型那样受到精度 ...

  3. 在win nginx下配置symfony3.4,并隐藏项目名称 .php入口

    在win nginx下配置symfony3.4,并隐藏项目名称 .php入口   记录下 # power by www.php.cn #user nobody; worker_processes 1; ...

  4. JuiceFS v1.3-beta1:全面优化 SQL 数据库支持,十亿级元数据管理新选项

    JuiceFS v1.3-beta 今天正式发布.在这个版本中,除了进行了大量使用体验优化和 bug 修复外,新增如下特性: 新增 Python SDK:这是一个从企业版移植过来的特性,旨在支持 FU ...

  5. JDK、tomcat、MySQL安装部署

    大数据开发实战 计算机基础普及 [计算机基础与网络.1](动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541( ...

  6. 一个基于 C# Unity 开发的金庸群侠传 3D 版,直呼牛逼!

    前言 大家应该都知道 Unity 游戏引擎是基于 C# 编程语言开发的,今天大姚给大家分享一个基于 C# Unity 开发的金庸群侠传 3D 版,该游戏真的是勾起了一代人的慢慢回忆. 项目介绍 JYX ...

  7. 工具 | Hfish

    0x00 简介 HFish是一款社区型免费蜜罐. 下载地址 HFish下载: HFish下载 0x01 功能说明 支持多种蜜罐服务 支持自定义Web蜜罐 支持流量牵引 支持端口扫描感知能力 支持多种告 ...

  8. 代码随想录第二十天 | Leecode 235. 二叉搜索树的最近公共祖先 、 701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点

    Leecode 235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...

  9. 【工具】FreePic2PDF+PdgCntEditor|PDF批量添加书签(Windows)

    这俩软件都不大,比较便携. FreePic2PDF: 我下载的来源:https://www.52pojie.cn/thread-1317140-1-1.html(包含下载链接https://www.l ...

  10. 操作系统:设备I/O -- 设备如何处理内核I/O包

    上一讲实现了建立设备的接口,相当于制定了部门的相关法规,只要遵循这些法规就能建立一个部门.一个部门的职责不难确定,它应该能对上级下发的任务作出响应,并完成相关工作,而这对应到设备,就是如何处理内核的I ...