【问题标题】:What exactly happens in this javascript sequence?这个javascript序列到底发生了什么?
【发布时间】:2010-09-09 18:18:05
【问题描述】:

我想更深入地了解 javascript 的细微差别。

取下面的函数:

str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) {
    ret[param] = value;
});
  • 为什么需要 /g?
  • 什么 确切地被传递到 功能?
  • 这些值从何而来 来自?

谢谢!

【问题讨论】:

    标签: javascript javascript-framework


    【解决方案1】:

    为什么需要 /g?

    因为大概您将在匹配字符串上有多个对,例如a:'b' c:'d'

    究竟是什么传递到函数中?

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

    例如:

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

    回调将被执行两次,它会在第一次执行时显示"a:'b'" 用于$0"a" 用于param"b" 用于value

    在第二次执行中-对于第二场比赛-,将向您显示"c:'d'" for $0"c" for param"d" for value。

    【讨论】:

    • 我认为它是一个 jQuerys 的类似属性选择器?还是js标签解析器?不,一个 Json 解析器 ;)
    • 那么当一个函数被附加到任何给定的 js 函数的末尾时,它将作为一个回调函数,每个元素都将被传递给它?什么决定了第一个值,第二个和第三个?
    • @Ming,不,当函数作为 String replace 方法的第二个参数传递时,它将为遇到的每个匹配项调用,匹配的字符串将作为该方法的第一个参数传递回调,其余参数由您在正则表达式中的捕获组数确定。 More info...
    • 知道了:“请注意,如果第一个参数中的正则表达式是全局的,则每个要替换的完整匹配都会多次调用该函数”。
    • 这是一个很好的指南来说明这些类型的回调是如何工作的吗?
    【解决方案2】:

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

    每次 javascript 引擎在字符串中找到匹配项(针对您的正则表达式)时,它都会使用每个匹配项的参数调用您传入的函数。

    详细解释here

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多