2010-09-09 69 views
1

我想深入了解javascript的细微差别。这个javascript序列究竟发生了什么?

采取以下功能:

str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    ret[param] = value; 
}); 
  • 为什么有需要/ g的?
  • 什么 正好被传入 函数?
  • 这些值来自哪里 从?

谢谢!

回答

5

为什么需要/ g?

因为假设您在匹配的字符串中会有多个对,例如a:'b' c:'d'

究竟是什么传递给函数?

回调函数获取整个匹配作为第一个参数,后面的两个参数是在您的正则表达式中指定的捕获组。

例如:

"a:'b' c:'d'".replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    console.log($0, param, value); 
}); 

回调将被执行两次,它会告诉你的value"a:'b'"$0"a"param"b"第一执行。

在第二次执行 - 对于第二匹配 - ,会告诉你的价值"c:'d'"$0"c"param"d"

+0

我认为这是一个jQuerys的相似的属性选择器?或者是一个js标签解析器?不,是一个Json解析器;) – 2010-09-09 18:39:18

+0

所以,当一个函数被附加到任何给定的js函数的末尾时,它将充当一个回调函数,每个元素都将被传递给它?什么决定了第一个价值,第二个和第三个价值? – 2010-09-09 18:48:42

+0

@Ming,不,当一个函数作为String的replace方法的第二个参数传递时,它会针对每个遇到的匹配被调用,匹配的字符串将作为该回调的第一个参数传递,其余的参数是取决于您在正则表达式中的捕获组的数量。 [更多信息...](https://developer.mozilla。org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter) – CMS 2010-09-09 18:52:15

1

g in/g代表全局。这确保所有匹配被替换。在没有/ g的情况下,只有第一个匹配被替换。 /我(忽略大小写)是另一个常用的开关。

每当javascript引擎在字符串中找到一个匹配项(用于正则表达式)时,它会调用传入的函数,并为每个匹配项指定一个参数。

详细解释here