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

 更新时间:2016年12月23日 10:21:35   作者:小精灵儿  
最近这几天在升级自己的MVVM 框架,遇到很多小问题,所以想着就在这里统一解决了。文中主要介绍了关于Javascript中with的替代方法与String中的正则方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。

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实现的彩色方块飞舞奇幻效果

    js实现的彩色方块飞舞奇幻效果

    这篇文章主要介绍了js实现的彩色方块飞舞奇幻效果,涉及JavaScript响应鼠标事件动态操作页面元素样式的相关技巧,需要的朋友可以参考下
    2016-01-01
  • JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】

    JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】

    这篇文章主要介绍了JS表单验证方法,结合实例形式总结分析了常用的表单验证技巧,包括电话、身份证号、Email、中文、特殊字符、身份证号等验证方法,需要的朋友可以参考下
    2017-02-02
  • 前端监控页面异常的常用方法

    前端监控页面异常的常用方法

    前端开发常见问题之一: 资源异常、js异常,页面出了问题常见的想法是:如何看到错误信息,资源脚本是否正常,像js、css、图片这些资源文件经常受网络等原因,导致资源加载异常,这些会直接影响我们的页面,本文给大家介绍前端监控页面异常的常用方法,需要的朋友可以参考下
    2025-04-04
  • JavaScript 管道运算符及工作原理

    JavaScript 管道运算符及工作原理

    这篇文章主要介绍了JavaScript 管道运算符,管道运算符为我们的代码添加了大量上下文,并简化了操作,以便以后可以扩展它们,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 理解 JavaScript 预解析

    理解 JavaScript 预解析

    JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?
    2009-10-10
  • JavaScript实现密码强度实时验证

    JavaScript实现密码强度实时验证

    这篇文章主要为大家详细介绍了JavaScript实现密码强度实时验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过

    iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过

    近期需要一个iframe自适应高度的东西,在网上找了很多,都不能用……一看大体的日期都是大概 2008年前后的其他近期的基本都是以前的转载,所以只好自己动手了。
    2010-07-07
  • 数组Array的排序sort方法

    数组Array的排序sort方法

    下面小编就为大家带来一篇数组Array的排序sort方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • JavaScript获取当前页面路径的三种方法

    JavaScript获取当前页面路径的三种方法

    在Web开发中,我们经常需要获取当前页面的URL路径,以便进行导航、数据加载或其他与页面相关的操作,JavaScript提供了几种方法来帮助我们实现这一功能,在本文中,我们将探讨几种常用的方法,需要的朋友可以参考下
    2024-05-05
  • 微信小程序中选中手机相册图片上传到服务器的步骤

    微信小程序中选中手机相册图片上传到服务器的步骤

    这篇文章主要介绍了微信小程序中选中手机相册图片上传到服务器的步骤,现图片上传我们需要使用chooseImg和uploadFile这两个api,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-04-04

最新评论