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


Posted in Javascript onDecember 23, 2016

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提取出来。

测试一下

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

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

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);
}

测试一下

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

大功告成。

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

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

总结

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

Javascript 相关文章推荐
一个可绑定数据源的jQuery数据表格插件
Jul 17 Javascript
Javascript动态绑定事件的简单实现代码
Dec 25 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
Aug 24 Javascript
vue实现div拖拽互换位置
Jul 29 Javascript
node Buffer缓存区常见操作示例
May 04 Javascript
webpack4之如何编写loader的方法步骤
Jun 06 Javascript
koa2+vue实现登陆及登录状态判断
Aug 15 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 Javascript
element tree树形组件回显数据问题解决
Aug 14 Javascript
Bootstrap源码解读排版(1)
Dec 23 #Javascript
简单实现JS倒计时效果
Dec 23 #Javascript
Bootstrap源码解读下拉菜单(4)
Dec 23 #Javascript
jquery dataview数据视图插件使用方法
Dec 23 #Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 #Javascript
Bootstrap源码解读按钮(5)
Dec 23 #Javascript
基于bootstrap的选择框插件icheck
Dec 23 #Javascript
You might like
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
javascript实现固定侧边栏
2021/02/09 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python实现的简单hangman游戏实例
2015/06/28 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python中常见错误及解决方法
2020/06/21 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
Final类有什么特点
2012/04/25 面试题
高校十八大报告感想
2014/01/27 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript