0 Comments

JavaScript有关的10个秘密和怪癖(2)

发布于:2013-12-21  |   作者:广州网站建设  |   已聚集:人围观

正则表达式

4. replace()可以接受回调函数

这是JavaScript最鲜为人知的秘密之一,v1.3中首次引入。大部分情况下,replace()的使用类似下面:


  1. alert('10 13 21 48 52'.replace(/\d+/g, '*')); //用 * 替换所有的数字 

这是一个简单的替换,一个字符串,一个星号。但是,如果我们希望在替换发生的时候有更多的控制,该怎么办呢?我们只希望替换30以下的数值,该怎么办呢?此时如果仅仅依靠正则表达式是鞭长莫及的。我们需要借助回调函数的东风对每个匹配进行处理。


  1. alert('10 13 21 48 52'.replace(/\d+/g, function(match) {  
  2. return parseInt(match) <30?'*' : match;  
  3. })); 

当每个匹配完成的时候,JavaScript应用回调函数,传递匹配内容给match参数。然后,根据回调函数里面的过滤规则,要么返回星号,要么返回匹配本身(无替换发生)。

如下截图:

广州网站建设,网站建设,广州网页设计,广州网站设计

 

5. 正则表达式:不只是match和replace

不少javascript工程师都是只通过match和replace和正则表达式打交道。但JavaScript所定义的正则表达式相关方法远不止这两个。

其中值得一提的是test(),其工作方式类似match(),但是返回值却不一样:test()返回的是布尔型,用来验证是否匹配,执行速度高于match()。


  1. alert(/\w{3,}/.test('Hello')); //弹出 'true' 

上面行代码用来验证字符串是否有三个以上普通字符,显然"hello"是符合要求的,所以弹出true。

结果如下截图:

 

广州网站建设,网站建设,广州网页设计,广州网站设计

我们还应注意RegExp对象,你可以用此创建动态正则表达式对象,例如:


  1. function findWord(word, string) {  
  2. var instancesOfWord = string.match(new RegExp('\\b'+word+'\\b''ig'));  
  3. alert(instancesOfWord);  
  4. }  
  5. findWord('car''Carl went to buy a car but had forgotten his credit card.'); 

这儿,我们基于参数word动态创建了匹配验证。这段测试代码作用是不区分大小选的情况下选择car这个单词。眼睛一扫而过,测试英文句子中只有一个单词是car,因此这里的演出仅一个单词。\b是用来表示单词边界的。

结果如下截图:

 

 

函数和作用域

6. 你可以冒充作用域

作用域这玩意是用来决定什么变量是可用的,独立的JavaScript(如JavaScript不是运行中函数中)在window对象的全局作用域下操作,window对象在任何情况下都可以访问。然而函数中声明的局部变量只能在该函数中使用。


  1. var animal ='dog';  
  2. function getAnimal(adjective) { alert(adjective+''+this.animal); }  
  3. getAnimal('lovely'); //弹出 'lovely dog' 

这儿我们的变量和函数都声明在全局作用域中。因为this指向当前作用域,在这个例子中就是window。因此,该函数寻找window.animal,也就是'dog'了。到目前为止,一切正常。然而,实际上,我们可以让函数运行在不同的作用域下,而忽视其本身的作用域。我们可以用一个内置的称为call()的方法来实现作用域的冒充。


  1. var animal ='dog';  
  2. function getAnimal(adjective) { alert(adjective+''+this.animal); };  
  3. var myObj = {animal: 'camel'};  
  4. getAnimal.call(myObj, 'lovely'); //弹出 'lovely camel' 

call()方法中的第一个参数可以冒充函数中的this,因此,这里的this.animal实际上就是myObj.animal,也就是'camel'了。后面的参数就作为普通参数传给函数体。

另外一个与之相关的是apply()方法,其作用于call()一样,不同之处在于,传递给函数的参数是以数组形式表示的,而不是独立的变量们。所以,上面的测试代码如果用apply()表示就是:


  1. getAnimal.apply(myObj, ['lovely']); //函数参数以数组形式发送 

demo页面中,点击第一个按钮的结果如下截图:

 

 

点击第二个和第三个按钮的结果如下:

 

 

 

标签:
飞机