Javascript里面最常用的6种查找字符串的方式以及它们的性能测试

在字符串中搜索子字符串,是最基本的操作之一,我们经常会遇到,我通常做的是,查看代码中的其他地方,看看其他人都做了什么,然后做同样的事情!现在,我只是想提出一些最常用的选项,以及它们之间的性能比较,以防您关心性能,以便当涉及到将来的选择时,您知道哪一个是更好的选择!代码展示下面是我在搜索字符串时经常看到的6种不同的方法: // 1. includes (introduced in ES6) var string = "string to search for substring", substring = "sea";string.includes(substring);// 2. RegExp: testvar string = "string to search for substring", expr = /sea/; // no quotes hereexpr.test(string);//3. string.searchvar string = "string to search for substring", expr = "/sea/";string.search(expr);//4. lodash: includesvar string = "string to search for substring", substring = "sea";_.includes(string, substring);// 5. string.matchvar string = "string to search for substring", expr = "/sea/";string.match(expr);// 3. string.indexOfvar string = "string to search for substring", substring = "sea";string.indexOf(substring) !== -1;性能基准测试如果你想知道,给出一个一般长度的字符串,哪个会表现得更好,regex.test是最快的,其次是string.search(libraries by ES6),第三位属于string.indexof方法:前往测试页面 → ...

July 16, 2019 · 1 min · jiezi

查找字符数组中出现次数最多的字符

给定一个字符数组,例如char[] chars = { 'a', 'b', 'b', 'b', 'b', 'c', 'a', 'a', 'a'};找出数组中出现次数最多的字符,如果存在相同次数的字符,取出现较早者。一个问题的解决方案有多种: 利用数据结构的特性,链表保证了插入顺序,Map正是我们想要的字符与出现次数对应关系的映射,代码如下,只需遍历一次 char[] chars = {'a', 'b', 'b', 'b', 'b', 'c', 'a', 'a', 'a'}; Map<Character, Integer> countMap = new LinkedHashMap<>(); Map<Character, Integer> indexMap = new LinkedHashMap<>(); int length = chars.length; // 目标字符 char target = 0; // 出现的最多次数 int maxCount = 0; for (int index = 0; index < length; index++) { char aChar = chars[index]; Integer value = countMap.get(aChar); if (value == null) { // 如果已经存在某字符 maxCount 比数组剩余待遍历元素数量还多,没必要考虑它了 if (maxCount > length - (index + 1)) { break; } countMap.put(aChar, 1); indexMap.put(aChar, index); } else { countMap.put(aChar, value += 1); if (maxCount == value) { // 出现相同次数的 char,取先在数组中出现的 // 即谁出现的次数 + 出现的 index 小 // 也可以将 value 封装成含有索引和次数的对象,那样只需声明一个 map if (indexMap.get(aChar) < indexMap.get(target)) { target = aChar; } } else if (maxCount < value) { maxCount = value; target = aChar; } } }将原数组拷贝成orderedChars然后排序,接着遍历查找orderedChars和originalChars,操作比较麻烦,不推荐,但是可以锻炼纯数组操作和“指针”的使用 ...

June 12, 2019 · 2 min · jiezi

思维导图Python中常用的8种字符串操作

文章末尾获取思维导图高清源文件 拼接字符串使用“+”可以对多个字符串进行拼接语法格式:str1 + str2 >>> str1 = "aaa">>> str2 = "bbb">>> print(str1 + str2)aaabbb需要注意的是字符串不允许直接与其他类型进行拼接,例如 >>> num = 100>>> str1 = "hello">>> print(str1 + num)Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> print(str1 + num)TypeError: can only concatenate str (not "int") to str上面这种情况我们可以将num转换为字符串再进行拼接 >>> num = 100>>> str1 = "hello">>> print(str1 + str(num))hello100这样就不会报错了 计算字符串的长度在Python中使用len()函数来计算字符串的长度语法格式:len(string) >>> str1 = "hello">>> len(str1)5>>> str2 = "你好">>> len(str2)2>>> str3 = "1111">>> len(str3)4从上面的结果我们可以看出,在默认情况下,len函数在计算字符串的长度时,无论是数字,字母还是多字节的汉字都认为是一个字符。为什么说是默认情况下呢,因为在实际开发中,可能因为我们采取的编码不同,字符串实际所占的字节数也不同。 ...

May 5, 2019 · 2 min · jiezi

PHP细节:foreach、(汉子)字符串反转、isset,empty用法区别以及0、‘’、null之间关系

一、foreach第一题://1.for循环执行几次//for($i=0;$i=1;$i++){// echo $i;//}$i==1条件很成立,死循环for($i=0;$i==1;$i++){ echo $i;}由于条件$i==1条件不成立,所以for循环不执行第二题:class SomeClass{ private $properties = []; public $j; public function __set($name, $value) { $this->properties[$name] = $value; } public function __get($name) { return $this->properties[$name]; }}$obj = new SomeClass();$obj->name = ‘phpgod’;$obj->age = 2;$obj->gender = ‘male’;//$obj->j=0;$l = null;var_dump($obj->name);//output:string(6) “phpgod"var_dump($obj->j); //nullvar_dump(isset($obj->j));//由于$j没有赋值,为空null,所以返回false//var_dump($obj->properties);var_dump(isset($obj->name));//私有或者保护属性不能被调用,false//output:bool(false),你的答案对了吗?为什么第三题:foreach和取地址运算符&$arr = [1,2,3,4,5,8];foreach($arr as &$v) { //nothing todo. echo $v.’<br />’;}//&是取地址运算符,$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址var_dump($arr); //1,2,3,4,5,8foreach($arr as &$v) { //nothing todo. var_dump($arr); echo $v.’<br />’;}var_export($arr); //1,2,3,4,5,5&是取地址运算符,$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址参考文档1:对数组两次foreach的使用陷阱PHP foreach原理详解二、(汉子)字符串反转包含汉字字符串乱码PHP面试题,题目很短,也很常见,但更容易出错,题目如下如何实现字符串翻转? 第一反应,当然是strrev函数啦,这么容易的题目还放在面试里考,真不嫌麻烦啊?但是看了网上的答案后,发现自己错了~~~ strrev函数对英文很好用,直接可以实现字符串翻转,但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的。还好PHP提供了mb_类的函数实现不同编码、不同语言之间的相互转换等操作。下面是我写的PHP字符串翻转函数(mb_类的函数需要开启一个mb_string实现)。解决方案代码:<?phpheader(“content-type:text/html;charset=utf-8”);/** strrev() 函数反转字符串。 语法 strrev(string) 参数 描述 string 必需。规定要反转的字符串。 *//**此函数的作用是反转中文字符串mb_strlen() 获取字符的长度mb_substr() 获取字符的单个元素krsort() 按照键值逆序排序数组,对关联数组按照键名进行降序排序Array ( [8] => 国 [7] => 中 [6] => h [5] => s [4] => i [3] => l [2] => g [1] => n [0] => E ) English中国->国中hsilgnE(ksort()对关联数组按照键名进行升序排序)implode() 将数组拼接为字符串explode() 使用字符串分隔字符串 */function str_rev_gb($str){ //判断输入的是不是utf8类型的字符,否则退出 if(!is_string($str)||!mb_check_encoding($str,‘UTF-8’)){ exit(“输入类型不是UTF8类型的字符串”); } $array=array(); //将字符串存入数组 $l=mb_strlen($str,‘UTF-8’);//在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算 for($i=0;$i<$l;$i++){ $array[]=mb_substr($str,$i,1,‘UTF-8’); } //反转字符串 krsort($array); //拼接字符串 $string=implode($array); return $string;}$str1 = “Englist”;$str2 = “English中国”;$str3 = “Eng中lish国”;$str4 = “中华人民共和国”;echo ‘直接用PHP自带strrev函数反转:’.’<br />’;echo $str1.”->".strrev($str1)."<br>";echo $str2."->".strrev($str2)."<br>";echo $str3."->".strrev($str3)."<br>";echo $str4."->".strrev($str4)."<br>";echo ‘<br />’;echo $str1."->".str_rev_gb($str1)."<br>";echo $str2."->".str_rev_gb($str2)."<br>";echo $str3."->".str_rev_gb($str3)."<br>";echo $str4."->".str_rev_gb($str4)."<br>";运行结果:直接用PHP自带strrev函数反转:Englist->tsilgnEEnglish中国->��學�hsilgnEEng中lish国->���hsil���gnE中华人民共和国->��匒居呰溺䎍學�Englist->tsilgnEEnglish中国->国中hsilgnEEng中lish国->国hsil中gnE中华人民共和国->国和共民人华中需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。参考文档:PHP 实现字符串翻转(包含中文汉字)参考:// 处理汉字function strReverseMb($str) { $revStr = ‘’; if (is_string($str) && mb_check_encoding($str, “UTF-8”)) { $len = mb_strlen($str); for ($i = $len-1; $i>=0; $i–) { $revStr .= mb_substr($str, $i, 1, “UTF-8”); } } return $revStr;}php官方文档strrev函数最下面给出了支持utf-8的方案:function utf8_strrev($str){ preg_match_all(’/./us’, $str, $ar); return join(’’,array_reverse($ar[0]));}三、isset、empty、if用法区别以及0、‘’、null之间关系3.1 empty用法bool empty ( mixed var)如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、“0”、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE3.2 isset()isset – 检测变量是否设置描述bool isset ( mixed var [, mixed var [, …]])如果 var 存在则返回 TRUE,否则返回 FALSE。如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(“0”)并不等同于 PHP 的 NULL 常数。注意:如果变量不存在(或者unset()释放一个变量后),isset()和empty()都不会报错;is_null(),is_numeric(),if会报错is_numeric 检测变量是否为数字或数字字符串;is_null正好是isset的反结果,我们可以把它看成是!isset,是isset的一个逆操作。警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。用法:注意defined(""),如果没有双引号,则会警告:undefined constant websiteif(defined(“website”)){ echo “true”;}else{ echo “false”;}3.3 0、‘’、null之间相等关系if(’’ == null && ’’ == 0 && null == 0 && 0 ==‘0’) echo ‘if’;if(’’ == ‘0’ || null == ‘0’ ) echo ‘if2’;结论:’’ ,null , 0 ,‘0’互相相等;’’,null不等于'0’ ...

March 8, 2019 · 2 min · jiezi

leetcode讲解--647. Palindromic Substrings

题目Given a string, your task is to count how many palindromic substrings in this string.The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.Example 1:Input: “abc"Output: 3Explanation: Three palindromic strings: “a”, “b”, “c”.Example 2:Input: “aaa"Output: 6Explanation: Six palindromic strings: “a”, “a”, “a”, “aa”, “aa”, “aaa”.Note:The input string length won’t exceed 1000.题目地址讲解题目的意思是:找出字符串中所有回文串,不同位置的回文串不算同一个。这道题我只能想到从左到右按照从1到s.length的长度依次扫N遍。而且这还不包括判断是否是回文串这一步所用的时间。而判断回文串显然是可以有重复计算的子问题的,所以要用到动态规划。依旧是用规模从大到小的备忘录递归解法。这道题做下来还是挺轻松的,我发现我越来越喜欢用递归了,对递归的掌控力也变强了。java代码class Solution { private boolean[][] dp; public int countSubstrings(String s) { int result=0; dp = new boolean[s.length()][s.length()]; for(int i=0;i<s.length();i++){ for(int j=0;j+i<s.length();j++){ dynamicProgramming(s, j, j+i); } } for(int i=0;i<dp.length;i++){ for(int j=0;j<dp[i].length;j++){ // System.out.println(i+”,"+j+"="+dp[i][j]); if(dp[i][j]){ result++; } } } return result; } private boolean dynamicProgramming(String s, int left, int right){ if(left==right){ dp[left][right] = true; return dp[left][right]; } if(dp[left][right]){ return dp[left][right]; } if(s.charAt(left)!=s.charAt(right)){ dp[left][right] = false; return dp[left][right]; }else{ if(right-left>1){ dp[left][right] = dynamicProgramming(s, left+1, right-1); return dp[left][right]; }else{ dp[left][right] = true; return dp[left][right]; } } }} ...

January 9, 2019 · 1 min · jiezi

leetcode讲解--917. Reverse Only Letters

题目Given a string S, return the “reversed” string where all characters that are not a letter stay in the same place, and all letters reverse their positions.Example 1:Input: “ab-cd"Output: “dc-ba"Example 2:Input: “a-bC-dEf-ghIj"Output: “j-Ih-gfE-dCba"Example 3:Input: “Test1ng-Leet=code-Q!“Output: “Qedo1ct-eeLg=ntse-T!“Note:S.length <= 10033 <= S[i].ASCIIcode <= 122S doesn’t contain \ or “讲解字符串操作,将字母reverse,其他字符保持在原来位置上。我使用了两个数组,一个指针java代码class Solution { public String reverseOnlyLetters(String S) { char[] c = S.toCharArray(); char[] result = S.toCharArray(); int index = result.length-1; for(int i=0;i<c.length;i++){ if(c[i]>=‘a’ && c[i]<=‘z’ || c[i]>=‘A’ && c[i]<=‘Z’){ while(index>=0 && !(result[index]>=‘a’ && result[index]<=‘z’ || result[index]>=‘A’ && result[index]<=‘Z’)){ index–; } if(index>=0) result[index–] = c[i]; } } return String.valueOf(result); }} ...

January 8, 2019 · 1 min · jiezi

leetcode讲解--824. Goat Latin

题目A sentence S is given, composed of words separated by spaces. Each word consists of lowercase and uppercase letters only.We would like to convert the sentence to “Goat Latin” (a made-up language similar to Pig Latin.)The rules of Goat Latin are as follows:If a word begins with a vowel (a, e, i, o, or u), append “ma” to the end of the word.For example, the word ‘apple’ becomes ‘applema’.If a word begins with a consonant (i.e. not a vowel), remove the first letter and append it to the end, then add “ma”.For example, the word “goat” becomes “oatgma”.Add one letter ‘a’ to the end of each word per its word index in the sentence, starting with 1.For example, the first word gets “a” added to the end, the second word gets “aa” added to the end and so on.Return the final sentence representing the conversion from S to Goat Latin. Example 1:Input: “I speak Goat Latin"Output: “Imaa peaksmaaa oatGmaaaa atinLmaaaaa"Example 2:Input: “The quick brown fox jumped over the lazy dog"Output: “heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"Notes:S contains only uppercase, lowercase and spaces. Exactly one space between each word.1 <= S.length <= 150.题目地址讲解这个题目看着挺简单的,但用代码写出来还挺长的。java代码class Solution { public String toGoatLatin(String S) { StringBuilder sb = new StringBuilder(); StringBuilder a = new StringBuilder(); char[] vowel = {‘a’, ’e’, ‘i’, ‘o’, ‘u’}; int wordCount = 1; for(int i=0;i<S.length();i++){ boolean isVowel = false; for(char c:vowel){ if(Character.toLowerCase(S.charAt(i))==c){ a.append(‘a’); int index = i; while(i<S.length() && S.charAt(i)!=’ ‘){ i++; } sb.append(S.substring(index, i)+“ma”); sb.append(a); if(i<S.length()){ sb.append(’ ‘); } isVowel = true; break; } } if(i<S.length() && !isVowel){ int index = i; while(i<S.length() && S.charAt(i)!=’ ‘){ i++; } a.append(‘a’); sb.append(S.substring(index+1, i)+S.charAt(index)+“ma”); sb.append(a); if(i<S.length()){ sb.append(’ ‘); } } } return sb.toString(); }} ...

January 8, 2019 · 2 min · jiezi

JavaScript字符串操作方法大全,包含ES6方法

一、charAt()返回在指定位置的字符。var str=“abc"console.log(str.charAt(1))//a二、charCodeAt()返回在指定的位置的字符的 Unicode 编码。var str=“abc” console.log(str.charCodeAt(1))//98三、concat()连接字符串。 var a = “abc”; var b = “def”; var c = a.concat(b); console.log(c);//abcdef四、indexOf()检索字符串。indexOf() 方法对大小写敏感!var str=“Hello world!“console.log(str.indexOf(“Hello”))//0console.log(str.indexOf(“World”))//-1console.log(str.indexOf(“world”))///6五、match()match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。var str=“1 abc 2 def 3"console.log(str.match(/\d+/g))//123六、replace()replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。var str=“abc Def!“console.log(str.replace(/abc/, “CBA”))//CBA Def!七、search()search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。要执行忽略大小写的检索,请追加标志 i。如果没有找到任何匹配的子串,则返回 -1。var str=“abc DEF!“console.log(str.search(/DEF/))//4八、slice()提取字符串的片断,并在新的字符串中返回被提取的部分。stringObject.slice(start,end);start :要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。end:紧接着要抽取的片段的结尾的下标。若未指定此参数,则要提取的子串包括 start 到原字符串结尾的字符串。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。var str=“abc def ghk"console.log(str.slice(6))//f ghk九、split()把字符串分割为字符串数组。var str=“abc def ghi jkl” console.log(str.split(” “))//[“abc”, “def”, “ghi”, “jkl”]console.log(str.split(””) )//[“a”, “b”, “c”, " “, “d”, “e”, “f”, " “, “g”, “h”, “i”, " “, “j”, “k”, “l”]console.log(str.split(” “,3))//[“abc”, “def”, “ghi”]十、toLocaleLowerCase()把字符串转换为小写。var str=“ABC def!“console.log(str.toLocaleLowerCase())//abc def!十一、toLocaleUpperCase()把字符串转换为大写。var str=“ABC def!“console.log(str.toLocaleUpperCase())//ABC DEF!十二、toLowerCase()把字符串转换为小写。var str=“ABC def!“console.log(str.toLowerCase())//abc def!十三、toUpperCase()把字符串转换为大写。var str=“ABC def!“console.log(str.toUpperCase())//ABC DEF!十四、substr()从起始索引号提取字符串中指定数目的字符。stringObject.substr(start,length)。start:必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。length:可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。var str=“abc def"console.log(str.substr(2))//c defconsole.log(str.substr(2,4))// c de 十五、substring()提取字符串中两个指定的索引号之间的字符。stringObject.substring(start,stop)。start :必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。stop :可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。如果省略该参数,那么返回的子串会一直到字符串的结尾。var str=“abc def"console.log(str.substring(2))//c defconsole.log(str.substring(2,4))// c 相同点:如果只是写一个参数,两者的作用都一样:都是是截取字符串从当前下标以后直到字符串最后的字符串片段。substr(startIndex);substring(startIndex);var str = ‘123456789’;console.log(str.substr(2)); // “3456789"console.log(str.substring(2)) ;// “3456789"不同点:第二个参数substr(startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串);substring(startIndex, endIndex): 第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串,‘含头不含尾’)。console.log(“123456789”.substr(2,5)); // “34567"console.log(“123456789”.substring(2,5)) ;// “345"ES6新增的操作字符串的方法一、codePointAt()let s = ‘????a’;s.codePointAt(0) // 134071s.codePointAt(1) // 57271s.codePointAt(2) // 97codePointAt方法的参数,是字符在字符串中的位置(从 0 开始)。上面代码中,JavaScript 将“????a”视为三个字符,codePointAt 方法在第一个字符上,正确地识别了“????”,返回了它的十进制码点 134071(即十六进制的20BB7)。在第二个字符(即“????”的后两个字节)和第三个字符“a”上,codePointAt方法的结果与charCodeAt方法相同。二、String.fromCodePoint()ES5 提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别 32 位的 UTF-16 字符(Unicode 编号大于0xFFFF)。String.fromCharCode(0x20BB7)// ““上面代码中,String.fromCharCode不能识别大于0xFFFF的码点,所以0x20BB7就发生了溢出,最高位2被舍弃了,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。ES6 提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。String.fromCodePoint(0x20BB7)// “????“String.fromCodePoint(0x78, 0x1f680, 0x79) === ‘x\uD83D\uDE80y’// true三、字符串的遍历器接口 for offor (let codePoint of ‘abc’) { console.log(codePoint)}// “a”// “b”// “c"除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。四、at()at方法可以识别Unicode 编号大于0xFFFF的字符,返回正确的字符。‘abc’.at(0)//“a”‘吉’.at(0)//“吉"五、normalize()许多欧洲语言有语调符号和重音符号。为了表示它们,Unicode 提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如O(u004F)和(u030C)合成Ǒ(u004Fu030C)。这两种表示方法,在视觉和语义上都等价,但是 JavaScript 不能识别。’\u01D1’===’\u004F\u030C’ //false ‘\u01D1’.length // 1’\u004F\u030C’.length // 2上面代码表示,JavaScript 将合成字符视为两个字符,导致两种表示方法不相等。ES6 提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。’\u01D1’.normalize() === ‘\u004F\u030C’.normalize()// true六、includes(), startsWith(), endsWith()传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6 又提供了三种新方法。includes():返回布尔值,表示是否找到了参数字符串。startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。let s = ‘Hello world!’; s.startsWith(‘Hello’) // trues.endsWith(’!’) // trues.includes(‘o’) // true这三个方法都支持第二个参数,表示开始搜索的位置。let s = ‘Hello world!’; s.startsWith(‘world’, 6) // trues.endsWith(‘Hello’, 5) // trues.includes(‘Hello’, 6) // false上面代码表示,使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束。七、repeat()repeat方法返回一个新字符串,表示将原字符串重复n次。‘x’.repeat(3) // “xxx”‘hello’.repeat(2) // “hellohello”’na’.repeat(0) // ““参数如果是小数,会被取整。’na’.repeat(2.9) // “nana"如果repeat的参数是负数或者Infinity,会报错。’na’.repeat(Infinity)// RangeError’na’.repeat(-1)// RangeError八、padStart(),padEnd()ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。‘x’.padStart(5, ‘ab’) // ‘ababx’‘x’.padStart(4, ‘ab’) // ‘abax’‘x’.padEnd(5, ‘ab’) // ‘xabab’‘x’.padEnd(4, ‘ab’) // ‘xaba’上面代码中,padStart和padEnd一共接受两个参数,第一个参数用来指定字符串的最小长度,第二个参数是用来补全的字符串。如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。‘xxx’.padStart(2, ‘ab’) // ‘xxx’‘xxx’.padEnd(2, ‘ab’) // ‘xxx’如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。‘abc’.padStart(10, ‘0123456789’)// ‘0123456abc’如果省略第二个参数,默认使用空格补全长度。‘x’.padStart(4) // ’ x’‘x’.padEnd(4) // ‘x ‘padStart的常见用途是为数值补全指定位数。下面代码生成 10 位的数值字符串。‘1’.padStart(10, ‘0’) // “0000000001”‘12’.padStart(10, ‘0’) // “0000000012”‘123456’.padStart(10, ‘0’) // “0000123456"另一个用途是提示字符串格式。‘12’.padStart(10, ‘YYYY-MM-DD’) // “YYYY-MM-12”‘09-12’.padStart(10, ‘YYYY-MM-DD’) // “YYYY-09-12"九、matchAll()matchAll方法返回一个正则表达式在当前字符串的所有匹配。十、字符串模板模板字符串(template string)是增强版的字符串,用反引号()标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。-----字符串模板,工作中用到比较多。// 普通字符串In JavaScript ‘\n’ is a line-feed.// 多行字符串In JavaScript this is not legal.console.log(string text line 1string text line 2);// 字符串中嵌入变量let name = "Bob", time = "today";Hello ${name}, how are you ${time}?上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。let greeting = `Yo` World!;如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。$('#list').html(<ul> <li>first</li> <li>second</li></ul>);上面代码中,所有模板字符串的空格和换行,都是被保留的,比如&lt;ul&gt;标签前面会有一个换行。如果你不想要这个换行,可以使用trim方法消除它。$('#list').html(<ul> <li>first</li> <li>second</li></ul>.trim());模板字符串中嵌入变量,需要将变量名写在${}之中。function authorize(user, action) { if (!user.hasPrivilege(action)) { throw new Error( // 传统写法为 // 'User ' // + user.name // + ' is not authorized to do ' // + action // + '.' User ${user.name} is not authorized to do ${action}.); }}大括号内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。let x = 1;let y = 2;${x} + ${y} = ${x + y}// "1 + 2 = 3"${x} + ${y * 2} = ${x + y * 2}// "1 + 4 = 5"let obj = {x: 1, y: 2};${obj.x + obj.y}// "3"模板字符串之中还能调用函数。function fn() { return "Hello World";} foo ${fn()} bar// foo Hello World bar如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法。如果模板字符串中的变量没有声明,将报错。// 变量place没有声明let msg = Hello, ${place};// 报错由于模板字符串的大括号内部,就是执行 JavaScript 代码,因此如果大括号内部是一个字符串,将会原样输出。Hello ${‘World’}// "Hello World"模板字符串甚至还能嵌套。const tmpl = addrs =&gt; <table> ${addrs.map(addr => &lt;tr&gt;&lt;td&gt;${addr.first}&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;${addr.last}&lt;/td&gt;&lt;/tr&gt; ).join(’’)} </table>`;PS: 文中ES6的内容,主要来自于阮一峰的《ES6标准入门》。JavaScript常用数组操作方法,包含ES6方法 ...

October 7, 2018 · 3 min · jiezi