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 相关文章推荐
javascript 写类方式之十
Jul 05 Javascript
jquery ready函数源代码研究
Dec 06 Javascript
jquery 表单取值常用代码
Dec 22 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
Node.js操作mysql数据库增删改查
Mar 30 Javascript
Vue-Router的使用方法
Sep 05 Javascript
layui 解决form表单点击无反应的问题
Oct 25 Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 Javascript
原生js实现日历效果
Mar 02 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读取msn上的用户信息类
2008/12/05 PHP
php 操作调试的方法
2012/07/12 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
vue中 v-for循环的用法详解
2020/02/19 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python 测试实现方法
2008/12/24 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
keras的三种模型实现与区别说明
2020/07/03 Python
django使用channels实现通信的示例
2020/10/19 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
J2EE相关知识面试题
2013/08/26 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
元旦晚会感言
2014/03/12 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
爱国教育主题班会
2015/08/14 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
Python实现抖音热搜定时爬取功能
2022/03/16 Python
vue修饰符.capture和.self的区别
2022/04/22 Vue.js