JavaScript函数说明

时间:2015-01-14 20:42:18

标签: javascript

我对这种编程很陌生,我有一段代码,我有一些问题。

代码:

function numFormat(n) {
    return n.toFixed(0).replace(/./g, function(c, i, a) {
        //console.log(a);
        return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c;
    });
}

我实际上知道它做了什么,它将一个数字(例如1234)转换为1,234个除以3的组,用“,”作为货币数字。

我真的不明白它是怎么做到的。 我不知道c i和a在哪里充满了什么,从何处充满了什么!?

可以请有人向我解释这个功能吗?

谢谢和问候

2 个答案:

答案 0 :(得分:1)

快速概述:
对于给定输入中的每个字符

return n.toFixed(0).replace(/./g, function(c, i, a) {

执行以下三元:

return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c;

可以简单地写成

if (i > 0 && c !== "." && (a.length - i) % 3 === 0) {
    return "," + c;
} else {
    return c;
};

参数ciathe spec中所述,即:

  • c是匹配的子字符串,即输入的单个字符
  • i是匹配子字符串的偏移量,在此上下文中表示我们当前正在处理的字符的索引
  • a是要检查的总字符串

结合所有这些我们可以改写

if (i > 0 && c !== "." && (a.length - i) % 3 === 0) {
    return "," + c;
} else {
    return c;
};

作为

  

如果我们没有查看输入的第一个字符
  
  如果我们正在看的角色不是点
  
   if 被检查的字符的当前索引可以被三整除(因为我们想要将每三个字符分开)
  然后插入逗号,后跟当前字符,
  否则用自己替换该角色。

答案 1 :(得分:1)

<强>替换

replace函数接受正则表达式,并用值替换每个匹配项。替换值由您传递给replace的函数确定,作为第二个参数。

匿名充当回调

匿名函数不是(可见地)从JavaScript代码调用,而是由replace函数在内部调用。您没有将函数结果但函数本身传递给replace,因此replace可以调用您的函数来处理匹配。这样您就可以将行为“注入”JavaScript的内置函数。这是JavaScript中的常见概念,您将在很多场合遇到这种情况。

'。'模式中的通配符

因此,为模式的每个匹配调用该函数。此模式的核心是点.字符。它是一个通配符,意思是“任何角色”。因此,给定数字中的任何字符都与点匹配。这样做的结果是,为数字中的每个单独字符调用该函数。

回调的参数和内部工作原理

然后参数aci。回调函数的参数的含义当然是针对替换函数记录的,但是如果你将c,i和a输出到控制台,它可能会立刻变得有点清楚,就像我在下面的代码片段中所做的那样。

function numFormat(n) {
return n.toFixed(0).replace(/./g, function(c, i, a) {
    console.log(a + ',' + i +',' + c);
    return i > 0 && c !== "." && (a.length - i) % 3 === 0 ? "," + c : c;
});
}

alert(numFormat(107784));

函数的参数是匹配的子串(c),每次匹配一个字符(与模式匹配),匹配的偏移/字符串位置(i),和整个字符串(a)。

使用偏移i,进行计算以查看它是否是第三个字符。如果是这样,则返回前面带有逗号的字符c,否则返回该字符。添加i > 0作为额外条件,以防止字符串开头的逗号。 c !== "."似乎已经过时,也可能是试图支持浮点数的遗留问题。

所有这些返回的字符串都被放回到一起(再次,由replace内部),并将形成替换函数的返回值。

其他文档