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 相关文章推荐
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
Jun 12 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
jquery uploadify如何取消已上传成功文件
Feb 08 Javascript
Kindeditor单独调用多图上传实例
Jul 31 Javascript
Angularjs实现下拉框联动的示例代码
Aug 22 Javascript
js 实现在2d平面上画8的方法
Oct 10 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
webpack常用构建优化策略小结
Nov 21 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
学习python的几条建议分享
2013/02/10 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
公务员个人总结
2015/02/12 职场文书
2016小学新学期寄语
2015/12/04 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python