前言

小伙伴们大家好。前面我们分享了一篇关于对象操作的几个Symbol的内置属性。比如实例检测的Symbol.hasInstance,对象类型转换的Symbol.toPrimitive和检测数据类型的Symbol.toStringTag。这几个都是跟对象操作相关的。接下来再分享几个跟字符串操作相关的Symbol内置属性:Symbol.match、Symbol.replace、Symbol.search和Symbol.split。

Symbol.match

相信大家对String.match()这个函数或多或少都用到过,而我们平时使用时,一般会用它来匹配一个字符串或者一个正则表达式。也就是说我们在使用一般会传递一个字符串或者一个正则表达式作为match函数的参数。不知有没有小伙伴发现:当我们按住ctrl再用鼠标单击match函数后会跳转到match函数的定义,其中源码是这样的

/*** Matches a string or an object that supports begin matched against, and returns an array* containing the results of that search, or null if no matches are foung.* @param matcher An object that supports begin matched against.*/
match(matcher: { [Symbol.match](string: string): RegExpMatchArray | null; }): RegExpMatchArray | null;
  • 其中注释的大概意思就是:匹配一个字符串或者对象,如果匹配到了就返回一个包含了查询结果的数组,否则返回null。
  • 而从match的定义我们也能看的出:其参数matcher是一个对象,这个对象中有个[Symbol.match] (string: string)函数,返回值为数组或null。
  • 也就是说它的参数除了是我们以前常用的字符串或者正则表达式外,还可以是一个对象。对于字符串和正则表达式来说,其内部的匹配逻辑,我们是看不到的,更没办法去修改。而Symbol.match这属性就为我们开放了这个接口,让我们开发者可以自行定义内部的匹配逻辑。所以当我们给match函数传递了一个对象作为参数,并且该对象中存在[Symbol.match] (string: string)函数时,该函数的返回值将作为匹配的结果。看下面一个小栗子:
let obj = {[Symbol.match](str){return str//自定义匹配逻辑}
}
'hello'.match(obj);//hello
'world'.match(obj);//world

上面的代码中,我们直接将字符串返回没有做任何处理,所以结果永远都是匹配的。这样如果业务需要我们就可以在return str这里做一些我们自己的逻辑处理了。

这里我们简单演示了一下如何使用Symbol.match自定义匹配逻辑,正常开发中还需根据自己的业务需要来处理。关于Symbol.match就介绍到这里了。

Symbol.replace

Symbol.replace也是一个跟字符串操作相关的属性,从名称上看我们也应该能够猜的到,这个属性是跟字符串替换的replace函数相关的。同样我们也来看一下replace的源码定义:

/*** Replaces text in a string, using an object that supports replacement within a stirng.* @param searchValue A object can search for and replace matches within a string.* @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.*/
replace(searchValue: { [Symbol.replace](string: string, replaceValue: string): string; }, replaceValue:string): string;

这里我们同样也看到了Symbol.replace,跟Symbol.match一样,也是为我们开放的对外接口,让我们能够实现自定义替换逻辑,这里就不再过多赘述,直接来看个小栗子吧:

let obj = {[Symbol.replace](searchValue, replaceValue){let newStr = '';searchValue.split(' ').forEach(item=>{newStr += item[0];})return newStr;}
}
'hello world and Javascript'.replace(obj, '');//hwaJ

上面代码我们实现了一个获取每个单词首字母并组成一个新字符串的逻辑。同match方法一样,点前面的字符串就是传给match或replace的第一个参数。掌握了这个小技巧是不是干起事来又方便了很多,想干嘛就干嘛了。

Symbol.search

接下来要说的是字符串中的search函数,该函数用于在给定的字符串中查找一个子串,并把匹配到的第一个子串的索引返回。还是先来看下源码定义

/*** Finds the first substring match in a regular expression in search.* @param searcher An object which supports searching within a string.*/
search(searcher: { [Symbol.search](string: string):number; }): number;

这里我们看到了Symbol.search,不用想这一定也是给我们开的小灶了,这里也不多说了,直接看例子吧:

let obj = {[Symbol.search](str){return str.split(' ');}
}
'hello world and hello javascript'.search(obj);//['hello','world','and','hello','javascript']

上面代码实现了一个简单的将字符串以空格分隔返回一个数组的小案例,当然这只是为了展示Symbol.search的用法,并没有实际意义,反而是多次一举。实际逻辑还要根据自己的业务需要来编写。

Symbol.split

关于字符串操作的最后一个属性了。相信大家看了前面三个后,基本套路已经清晰了,无非也是针String的split函数为我们开的小灶了。

/*** Split a string into substrings using the specified separator and return them as an array.* @param spliter An object that can split a string.* @param limit A value used to limit the number of elements returned in the array.*/
split(spliter: { [Symbol.split](string: string, limit?: number): string[]; }, limit?: number): string[];

其用法跟前面3个是一样的,至于内部的业务逻辑可以根据情况自己随便定义,这里就不再做案例展示了。

总结

有掌握了4个新知识,原来字符串还可以这么玩。感兴趣的小伙伴快去试一下吧,今天的分享就到这里了。

喜欢的小伙伴欢迎点赞留言加关注哦!

Symbol - 看似平凡的Symbol其实我们每天都在用 - 字符串操作相关推荐

  1. Symbol - 看似平凡的Symbol其实我们每天都在用 - 对象操作

    前言 小伙伴们大家好.今天继续分享Symbol相关的小知识.相信小伙伴们对instanceof,Object.prototype.toString,Number({}),String({})这些都不陌 ...

  2. 世界上最神奇的数字:142857,看似平凡的数字,为什么说他最神奇呢?——The world's most amazing number: 142857...

    世界上最神奇的数字:142857,看似平凡的数字,为什么说他最神奇呢? 我们把它从1乘到6看看 142857 X 1 = 142857 142857 X 2 = 285714 142857 X 3 = ...

  3. 计算机专业可以考天文学研究生吗,天文学专业强势高校来袭 看似冷门考生却挤破头都想去...

    原标题:天文学专业强势高校来袭 看似冷门考生却挤破头都想去 有这样一个专业,听起来让人"望尘莫及",它就是"天文学".提到天文,人们可能都会联想到宇宙" ...

  4. Office Word 公式乱码解决方案 symbol字体安装文件 symbol.ttf下载

    Office的公式变成了乱码,解决方案如下: 下载symbol字体 ,下载地址如下 symbol.ttf字体文件Office公式乱码解决方案-专业指导文档类资源-CSDN下载 安装字体. 重新启动Of ...

  5. undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法

    Linux下编译程序时,经常会遇到"undefined reference to XXX" 报错,或者运行时出现undefined symbol:xxxx报错. 这里总结一些可能的 ...

  6. 编译库文件时报错move_base: symbol lookup error: undefined symbol:

    Q:编译库文件时报错/opt/ros/kinetic/lib/move_base/move_base: symbol lookup error: /home/xjl/deepDisk/ubuntu/f ...

  7. Cannot resolve symbol ‘NotBlank‘ Cannot resolve symbol ‘Email‘ Cannot resolve symbol ‘NotEmpty‘

    @Validated数据检验出现问题 没有添加依赖 <dependency><groupId>org.springframework.boot</groupId>& ...

  8. shouldoverrideurlloading为什么有时候不走_心理学:为什么很多看似不般配的人,往往都能走到最后?...

    每天耕耘最有趣.最实用的心理学 俗话说:不是一家人,不进一家门.很多时候两个人之所以能够在一起,是因为他们之间有很多相似的地方. 例如相同的价值观.兴趣爱好.着装搭配.人生目标等等,这些相似性就像磁铁 ...

  9. 氮化镓充电器哪家做得好_这颗国产器看似简单:每个氮化镓充电器都少不了

    充电头网在OPPO 50W饼干氮化镓快充发布会当天便这款产品其进行了详细的拆解.据充电头网分析得知,这款充电器输入端采用了一颗来自深圳市沃尔德实业有限公司的软桥WRMSB40M(沃尔德已取得" ...

最新文章

  1. java phantomjd linux_linux安装phantomjs
  2. 演进式数据库开发技术的障碍
  3. pythonisalpha函数计算公式_常用python实现.ipynb
  4. Apache——启动错误:[Cannot load modules/mod_actions.so into server]解决方案
  5. 提升领导力 六商是基础
  6. 【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)
  7. 计算机面试的时候写过的代码,程序员悲催瞬间:来之不易的美团面试,我尽然挂了(还原真实场景)...
  8. zoj 1366 Cash Machine
  9. sql学习之笔记(时间)季度的第一天
  10. 基础知识巩固五(问题)
  11. 备战秋招之数电知识查漏补缺
  12. 微信公众号 语音转文字api_微信语音快速转文字功能,方便实用
  13. Python 透视表
  14. C#串口编程基础入门
  15. 【NOIP2018】D2T2 填数游戏
  16. 在Excel中按条件筛选数据并存入新的表
  17. 4、综合布线系统的施工教程讲解
  18. 跳蚤市场手绘海报模板
  19. 融合通信,深化应用—中兴通讯新一代电力调度数据网络解决方案
  20. 游戏编辑器制作(2)

热门文章

  1. 做网站怎样抓住搜索引擎规则
  2. python编写程序公式计算s_python pandas库和stats库计算偏度和峰度(附程序)
  3. PAT 乙级 1068  万绿丛中一点红
  4. 服务器ping显示不是内部,如何解决ping不是内部或外部命令问题_网站服务器运行维护,ping,内部,外部,命令...
  5. 小黄衫获得感想及经验总结
  6. phpstudy不能启动mysql_phpStudy启动后为什么MYSQL无法启动
  7. ceph cluster client(RBD)
  8. 自定义浏览器起始页、主页和标签页(html+css)
  9. 恋词题源报刊Unit1
  10. 常见的百度云搜索引擎入口合集