ES6笔记 -- 字符串拓展

字符串拓展

Unicode 相关

  • JS 允许使用/uxxxx的Unicode方式显示字符, 但是只限于码点在/u0000~/uFFFF之间, 超过该范围的码点必须用双字节形式表示
  • ES6 中, 将码点放入大括号内, 就可以解读
  • JS 不能处理4个字节的字符, 字符串长度会被误判为2
  • ES6 提供了codePointAt方法, 能够正确处理 4 个字节储存的字符
  • 但是该方法在返回 4 个字节的字符串时, 依旧会返回两个参数, 第一个为正确解读的码点, 第二个为后两个字节的码点, 所以在多个包含 4 个字节的字符串时, 需要使用for...of循环
  • 同样的, 将 4 个字节的码点转换成字符串, ES6 提供了String.fromCodePoint()方法

字符串操作

  • ES6 为字符串添加了遍历器接口, 使其可以被for...of循环遍历, 相对传统的for, 其优势在于可以识别大于/uFFFF的码点

includes(), startsWith(), endsWith()

  • 这三个方法可以确定字符串是否包含在另一个字符串中

    • includes()方法表示是否找到了参数字符串.
    • startsWith()方法表示参数字符串是否为原字符串的首位
    • endsWith()方法表示参数字符串是否为原字符串的尾位
    • 三个方法的第一个参数为匹配字符串
    • 前两个方法第二个参数为起始搜索位置(从 0 开始)
    • endsWith()方法第二个参数为原字符串从左到右截取后剩下的长度
    let s = 'Hello world!';s.startsWith('world', 6) // true
    s.endsWith('Hello', 5) // true
    s.includes('Hello', 6) // false

repeat()

  • repeat()方法返回一个新字符串, 其接收一个number类型参数, 表示重复次数

    • 该参数不能为小于等于 -1 的负数或者Infinity
    • 如果负数大于 -1, 则视为0
    • 如果是字符串, 则会先转换为数字
    • 其他的均视为0
    'x'.repeat(3) // "xxx"

padStart(), padEnd()

  • 这两个方法用于补全字符串

  • 当字符串长度不够指定长度时, 会在头部或尾部补全

  • 该方法接收两个参数

    • 第一个是指定字符串长度,
    • 第二个是用来补全的字符串, 该参数不填默认为空格
  • 当字符串长度加上补全字符串超过指定长度时, 将截取超出位数的补全字符串

  • 该方法一般用在数值补全指定位数

    '1'.padStart(10, '0') // "0000000001"
    '12'.padStart(10, '0') // "0000000012"
    '123456'.padStart(10, '0') // "0000123456"

模板字符串相关

基本用法

  • 语法

    • 模板字符串定义在两个反引号( ` )之间,
    • 它可以当做普通字符串使用, 也可以定义多行字符串, 或者在字符串中嵌入变量
    • 变量写在${}之中, 除了能调用变量还能引用对象属性, 函数和进行简单的运算
    • 如果需要使用反引号, 则需要用反斜杠  转义
    • 模板字符串默认会保留空格与换行, 如果不需要可以用trim()方法消除
    $('#result').append(`There are <b>${basket.count}</b> itemsin your basket, <em>${basket.onSale}</em>are on sale!
    `);

标签模板

  • 模板字符串还可以当做模板标签

  • 当模板字符串里为不包含变量的简单字符串, 数字等时, 函数会将模板字符串当做参数来处理

    • 该用法不能代替原来函数的调用方式, 这里只是介绍使用方法, 原因在下面解释
    alert`'abc'123`
    // 'abc'123
  • 当模板字符串里包含变量时, 会有以下解析

    • 将被变量( 即${}标识 )分开的普通字符串放进数组并当做第一个参数

    • 变量被从左到右依次解析并依次放入第二, 第三...第n个参数

      tag`Hello ${ a + b } world ${ a * b }`;
      // 相当于 tag(['Hello ', ' world ', ''], 15, 50);
    • 需要注意的是, 使用这种传参方式

      • 第一个参数永远是数组
      • 数组里有一个raw属性, 该属性保存的是转义后的原字符串, 所以该方式不能取代传统函数调用方式
      • 数组里的元素个数永远等于参数个数
      • 函数参数至少为两个(数组元素同), 如果只传一个变量, 则数组的两个元素为空
      • 如果用这种方式传递字符串, 必须包含在单引号 ( ' )内, 否则会当做变量处理
      • 通常这样做函数只声明一个参数, 传递的变量通过arguments方法来拿
    • 下面一个复杂的案例可以涵盖以上内容

      let total = 30;
      let msg = passthru`The total is ${total} (${total*1.05} with tax)`;function passthru(literals) {let result = '';let i = 0;// 这里 literals 与 arguments 长度一致while (i < literals.length) {// 这里 i++ 是使下面 arguments 直接从第二个参数拿起result += literals[i++];if (i < arguments.length) {result += arguments[i];}}return result;
      }msg // "The total is 30 (31.5 with tax)"
    • 通常标签模板重要应用是用来过滤 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;
      }let sender = '<script>alert("abc")</script>'; // 恶意代码
      let message = SaferHTML`<p>${sender} has sent you a message.</p>`;console.log(message)
      // <p>&lt;script&gt;alert("abc")&lt;/script&gt; has sent you a message.</p>

      其他的需要过滤转换的都可以使用标签模板

转载于:https://www.cnblogs.com/xvvx/p/10278418.html

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

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

相关文章

android 转发短信

通过这些代码也可以对远程手机实现短信控制。有兴趣的可以自己改一下&#xff0c;说一下简单的原理&#xff0c;要实现控制的话&#xff0c;必须得走一个固定的号码&#xff0c;固定的格式&#xff0c;然后通过得到此号码的内容&#xff0c;然后通过固定的内容&#xff0c;就可…

[Noi2016]区间

传送门 Code /* 线段树 尺取法 */ #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)>(b)?(b):(a)) #define reg register inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(…

安装CentOS6.8并配置网络图文解说亲测全过程

安装环境&#xff1a; 本文是在win10系统安装上VMWare并配置Centos6.8虚拟机。 准备工作 1.安装VMWare虚拟机 1.1下载VMWare12资源链接&#xff1a;https://pan.baidu.com/s/1AhfMSDXLO-aA0eMqnuMWHg 提取码&#xff1a;iftd 1.2安装VMWare&#xff0c;在安装过程中需要输入密钥…

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。Paxos算法解决的问题是一个分布式系统如何就某个值&#xff08;决议&#xff09;达成一致。在工程实践意义上来说&#xff0c;就是可以通过Paxos实现多副本一致性&#xff0c;分布式锁&…

09、策略模式

2019独角兽企业重金招聘Python工程师标准>>> 策略模式与工厂模式最大的区别在于&#xff0c;策略模式注重的是对算法的维护&#xff0c;也可以理解为对算法的封装。而工厂模式&#xff0c;则只是负责创建类&#xff0c;在刚接触策略模式时候&#xff0c;往往与工厂模…

Linux创建、删除文件和文件夹命令

https://www.cnblogs.com/c-x-m/p/9794082.html转载于:https://www.cnblogs.com/sun-ldy/p/10279025.html

Java编写代理服务器(Burp拦截Demo)一

大家都知道大名鼎鼎的BurpSuite代理神器&#xff0c;对于抓取HTTP请求非常好用&#xff0c;偶然&#xff0c;一朋友问我Java应该如何去编写代理服务器&#xff08;因为他想做某些东西&#xff09;&#xff0c;有没有相关的API 去实现&#xff0c;我想说&#xff0c;差不多你能想…

mysql实战33 | 我查这么多数据,会不会把数据库内存打爆?

我经常会被问到这样一个问题&#xff1a;我的主机内存只有 100G&#xff0c;现在要对一个 200G 的大表做全表扫描&#xff0c;会不会把数据库主机的内存用光了&#xff1f;这个问题确实值得担心&#xff0c;被系统 OOM&#xff08;out of memory&#xff09;可不是闹着玩的。但…

[BZOJ2125]最短路

Description 给一个N个点M条边的连通无向图&#xff0c;满足每条边最多属于一个环&#xff0c;有Q组询问&#xff0c;每次询问两点之间的最短路径。 Input 输入的第一行包含三个整数&#xff0c;分别表示N和M和Q 下接M行&#xff0c;每行三个整数v&#xff0c;u&#xff0c;w表…

Rabbit MQ windows下安装

Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装Rabbit MQ的前提是安装Erlang。通过下面两个连接可以下载安装最新的版本&#xff1a; 下载并安装 Eralng OTP For Windows otp_win64_18.3.exe&#xff08;erlang的环境&#xff09;运行安装 Rabbit MQ Serve…

spark集群配置以及java操作spark小demo

spark 安装配置使用java来操作sparkspark 安装 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoop2.7.tgz mv spark-2.4.0-bin-hadoop2.7 sparksudo vim /etc/profileexport SPARK_HOME/usr/local/stormexport PATH$PATH:$SPARK_HOME/binsource /etc/profile…

C++笔记(3)——string.h相关的一些小知识

strlen() 用于得到字符数组中第一个\0前的字符的个数&#xff0c;格式如下&#xff1a; strlen(数组); 例子&#xff1a; #include <stdio.h> #include <string.h>int main(){char str[10];gets(str);int len strlen(str);printf("%d\n", len);return 0…

最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订

最近发现系统rabbitmq丢消息比较严重&#xff0c;于是想了些方案来查找原因&#xff0c;给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订阅队列 3. 批量发送 4. 在生产环境与测试环境的RabbitMQ都进行了测试 …

uoj#388. 【UNR #3】配对树(线段树合并)

传送门 先考虑一个贪心&#xff0c;对于一条边来说&#xff0c;如果当前这个序列中在它的子树中的元素个数为奇数个&#xff0c;那么这条边就会被一组匹配经过&#xff0c;否则就不会 考虑反证法&#xff0c;如果在这条边两边的元素个数都是偶数&#xff0c;那么至少有两组匹配…

一道Js判断对象是否相等面试题引发的故事

话说&#xff0c;说什么呢&#xff0c;先看下题吧还是、 function checkName(data) { if (data { name: LIMING }) { console.log("one"); 复制代码 } else if (data { name: LIMING }) { console.log(two"); 复制代码 } else { console.log("three&quo…

序列化

什么是序列化&#xff1f;为什么要实现序列化&#xff1f;有什么作用&#xff1f; 序列化就是把具体的对象转化成二进制的字节码文件进行存储或网络传输。反过来就是反序列化。 将要存储或网络传输的对象必须实现序列化才可以。 如果一个类已经实现了序列…

搭建Hive平台

http://www.cnblogs.com/gpcuster/archive/2010/02/24/1672635.html Hive是一个基于Hadoop的数据仓库平台。通过hive&#xff0c;我们可以方便地进行ETL的工作。hive定义了一个类似于SQL的查询语言&#xff1a;HQL&#xff0c;能够将用户编写的QL转化为相应的Mapreduce程序基于…

Java语言与sikuli配合

很早之前写过一篇介绍sikuli的文章。本文简单介绍如何在java中使用sikuli进自动化测试。 图形脚本语言sikuli sikuli IDE可以完成常见的单击、右击、移动到、拖动等鼠标操作&#xff0c;java引用sikuli-script.jar同样可以执行这些常见的鼠标操作&#xff0c;因此即可方便的编写…

列表生成式,生成器表达式,模块的使用

三元表达式 无论条件成立与否都要返回一个值, 用于简化仅有一个判断的函数(或代码块)递归 递归有循环调用的次数限制,调用函数时,函数相关数据要入栈,而栈区是有限的 二分查找法匿名函数 仅能在定义时使用一次,定义完了就没了 参数没有括号,不能有return,会自…

C#怎么用代码模拟手机去访问手机网站抓取数据

WebClient client new WebClient ();client.Headers.Add ("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");更改user-agent为手机浏览器的。模拟谷歌Android&#xff1a;user-agent"Mozilla/5.0 (Linux; …