JS中with的替代方法与String中的正则方法详解

发布时间 - 2026-01-10 22:02:59    点击率:

with 语法

在代码中,要执行这么一个函数

 function computeExpression(exp, scope) {
 try {
  with (scope) {
   return eval(exp);
  }
 } catch (e) {
  console.error('ERROR', e);
 }
}

要求在scope 作用域中执行,什么意思???

比如

scope = {a:10,b:5};
exp = a*b;

要求计算结果为15,这种情况,常规情况下要使用 with语法。

但是:

js的解释器需要检查with块中的变量是否属于with包含的对象,这将使with语句执行速度大大下降,并且导致js语句很难被优化。

在严格模式中,with语法是被禁用的。

而我使用ES6语法来编写这个库的,默认启用了严格模式了。所以不得已,自己模拟了一个with 的语法。

先看代码

function replaceWith(scopeName, exp) {
 exp = " " + exp.trim();
 let quickRegex = /([\s\+\-\*\/%&\|\^!\*~]\s*?)([a-zA-Z_$][a-zA-Z_$0-9]*?)/g;
 exp = exp.replace(quickRegex, (a, b, c) => {
  return b + scopeName + '.' + c;
 });
 return exp;
}

首先把首位的空格全部去掉,为了和后面的统一,在开头加上一个空格。

第一个正则匹配出犹如"t.e==0 ? f : d"的表达式中的变量会被作为c提取出来,符号作为 b提取出来。

测试一下

现在已经可以返回一个表达式了,改装一下,让表达式直接在里面执行

function replaceWith(scope, exp) {
 exp = " " + exp.trim();
 let quickRegex = /([\s\+\-\*\/%&\|\^!\*~]\s*?)([a-zA-Z_$][a-zA-Z_$0-9]*?)/g;
 exp = exp.replace(quickRegex, (a, b, c) => {
  return b + 'scope.' + c;
 });
 let func = new Function("scope", "return " + exp);
 return func(scope);
}

测试一下

大功告成。

可能中间正则写的不好,还有其他不严密的地方,欢迎园友补充。

String 原型上的正则方法

好久都没怎么写过大量代码了,看到 Sring.prototype.split(//); 这个正则表达式,竟然把分割符号都给加到数组中了,很惊讶,在MDN上学了一下。顺便做个整理,算是补充吧。

String.prototype.split(separator,[limit])

separator:指定用来分割字符串的字符(串)。separator 可以是一个字符串或正则表达式。 如果忽略 separator,则返回整个字符串的数组形式。如果 separator 是一个空字符串,则 str 将会把原字符串中每个字符的数组形式返回。

limit一个整数,限定返回的分割片段数量。split 方法仍然分割每一个匹配的 separator,但是返回的数组只会截取最多 limit 个元素。

当找到一个 seperator 时,separator 会从字符串中被移除,返回存进一个数组当中的子字符串。如果忽略 separator 参数,则返回的数组包含一个元素,该元素是原字符串。如果 separator 是一个空字符串,则 str 将被转换为由字符串中字符组成的一个数组。

注意:

Note: 当字符串为空时,split 返回一个包含一个空字符串的数组,而不是一个空数组。

如果 separator 是一个正则表达式,且包含捕获括号(capturing parentheses),则每次匹配到 separator 时,捕获括号匹配的结果将会插入到返回的数组中。

var myString = "hello world";
var splits = myString.split(();

console.log(splits);

输出

["hello world"]

var myString = "Hello 1 word. Sentence number 2.";
var splits = myString.split(/(\d)/);

console.log(splits);

输出

Hello ,1, word. Sentence number ,2,.

String.prototype.replace()

这个方法开始已经用到,就不再介绍。

String.prototype.match(Regex)

当字符串匹配到正则表达式(regular expression)时,match() 方法会提取匹配项。

如果正则表达式没有 g 标志,返回和 RegExp.exec(str) 相同的结果。而且返回的数组拥有一个额外的 input 属性,该属性包含原始字符串。另外,还拥有一个 index 属性,该属性表示匹配结果在原字符串中的索引(以0开始)。

"1aef2af3ef4 5".match(/[a-z]*(\d)/)

输出

["1", "1"]

如果正则表达式包含 g 标志,则该方法返回一个包含所有匹配结果的数组。如果没有匹配到,则返回 null。

注意,如果加g, 则分组无用

"1aef2af3ef4 5".match(/[a-z]*(\d)/g)

输出

["1", "aef2", "af3", "ef4", "5"]

String.prototype.search(Regex)

search() 方法执行一个查找,看该字符串对象与一个正则表达式是否匹配。

如果匹配成功,则 search() 返回正则表达式在字符串中首次匹配项的索引。否则,返回 -1。

类似于正则表达式的 test 方法 。

"aeg56".search(/[a-z]\d+/)

输出

2

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


# js  # string  # 正则表达式  # with  # 替代方法  # 正则  # 深入浅析javascript函数中with  # 浅谈js中startsWith 函数不能在任何浏览器兼容的问题  # javascript之with的使用(阿里云、淘宝使用代码分析)  # 理解javascript中的with关键字  # Javascript中实现String.startsWith和endsWith方法  # javascript中with()方法的语法格式及使用  # javascript自定义startWith()和endWith()的两种方法  # Vue js with语句原理及用法解析  # 是一个  # 空字符串  # 测试一下  # 第一个  # 首次  # 很难  # 将会  # 最多  # 都没  # 而不  # 只会  # 而我  # 如果没有  # 将被  # 大功告成  # 做个  # 这种情况  # 中了  # 在里面 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何基于云服务器快速搭建网站及云盘系统?  中国移动官方网站首页入口 中国移动官网网页登录  Laravel Fortify是什么,和Jetstream有什么关系  如何在Windows 2008云服务器安全搭建网站?  如何在万网ECS上快速搭建专属网站?  如何在橙子建站上传落地页?操作指南详解  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何快速搭建自助建站会员专属系统?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  网站优化排名时,需要考虑哪些问题呢?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  微信小程序 input输入框控件详解及实例(多种示例)  如何用AWS免费套餐快速搭建高效网站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Windows Hello人脸识别突然无法使用  如何在景安云服务器上绑定域名并配置虚拟主机?  如何快速登录WAP自助建站平台?  如何登录建站主机?访问步骤全解析  ,怎么在广州志愿者网站注册?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Python进程池调度策略_任务分发说明【指导】  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel定时任务怎么设置_Laravel Crontab调度器配置  详解阿里云nginx服务器多站点的配置  高性价比服务器租赁——企业级配置与24小时运维服务  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何用狗爹虚拟主机快速搭建网站?  黑客入侵网站服务器的常见手法有哪些?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel如何与Pusher实现实时通信?(WebSocket示例)  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何快速生成可下载的建站源码工具?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何安全更换建站之星模板并保留数据?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?