我对这种编程很陌生,我有一段代码,我有一些问题。
代码:
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在哪里充满了什么,从何处充满了什么!?
可以请有人向我解释这个功能吗?
谢谢和问候
答案 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;
};
参数c
,i
和a
如the 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中的常见概念,您将在很多场合遇到这种情况。
'。'模式中的通配符
因此,为模式的每个匹配调用该函数。此模式的核心是点.
字符。它是一个通配符,意思是“任何角色”。因此,给定数字中的任何字符都与点匹配。这样做的结果是,为数字中的每个单独字符调用该函数。
回调的参数和内部工作原理
然后参数a
,c
和i
。回调函数的参数的含义当然是针对替换函数记录的,但是如果你将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
内部),并将形成替换函数的返回值。
其他文档