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

ES6之字符串的扩展

  • 字符串的扩展
    • 关键的扩展点及其示例:
      • Unicode 表示与处理
        • JavaScript 共有6种方法可以表示一个字符。
        • codePointAtpos:
        • String.fromCodePoint…codePoints:
      • **字符串的遍历 for … of **
      • 字符串方法的增强
        • includessearchString[, position]:
        • startsWithsearchString[, position]:
        • endsWithsearchString[, length]:
        • 第二个参数
      • 字符串的重复
        • repeatcount:
      • 字符串的补全
        • padStarttargetLength[, padString] 和 padEndtargetLength[, padString]:
      • 模板字符串(Template Literals)
        • 过滤 HTML 字符串,防止用户输入恶意内容
        • 多语言转换(国际化处理)

1. 字符串的扩展

ES6 加强了对 Unicode 的支持,并且扩展了字符串对象。

ES6(ECMAScript 2015)对字符串类型进行了显著的扩展,引入了许多新的方法和特性,提高了处理字符串的便利性和效率。

1.1. 关键的扩展点及其示例:

1.1.1. Unicode 表示与处理

ES5中,这种表示法只限于码点在 \u0000 ~ \uFFFF 之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。

"\uD842\uDFB7"
// ""
"\u20BB7"
// " 7"

上面代码表示,如果直接在 \u 后面跟上超过 0xFFFF 的数值(比如\u20BB7 ),JavaScript会理解成 \u20BB+7 。由于 \u20BB 是一个不可打印字符,所以只会显示一个空格,后面跟着一个 7 。

ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。

"\u{20BB7}"
// """\u{41}\u{42}\u{43}"
// "ABC"let hello = 123;
hell\u{6F} // 123'\u{1F680}' === '\uD83D\uDE80'
// true

上面代码中,最后一个例子表明,大括号表示法与四字节的 UTF-16 编
码是等价的。

1.1.1.1. JavaScript 共有6种方法可以表示一个字符。
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
1.1.1.2. codePointAt(pos)

返回字符串中指定位置的 Unicode 码点。

let str = "𠮷";
console.log(str.codePointAt(0)); // 正确输出大于0xFFFF的码点
1.1.1.3. String.fromCodePoint(...codePoints)

从一系列 Unicode 码点创建字符串。

console.log(String.fromCodePoint(0x20BB7)); // 输出: "𠮷"
1.1.2. **字符串的遍历 for … of **

引入了迭代器接口,可以直接用for…of循环遍历字符串中的每个字符(包括 surrogate pairs)。

let str = "hello";
for (let char of str) {console.log(char);
}
1.1.3. 字符串方法的增强
1.1.3.1. includes(searchString[, position])

判断字符串是否包含某个子串,返回布尔值。

let str = "Hello world";
console.log(str.includes("world")); // 输出: true
1.1.3.2. startsWith(searchString[, position])

判断字符串是否以指定的子串开始,返回布尔值。

console.log(str.startsWith("Hello")); // 输出: true
1.1.3.3. endsWith(searchString[, length])

判断字符串是否以指定的子串结束,返回布尔值。

console.log(str.endsWith("world")); // 输出: true
1.1.3.4. 第二个参数

这三个方法都支持第二个参数,表示开始搜索的位置。

let s = 'Hello world!';s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false

上面代码表示,使用第二个参数 n 时, endsWith 的行为与其他两个方法有所不同。它针对前 n 个字符,而其他两个方法针对从第 n 个位置直到字符串结束。

1.1.4. 字符串的重复
1.1.4.1. repeat(count)

返回一个新的字符串,将原字符串重复指定次数。

let str = "abc";
console.log(str.repeat(3)); // 输出: "abcabcabc"
1.1.5. 字符串的补全
1.1.5.1. padStart(targetLength[, padString])padEnd(targetLength[, padString])

在字符串的开头或结尾补全指定的字符,直到达到指定长度。

ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。 padStart() 用于头部补全, padEnd() 用于尾部补全。

padStart 和 padEnd 一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。

console.log("foo".padStart(5, '0')); // 输出: "00foo"
console.log("foo".padEnd(5, '0')); // 输出: "foo00"
1.1.6. 模板字符串(Template Literals)

使用反引号(`)定义,允许直接嵌入变量和表达式,以及多行字符串。

let name = "Alice";
let greeting = `Hello, ${name}!`;
console.log(greeting); // 输出: Hello, Alice!
1.1.6.1. 过滤 HTML 字符串,防止用户输入恶意内容
let message =
SaferHTML`<p>${sender} has sent you a message.</p>`;
function SaferHTML(templateData) {let s = templateData[0];for (let i = 1; i < arguments.length; i++) {let arg = String(arguments[i]);// Escape special characters in the substitution.s += arg.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");// Don't escape special characters in the template.s += templateData[i];}return s;
}

上面代码中, sender 变量往往是用户提供的,经过 SaferHTML 函数处理,里面的特殊字符都会被转义。

let sender = '<script>alert("abc")</script>'; // 恶意代码
let message = SaferHTML`<p>${sender} has sent you a message.</p>`;message
// <p>&lt;script&gt;alert("abc")&lt;/script&gt; has sent
you a message.</p>
1.1.6.2. 多语言转换(国际化处理)
i18n`Welcome to ${siteName}, you are visitor number
${visitorNumber}!`
// "欢迎访问xxx,您是第xxxx位访问者!"

模板字符串本身并不能取代Mustache之类的模板库,因为没有条件判断和循环处理功能.

这些扩展极大地丰富了JavaScript处理字符串的能力,使得字符串操作更加灵活和强大。

相关文章:

ES6之字符串的扩展

字符串的扩展 关键的扩展点及其示例&#xff1a; Unicode 表示与处理 JavaScript 共有6种方法可以表示一个字符。codePointAtpos&#xff1a;String.fromCodePoint…codePoints&#xff1a; **字符串的遍历 for … of **字符串方法的增强 includessearchString[, position]&…...

微信小程序开发,构建NPM报错解决

报错信息如下&#xff1a; message&#xff1a; NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid: wx7144a5d5411…...

【异常】SpringBoot整合RabbitMQ-发送消息报错

错误信息 reply-code406, reply-textPRECONDITION_FAILED - inequivalent arg ‘x-message-ttl’ for queue ‘hello-queue’ in vhost ‘/lq’: received none but current is the value ‘10000’ of type ‘signedint’, class-id50, method-id10 错误原因 hello-queue这…...

通过钉钉卡片进行工单审批

我们通常通过钉钉机器人来发送通知&#xff0c;提醒审批人名下有待办工单需要处理。这种通知方式仅能提醒审批人到ITSM中处理&#xff0c;审批人需要打开电脑登陆平台处理&#xff0c;我们就考虑是否能有一种方式能够满足移动端审批&#xff1f; 这里我们可以使用ITSM的移动端版…...

C语言中的控制语句:深入解析与案例实践2

五、使用goto实现无条件跳转 虽然goto语句在现代编程实践中往往被避免使用&#xff0c;因为它可能导致代码难以理解和维护&#xff0c;但在某些特定情况下&#xff0c;它仍然可以作为一种解决方案。goto语句允许程序无条件地跳转到代码中指定的标签位置。 案例代码&#xff1a…...

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器&#xff08;ICSR&#xff09;Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…...

深入解析C#中的async和await关键字

文章目录 一、异步编程的基本概念及其在C#中的实现二、async关键字的定义及其用法三、await关键字的定义及其用法示例代码&#xff1a;使用async和await编写一个简单的异步程序 四、async和await的优点注意事项 五、C#下async和await中常见问题汇总1. 异步方法中的await调用2. …...

【VUE.js】前端框架——未完成

基于脚手架创建前端工程 环境 当安装node.js时&#xff0c;它本身就携带有npm命令。&#xff08;-v 查版本号&#xff09;安装VUE CLI npm i vue/cli -g&#xff08;全局&#xff09; 创建 vue create 【project name】 镜像源解决方案 输入创建命令后&#xff0c;提示检查更…...

开源的文件压缩和解压缩软件7-Zip

7-Zip是一款开源的文件压缩和解压缩软件&#xff0c;它支持多种压缩格式&#xff0c;包括自有的7z格式以及常见的ZIP、RAR、TAR等格式。下面是对7-Zip的详细介绍&#xff0c;包括其功能特点、使用方法、优缺点等方面的内容。官网&#xff1a;7-Zip 1. 功能特点&#xff1a; 多…...

搜维尔科技:Patchwork 3D 新功能:爆炸视图动画

Patchwork 3D新功能&#xff1a;爆炸视图动画 为什么使用 Patchwork 3D&#xff1f; Patchwork 3D 软件有助于将 CAD 数据转换成真实感的 3D 模型以用于工业用途。 Patchwork 3D 可轻松进行实时渲染&#xff0c;有助于缩短设计周期&#xff0c;或者让您获得效果逼真的渲染图&…...

Redis——RedLock、Zookeeper及数据库实现分布式锁

在分布式系统中&#xff0c;实现分布式锁是确保数据一致性和防止并发问题的重要手段。以下是使用Redis的RedLock算法、ZooKeeper以及数据库实现分布式锁的基本概念和步骤&#xff1a; 1. Redis的RedLock算法 Redis的RedLock算法是Redis官方推荐的一种分布式锁实现方式&#x…...

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析

OpenSSL自签证书并基于Express搭建Web服务进行SSL/TLS协议分析 起因 最近在学习安全协议&#xff0c;大多数实验都是基于Windows下IIS&#xff0c;或者Linux下nginx搭建的Web服务&#xff0c;搭建环境和编写配置文件比较麻烦。而且我有多个不同环境的设备&#xff0c;折腾起来…...

记录一次 vue2 前端项目整合过程

整合成功效果图 具体说明&#xff1a; 项目A是现在的vue2前端项目&#xff0c;项目B是一个开源的工作流前端&#xff0c;项目后端代码已经整合了&#xff0c;就不多提了。这里主要记录下前端整合的过程和思路。 1、开源工作流里面的功能&#xff0c;拷贝到自己对应的vue2项目里…...

物联网五层架构分析

物联网五层架构分析 随着科技的迅速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为日常生活中不可或缺的一部分&#xff0c;已融入人们的生活和工作中。物联网五层架构&#xff0c;包括感知层、网络层、数据层、应用层和业务层&#xff0c;扮演着关键的角色。 感知层 …...

【Java EE】多线程(三)线程状态

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…...

FFmpeg常用API与示例(一)—— 工具库篇(av_log、AVDictionary、avio)

工具层 1.av_log 可以设置日志的级别&#xff0c;这个看看名字就明白了&#xff0c;也不用过多的解释。 AV_LOG_PANICAV_LOG_FATALAV_LOG_ERRORAV_LOG_WARNINGAV_LOG_INFOAV_LOG_VERBOSEAV_LOG_DEBUG void test_log() {/ av_register_all();AVFormatContext *pAVFmtCtx NU…...

日志的基本用法

目标 1. 掌握如何设置日志级别 2. 掌握如何设置日志格式 3. 掌握如何将日志信息输出到文件中 1. logging模块 Python中有一个标准库模块logging可以直接记录日志 1.1 基本用法 import logging logging.debug("这是一条调试信息") logging.info("这是一条…...

什么是页分裂、页合并?

数据组织方式 在InnoDB存储引擎中&#xff0c;表数据都是根据主键顺序组织存放的&#xff0c;这种存储方式的表称为索引组织表(index organized table IOT)。 行数据&#xff0c;都是存储在聚集索引的叶子节点上的。而我们之前也讲解过InnoDB的逻辑结构图&#xff1a; 在I…...

软件2班20240513

第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …...

嵌入式学习-时钟树

时钟树 时钟分类 时钟树框图 LSI与LSE HSI、HSE与PLL 系统时钟的产生 AHB、APBx的时钟配置 相关寄存器 寄存器部分的细节内容请参考手册。 相关库函数...

别再只会用PWM调速度了!STM32驱动直流有刷电机,H桥的三种模式(单极/双极/受限)到底怎么选?

STM32驱动直流有刷电机的三种H桥模式深度解析与实战选型指南 在嵌入式电机控制领域&#xff0c;PWM调速早已成为基础技能&#xff0c;但真正决定系统性能的往往是H桥工作模式的选择。当你的电机出现异常发热、刹车响应迟缓或低速抖动时&#xff0c;问题很可能就出在模式选择不当…...

NotebookLM移动端体验全拆解(iOS/Android双端对比报告·仅限内测用户知晓的性能阈值)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;NotebookLM移动端体验全景概览 NotebookLM 作为 Google 推出的基于用户自有文档构建的 AI 助手&#xff0c;其移动端&#xff08;iOS/Android&#xff09;已正式开放下载。该应用并非简单将网页版界面缩放适配…...

创业公司如何利用 Taotoken 统一管理多个 AI 模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业公司如何利用 Taotoken 统一管理多个 AI 模型服务 对于资源有限的创业团队而言&#xff0c;快速验证产品想法、迭代功能是生存…...

Jetson Orin AGX INT4 推理优化实践:super 分支从 9 tok/s 到 24 tok/s

Jetson Orin AGX INT4 推理优化实践&#xff1a;super 分支从 9 tok/s 到 24 tok/s 项目地址&#xff1a;https://github.com/luogantt/LLM-inference-engine 本文总结 jetson-orin-agx-super 分支上的一次端侧大模型推理优化实践。目标设备是 Jetson Orin AGX&#xff0c;目…...

Blender模型导入Unity材质丢失的根因与自动化修复方案

1. 这不是“导出再导入”那么简单&#xff1a;为什么Blender模型进Unity后总变灰、贴图全丢、材质不认 你刚在Blender里花三小时调好一个带PBR材质、多层UV、自发光贴图和顶点色的机械臂模型&#xff0c;导出FBX&#xff0c;拖进Unity——结果&#xff1a;模型是黑的&#xff0…...

终极游戏模组管理指南:Nexus Mods App如何让你轻松玩转模组世界

终极游戏模组管理指南&#xff1a;Nexus Mods App如何让你轻松玩转模组世界 【免费下载链接】NexusMods.App Home of the development of the Nexus Mods App 项目地址: https://gitcode.com/gh_mirrors/ne/NexusMods.App 厌倦了手动安装模组时的各种冲突和兼容性问题&a…...

2026 年 5 月消防刷题不提分?高质量刷题工具实测指南

2026 年消防设施操作员考试侧重实操应用与智慧消防&#xff0c;题型灵活性大幅提升&#xff0c;超 68% 考生面临刷题量大但分数停滞的困境。核心痛点集中在&#xff1a;消防设施操作员模拟题质量差、与真题命题逻辑不符&#xff08;相似度低于 62%&#xff09;、消防设施操作员…...

ESXi 9.0.0 HPE原厂定制版深度解析|专属硬件适配+零报错部署指南,HPE服务器运维最优解

随着vSphere 9.0虚拟化架构全面普及&#xff0c;企业HPE慧与服务器的底层虚拟化部署迎来全新升级需求。普通通用版ESXi镜像在HPE ProLiant、Apollo系列服务器中&#xff0c;常出现网卡不认、RAID驱动缺失、iLO管理异常、硬件兼容报错等问题&#xff0c;严重影响生产部署效率与系…...

曼德勃罗集的 Three.js 实现

效果预览 经典的曼德勃罗集&#xff08;Mandelbrot Set&#xff09;分形渲染&#xff0c;配合动态缩放动画探索分形边界的无限细节。使用线性插值平滑着色&#xff0c;呈现出彩虹般的色彩过渡。 &#x1f449; 点击查看《曼德勃罗集的》完整源码与效果演示 Shader 实现原理…...

从零构建Sora 2-UE5.4可信工作流:基于IEEE 1872标准的生成内容元数据注入方案(附GitHub认证仓库)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从零构建Sora 2-UE5.4可信工作流&#xff1a;基于IEEE 1872标准的生成内容元数据注入方案&#xff08;附GitHub认证仓库&#xff09; 核心目标与标准对齐 本工作流严格遵循 IEEE P1872™&#xff08;O…...