对JavaScript中与字符串相关的方法总结
JavaScript中的字符串是由16位码元code unit组成。通常来说,一个字符=16位码元,该类字符也叫做单码元字符。还有一种字符组成策略是代理对,它由两对16位码元组成,即一个字符对应两个16位码元,用于增补字符。
JavaScript使用两种Unicode编码混合的策略:USC-2和UTF-16。
深入了解字符编码
字符串原始值可以调用所有String对象的方法;有3个继承的方法:valueOf()、toLocaleString()、toString(),它们都返回字符串对象的原始字符串值;有1个length属性,其值为字符串所包含的字符数量。
下面介绍JavaScript字符串的相关方法。
不做说明的都不改变原字符串。
1.charAt、charCodeAt、codePointAt
charAt获取指定位置字符。charCodeAt获取指定位置字符的编码(16进制变成10进制)。
const str="Hello,世界!";
console.log(str.charAt(0)); //H
console.log(str.charAt(7)); //界
console.log(str.charCodeAt(0)); //72
console.log(str.charCodeAt(7)); //30028
console.log(parseInt(30028).toString(16)); //754c
charCodeAt只适合单码元字符,而代理对字符需要使用codePointAt。
为了正确解析既包含单码元字符又包含代理对字符的字符串,使用codePointAt接收16位码元的索引并返回该索引位置上的码点(Unicode中一个字符的完整标识)。
const str = "abba";
console.log(str.charCodeAt(2)); // 55357
console.log(str.codePointAt(2)); // 128514
2.fromCharCode、fromCodePoint
fromCharCode用于根据给定的UTF-16码元创建字符,可以接受多个数值,生成一个字符串。fromCodePoint用给定码点创建字符,同样可接受多个值生成一个字符串。
// 使用 fromCharCode() 创建字符
const char1 = String.fromCharCode(65); // 65 是字符 'A' 的UTF-16码元
console.log(char1); // 输出:A
// 使用 fromCodePoint() 创建字符
const char2 = String.fromCodePoint(128514); // 128514 是笑脸符号的码点
console.log(char2); // 输出:
两个一样的字符一定相等吗?如果这两个字符看着一样,但是对应的字符编码不一样,那么便不相等,例如
const char1 = 'A'; // 拉丁字母大写A
const char2 = 'Α'; // 希腊字母大写Alpha
// 比较两个字符是否相等
console.log(char1 === char2); // 输出:false,尽管外观相似,但字符编码不同
// 获取字符编码
console.log(char1.charCodeAt(0)); // 输出:65,字符A的Unicode编码
console.log(char2.charCodeAt(0)); // 输出:913,字符Α的Unicode编码
3.concat
concat用于拼接字符串,可以一次性拼接多个字符串,当然我们更常使用 + 号来拼接字符串。
let str="Hello "
console.log(str.concat("World","!")) //"Hello World!"
console.log(str) //"Hello"
4.slice、substring、substr
这三个方法有一定相似,但也有重大不同,且看下文。
它们都用于提取子字符串,都接受1或2个参数,且第一个参数都是起始位置的索引,如果省略第二个参数,表示截取到字符串末尾。不同的地方是,slice和substring第二个参数是结束位置的索引(截取部分不包括该结束位置),而substr第二个参数是从起始位置截取字符串的字符个数。值得注意的是,substring它会将较小的数字当成起始位置,可能会出现第一参数大于第二参数的情况。
对于负数参数,slice会将它们都加上字符串长度(即从右往左数),直到为正数;substr会将第一个负参加上字符串长度,将第二个负参变为0;substring将所有负参转为0。
let str = "Hello world!"
console.log(str.slice(0)) //Hello world!
console.log(str.slice(0, 5)) //Hello
console.log(str.substring(0)) //Hello world!
console.log(str.substring(0, 5)) //Hello
console.log(str.substr(0)) //Hello world!
console.log(str.substr(0, 5)) //Hello
console.log(str.slice(-5)) //orld!
console.log(str.substring(-5)) //Hello world!
console.log(str.substr(-5)) //orld!
console.log(str.slice(0, -5)) //Hello w
console.log(str.substring(0, -5)) //空字符串
console.log(str.substr(0, -5)) //空字符串
console.log(str.slice(-5, -2)) //orl
console.log(str.substring(-5, -2)) //空字符串
console.log(str.substr(-5, -2)) //空字符串
console.log(str.slice(-2, -5)) //空字符串
console.log(str.substring(-2, -5)) //空字符串
console.log(str.substr(-2, -5)) //空字符串
console.log(str.slice(5, 0)) //空字符串
console.log(str.substring(5, 0)) //Hello
console.log(str.substr(5, 0)) //空字符串
5.indexOf和lastIndexOf
前文已经介绍了根据位置获取字符串的方法,我们也可以根据字符串获取它的位置——indexOf和lastIndexOf,它们区别在于indexOf是从前往后找,而lastIndexOf是从后往前找。如果没有找到,则返回-1。这两个方法可以接受第二参数,表示开始搜索位置。
6.startsWith、endsWith、includes
startsWith、endsWith、includes都是判断是否包含某字符串的方法,返回布尔值。
includes检查整个字符串。
startsWith和endsWith分别是匹配开头和结尾是否有传入字符串。
startsWith和includes都接受第二个参数,表示起始搜索位置。
7.trim、trimLeft、trimRight
trim方法删除字符串前后所有空格。trimLeft、trimRight分别删除字符串左边空格和字符串右边空格。
8.repeat
repeat方法接受一个整数作为参数,表示字符串复制的次数,然后返回它们拼接起来的字符串。
9.padStart、padEnd
pad——填充。
padStart和padEnd分别在字符串前面和字符串后面填充指定长度的指定字符串。第一参数是填充后字符串要达到的长度,第二参数是要填充的字符串。
let str = "Hello"
console.log(str.padStart(10, "World")) //WorldHello
console.log(str.padEnd(10, "World")) //HelloWorld
10.toLowerCase、toLocaleLowerCase、toUpperCase、toLocaleUpperCase
toLowerCase用于将字符串中的所有字符转换为小写,它不受地域设置的影响,只是简单地将字符转换为小写形式。toLocaleLowerCase()不同之处在于,它会受到地域设置的影响,可能会根据当前区域设置将某些特定字符转换为小写形式。
toUpperCase、toLocaleUpperCase同上。
11.模式匹配相关方法
第一个是match,它本质上和RegExp的exec方法相同,返回匹配结果的数组形式。如果使用全局模式g,它会返回所有匹配结果的数组,否则返回一个数组,其中第一个元素是匹配到的字符串,后续元素是正则表达式中的捕获组。
let str = "To be what we are, and to become what we are capable of becoming, is the only end of life."
// 使用match匹配所有包含a的单词
let reg1 = /\b[a-zA-Z]*a[a-zA-Z]*\b/g
console.log(str.match(reg1)) // [ 'what', 'are', 'and', 'what', 'are', 'capable' ]
// 使用match匹配包含a的单词,不使用全局匹配
let reg2 = /\b[a-zA-Z]*a[a-zA-Z]*\b/
console.log(str.match(reg2))
// [
// 'what',
// index: 6,
// input: 'To be what we are, and to become what we are capable of becoming, is the only end of life.',
// groups: undefined
// ]
第二个是search,返回匹配到的索引位置,没有匹配项就返回-1。
let str = "To be what we are, and to become what we are capable of becoming, is the only end of life."
// 使用search匹配we
let reg = /we/g
console.log(str.search(reg)) // 11
第三个是replace,它使用新的字符串或函数替换正则表达式匹配的内容。
const originalString = "Hello, world! Hello, universe!";
// 替换字符串中的单个匹配项
const replacedString1 = originalString.replace("world", "friends");
console.log(replacedString1); // 输出:Hello, friends! Hello, universe!
// 使用正则表达式进行替换(只替换第一个匹配项)
const replacedString2 = originalString.replace(/Hello/, "Hi");
console.log(replacedString2); // 输出:Hi, world! Hello, universe!
// 使用正则表达式进行替换(替换所有匹配项)
const replacedString3 = originalString.replace(/Hello/g, "Hi");
console.log(replacedString3); // 输出:Hi, world! Hi, universe!
// 使用$1、$2、$3、$4等来替换匹配项
const replacedString4 = originalString.replace(/(Hello), (world)! (Hello), (universe)!/g, "$3, $4! $1, $2!");
console.log(replacedString4); // 输出:Hello, universe! Hello, world!
// 使用函数来替换匹配项
const replacedString5 = originalString.replace(/(Hello), (world)! (Hello), (universe)!/g,
function (matched, p1, p2, p3, p4, offset, original) {
console.log(matched) // 匹配到的字符串
console.log(offset) // 匹配到的字符串在原字符串中的偏移量
console.log(original) // 原字符串
return p3 + ", " + p4 + "! " + p1 + ", " + p2 + "!";
}
);
console.log(replacedString5); // 输出:Hello, universe! Hello, world!
最后一个是split,它根据传入的分隔符将字符串划分为一个数组,分隔符可以是字符串或RegExp对象。
const str="apple,banana,orange"
//以逗号作为分隔符
console.log(str.split(",")) //["apple","banana","orange"]
//限定数组大小
console.log(str.split(",",2)) //["apple","banana"]
//使用正则表达式
const text="apple orange\tbanana"
const parts=text.split(/\s+/) //匹配连续空格
console.log(parts) //["apple","orange","banana"]
12.迭代方法
字符串的原型上暴露了@@iterator方法
const str = "abc"
const str2 = str[Symbol.iterator]()
console.log(str2.next()) //{ value: 'a', done: false }
console.log(str2.next()) //{ value: 'b', done: false }
console.log(str2.next()) //{ value: 'c', done: false }
console.log(str2.next()) //{ value: undefined, done: true }
通过该迭代器,我们使用for-of遍历字符串,以及使用解构操作符结构字符串。
13.localeCompare
localeCompare比较字符串与字符串参数在字母表的顺序前后,如果字符串位于字符串参数前,则返回负值;如果相等,则返回0;如果字符串位于字符串参数后,则返回正值。
对JavaScript中与字符串相关的方法总结的更多相关文章
- JavaScript中去除字符串空格的方法
语法 string.trim() 参数值 无 返回值 类型:string 描述:返回移除头尾空格的字符串 技术细节 JavaScript版本: ECMAScript 5 去除字符串左右两端的空格,在v ...
- javascript中对字符串的操作总结
原文:javascript中对字符串的操作总结 没听过一句话吗?程序员的世界,不处理字符串就是处理数组.这是群里的一位前辈和我说的,显然这和我之前理解的DOM是javascript的核心的不同的,看了 ...
- javascript中的字符串对象和数组对象
1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...
- javascript中的字符串对象
1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...
- 如何在 JavaScript 中检查字符串是否包含子字符串?
如何在 JavaScript 中检查字符串是否包含子字符串? // var test4 = _.includes(string, substring); 该方法需要此文件 <script src ...
- 深入了解JavaScript中的Symbol的使用方法
这篇文章主要介绍了深入了解JavaScript中的Symbol的使用方法,本文针对ES6版本的JS进行讲解,需要的朋友可以参考下 Symbol 是什么? Symbols 不是图标,也不是指在代码中可以 ...
- JavaScript中Number常用属性和方法
title: JavaScript中Number常用属性和方法 toc: false date: 2018-10-13 12:31:42 Number.MAX_VALUE--1.79769313486 ...
- 总结Javascript中数组各种去重的方法
相信大家都知道网上关于Javascript中数组去重的方法很多,这篇文章给大家总结Javascript中数组各种去重的方法,相信本文对大家学习和使用Javascript具有一定的参考借鉴价值,有需要的 ...
- JavaScript中类似PHP的uniqid()方法
JavaScript中类似PHP的uniqid()方法: function generateUIDNotMoreThan1million() { return ("0000" + ...
- javascript中的字符串编码、字符串方法详解
js中的字符串是一种类数组,采用UTF-16编码的Unicode字符集,意味字符串的每个字符可用下标方式获取,而每个字符串在内存中都是一个16位值组成的序列.js对字符串的各项操作均是在对16位值进行 ...
随机推荐
- 2022-04-27:Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成。她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 hig
2022-04-27:Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成.她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 hig ...
- 2022-02-01:粉刷房子 II。 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价
2022-02-01:粉刷房子 II. 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油漆的价 ...
- ArcGIS如何自动获得随机采样点?
本文介绍基于ArcMap软件,实现在指定区域自动生成随机点的方法. 在GIS应用中,我们时常需要在研究区域内进行地理数据的随机采样:而采样点的位置往往需要在结合实际情况的前提下,用计算机随机生 ...
- Github疯传!谷歌师兄的LeetCode刷题笔记开源了!
有小伙伴私聊我说刚开始刷LeetCode的时候,感到很吃力,刷题效率很低.我以前刷题的时候也遇到这个问题,直到后来看到这个谷歌师兄总结的刷题笔记,发现LeetCode刷题都是套路呀,掌握这些套路之后, ...
- Github疯传!200本计算机经典书籍!
好书在精不在多,每一本经典书籍都值得反复翻阅,温故而知新! 下面分享几本计算机经典书籍,都是我自己看过的. 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶.欲罢不能的感觉.无论你是初学 ...
- 2023 华北分区赛 normal_snake
国赛终于解出Java题了,顺利拿下一血,思路之前也学过.继续加油 normal_snake 题目解读 @RequestMapping({"/read"}) public Strin ...
- iOS 单元测试之常用框架 OCMock 详解
一.单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了.在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西.测试的时候,往往是用模拟 ...
- Kali Sublist3r 报错解决办法
直接将Sublist3r.py中文件的内容替换为下面的即可 具体的更改的东西改了很多地方就不细说了,直接复制粘贴 如果遇到Error: Virustotal probably now is block ...
- 使用SpringBoot+React搭建一个Excel报表平台
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 Excel报表平台是一款功能强大.操作简单的系统平台,可 ...
- CF1829H Don't Blame Me题解
题意: 给定一个长度为 \(n\) 的数组,选择它的一个子序列(不一定要连续的),问有多少种选法使得它们 AND 的值的二进制表示法中有 \(k\) 个 \(1\). 思路: 这个题就是一个简单的 D ...