所以我是javascript的新手,我遇到了这个:
/**
* Replaces %1, %2 and so on in the string to the arguments.
*
* @method String.prototype.format
* @param {Any} ...args The objects to format
* @return {String} A formatted string
*/
String.prototype.format = function() {
var args = arguments;
return this.replace(/%([0-9]+)/g, function(s, n) {
return args[Number(n) - 1];
});
};
你们能帮助我弄清楚这几件事意味着什么吗?)
首先,我不明白"论点" in" var args = arguments;"应该是什么类型的?我不明白它在这里做了什么。 其次," /%([0-9] +)/ g"呢?我无法理解其中任何一个。 第三,这些功能如何实现其所说的功能?我对此感到困惑。 谢谢!
答案 0 :(得分:2)
arguments
对象是为每个函数调用创建的特殊对象。请在documentation:
arguments
对象是所有(非箭头)函数中可用的局部变量。您可以使用arguments对象引用函数内的函数参数。该对象包含传递给函数的每个参数的条目,第一个条目的索引从0开始。
/%([0-9]+)/g
是一个regular expression字面值。这些文字的区别在于它们的/
分隔符,就像引号表示字符串文字一样。正则表达式本身就是一种语言,也可以在其他语言环境中使用。它们用于查找字符串中的模式,因此是比.indexOf
提供的更强大的搜索方式。请在documentation。
以下是该正则表达式的细分:
/
:分隔符:这不是正则表达式的一部分,只是告诉Javascript这是一个正则表达式文字
%
:将匹配文字百分比符号。
( )
:捕获组。这些括号中的模式匹配的任何内容都可以在以后作为单独的字符串值检索(在这种情况下,在传递给replace
的回调函数中)
[ ]
:一组字符。搜索到的字符串中的下一个字符(在百分比符号之后)应该是其中之一。
[0-9]
:数字。
+
:上一个模式可以多次出现,但至少出现一次。所以在这种情况下,应该至少有一个数字,但允许更多数字。
g
:这是正则表达式的修饰符,使其与所有出现的模式匹配,而不仅仅是第一个。
也许还提到this
,这是调用此format
方法的字符串。只有在调用函数时才知道哪个字符串。
replace
方法可以将正则表达式作为其第一个参数,在这种情况下,它会查找以百分比符号开头,后跟非符号整数的模式。
在此代码中,replace
方法也会获得callback function passed to it。将为字符串中找到的每个匹配调用此函数。该字符串返回的值将用作找到的替换字符串。所以这意味着所有这些%nn
子串将被取自arguments
对象的内容所取代。
在这种情况下,使用两个参数调用回调函数:第一个是匹配的字符串,例如%1
,第二个是第一个捕获组(请参阅正则表达式中的括号):this与第一个参数相同,但没有%
。
Number
函数会将数字字符串转换为数字。由于%1
应引用第一个参数,并且第一个参数具有索引0,因此必须从该数字中减去一个以便在args
类似数组的对象中获取正确的索引。
您可以在该代码中放置一些console.log()
语句,以便更好地掌握正在发生的事情,例如:
String.prototype.format = function() {
var args = arguments;
console.log('arguments:', JSON.stringify(args));
console.log('string to deal with: ' + this);
return this.replace(/%([0-9]+)/g, function(s, n) {
console.log('found:', s, 'with digit(s)', n);
console.log('replacing that with argument at index:', (Number(n) - 1), 'which is', args[Number(n) - 1]);
return args[Number(n) - 1];
});
};
// Run the above method
var result = "My name is %1 and I am %2 years old.".format("Maria", 24);
console.log('final result:', result);