JS正则表达式字面量和使用new RegExp构造函数创建的正则表达式有什么区别

我们在js中只用字符替换的时候,经常会遇到两种写法,直接字面量

1、str.replace(/ /ig,"");

2、new RegExp的方式

测试代码

<form name=form1>
字符串:<input name="t1" value="123456">
模式:/<input name="t2" value="^\d*$">/
</form>
<script language=javascript>
function c1()
 {
 re=new RegExp("^\d*$");
 alert(re.test("123456"));
 }
function c2(form)
 {
 re=new RegExp(form.t2.value);
 alert(re.test(form.t1.value));
}
function c3(){
 re=/^\d*$/;
 alert(re.test("123456"));
 }
 c1();
 c2(document.form1);
 c3();
</script> 

上面的代码结果为:FALSE,TRUE,TRUE

请问结果中为什么第一个为FALSE?

第一个应为   re=new   RegExp("^\\d*$");

\在引号中需要转义

第一双有双引号,双引号要加多一次转义的,第二个没有,这就是区别

不过今天看来一篇文章,对于复杂类的替换还是用new 来写出来。前提也得把正则优化好。

以前看到很多文章都说 字面量 会比 new 对象 形式效率高,但是在正则这里,好像不是这么回事。
不过也不能直接否认这个观点,因为我一直都用字面量的,简洁美观,用着方便才是王道。

我觉得在数据量大,或者重复操作次数多的时候用 new RegExp 是很必要的。
因为你也看到了性能提升这么多。
当然前提条件是你的正则必须优化,正则没优化的情况,两种差不多。

所以优化你的正则,然后用 new RegExp 可以大幅度提升程序的性能。

PS: IE11 是个特例,这货从来不安套路出牌。

好了今天的分享完毕,你们都蠢蠢欲动了吧,快去把正则各种new起来吧。

JS正则使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式有什么不一样?

下面的内容摘自某书
使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。在 ECMAScript 3 中, 正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。来看下面的例子。

var re = null,
  i;
for (i=0; i < 10; i++){
 re = /cat/g;
 re.test("catastrophe");
}
for (i=0; i < 10; i++){
 re = new RegExp("cat", "g");
 re.test("catastrophe");
}

在第一个循环中,即使是循环体中指定的,但实际上只为 /cat/ 创建了一个 RegExp 实例。由于实例属性不会重置,所以在循环中再次调用 test() 方法会失败。这是因为第一次调用 test() 找到了"cat",但第二次调用是从索引为 3 的字符(上一次匹配的末尾)开始的,所以就找不到它了。由于会测试到字符串末尾,所以下一次再调用 test()就又从开头开始了。
第二个循环使用 RegExp 构造函数在每次循环中创建正则表达式。因为每次迭代都会创建一个新的 RegExp 实例,所以每次调用 test()都会返回 true。

没能看懂,我测试了下两种方式来测试,都是返回了10次 true 啊
如果放开ES5标准不说,假如是ES3的话是不是说第一种情况是5次,第二种情况是10次呢?

var re = null,
 b = 0,
 c = 0,
 tmp,
 i;
for (i=0; i < 10; i++){
 re = /cat/g;
 tmp = re.test("catastrophe");
 console.log(tmp);
 if(tmp){
  b++ ;
 }
}
for (i=0; i < 10; i++){
 re = new RegExp("cat", "g");
 tmp = re.test("catastrophe");
 console.log(tmp);
 if(tmp){
  c++;
 }
}
console.log(b,c);

你自己都说那是ES3的标准了,现在ES5都普及了,ES6的出现也指日可待了。

ES5标准里不管哪种方式都会创建一个独立的正则表达式。现代浏览器一般都支持ES5了。

因为现在要看ECMA5.1了,标准中明确指出

A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical.

正则表达式字面量每次被计算时都会被转换成一个正则对象,即使内容一致,这些对象也并不相同

(0)

相关推荐

  • js之ActiveX控件使用说明 new ActiveXObject()

    什么是 ActiveX 控件? ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容.在某些情况下,这些程序可被用来以您不允许的方式从计算机收集信息.破坏您的计算机上的数据.在未经您同意的情况下在您的计算机上安装软件或者允许他人远程控制您的计算机.考虑到这些风险,您应该在完全信任发行商的情况下才安装这些程序. 当 Windows 阻止 ActiveX 控件的安装时,您应该做什么? 您可能不应该安装该 A

  • javascript new一个对象的实质

    以前这些东西自己清楚,可是却解释不出来,也没有去深究这些东西.今天在看<悟透JavaScript>的时候,看到作者的描述,"茅厕"顿开. 现摘录如下,作者说的很是清楚: 用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步: 第一步是建立一个新对象: 第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象: 第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作.

  • Javascript new关键字的玄机 以及其它

    (接上)先看张对老手不新鲜但对菜鸟很有趣的图: What the heck is that? 简直是luan lun. new 抛开上面的图,先看看上篇文章留下的第二个问题,让我们在构造器的函数体内加点东西,看会发生什么. function A(){this.p = 1}var a = new A() 会得到如下结果: 为什么用new关键字构造出来的a,会获得p这个属性?new A()这行代码做了什么事情?根据上篇文章中Function的创建过程第4步,A这个对象会有一个Construct属性(

  • Javascript new Date().valueOf()的作用与时间戳由来详解

    众所周知PHP中对时间类型数据可以直接转换为时间戳,那么在前端脚本js中,也有方法可以实现,就是valueOf() 例如,我们可以通过这段代码输出当前时间点的时间戳 复制代码 代码如下: <script type="text/javascript">  document.write(new Date().valueOf());</script> 那么何为时间戳呢? 时间戳就是从1970年1月1日0时0分0秒到当前时间点的所有秒数.1970.1.1 0:0:0 这

  • javascript中IE浏览器不支持NEW DATE()带参数的解决方法

    复制代码 代码如下: var date1=new Date(dateTimes[z][1]); 在火狐下 可以正常取得时间,在IE7下 却是 NaN.纠结老长时间,放弃了new date 然后再老外的论坛中找了一段段代码可以兼容所有浏览器的格式化日期代码: 复制代码 代码如下: function NewDate(str) { str = str.split('-'); var date = new Date(); date.setUTCFullYear(str[0], str[1] - 1, s

  • JavaScript中的new的使用方法与注意事项

    原文: JavaScript, We Hardly new Ya  --Douglas Crockford.    http://yuiblog.com/blog/2006/11/13/javascript-we-hardly-new-ya/ 引用 JavaScript是一门基于原型的语言,但它却拥有一个 new 操作符使得其看起来象一门经典的面对对象语言.那样也迷惑了程序员们,导致一些有问题的编程模式. 其实你永远不需要在JavaScript使用 new Object().用字面量的形式{}去

  • js中关于new Object时传参的一些细节分析

    1, 参数是一个对象,核心js对象(native ECMAScript object)或宿主对象(host object),那么将直接返回该对象. 其生成的对象构造器仍然是所传参数对象的构造器.这样造成的后果是虽然该对象是new Object,但其constructor不一定是Object. 复制代码 代码如下: function Person(){this.name='jack';} var w = new Object(window), d = new Object(document), p

  • JavaScript初学者必看“new”

    译者按: 本文简单的介绍了new, 更多的是介绍原型(prototype),值得一读. 原文:JavaScript For Beginners: the 'new' operator 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习 当你使用new的时候,会: 1.创建一个新的空对象: 2.将this绑定到该对象: 3.添加一个名为__proto__的新属性,并且指向构造函数的原型(prototype): 4.返回该this对象. 如果你

  • 关于js new Date() 出现NaN 的分析

    此NaN不为NaN: 程序代码如下: 复制代码 代码如下: var date =new Date(d); if(!date || !date.getFullYear) { return; } return S.Date.format(d,'yyyy-mm-dd');//格式化函数,跟此文无关 在其他浏览器下正常,但是在ie下,程序报错 在ie调试器下,发现date 为NaN,如图: 如果是NaN,那么if判断会返回true,会 return "",但是诡异的一幕发生了, 代码说明if判

  • js中获取时间new Date()的全面介绍

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) 何问起 hovertree.com myDate.getTime(); /

随机推荐