为什么在下面的示例中,字符串'a'
没有被函数定义替换?
我认为,使用以下代码
let f = function() {};
console.log('a'.replace('a', f)); //the result is: undefined
字符串'a'
应替换为此'function() {}'
但被'undefined'
代替。
当我们对对象执行相同操作时:
let o = {};
console.log('a'.replace('a', o)); //the result is: [object Object]
执行到字符串的转换,并将'a'
替换为'[object Object]'
。
当我们强制转换为字符串时:
let f = function() {};
console.log('a'.replace('a', '' + f)); //the result is: function f() {}
也将执行到字符串的转换,并将'a'
替换为function f() {}'
。
这是可执行代码:
let f = function() {};
console.log('a'.replace('a', f)); //the result is: undefined
let o = {}
console.log('a'.replace('a', o)); //the result is: [object Object]
console.log('a'.replace('a', '' + f)); //the result is: function f() {}
答案 0 :(得分:3)
如果replace()
的第二个参数是一个函数,则使用匹配的字符串调用该函数,并将该函数的返回值用作替换。当您替换正则表达式匹配项时,此功能更为有用,因为匹配字符串可能会有所不同,并且您可以根据匹配的内容进行替换,但替换文字字符串时仍会发生这种情况。
console.log('a'.replace('a', function(x) {
console.log("function was called, arg = ", x);
return 'b';
}));
您可以使用f.toString()
将函数转换为其源代码。
答案 1 :(得分:0)
来自MDN
的资源您可以将函数指定为第二个参数。在这种情况下,将在执行匹配后调用该函数。函数的结果(返回值)将用作替换字符串。 (注意:上述特殊替换模式在这种情况下不适用。)请注意,如果第一个参数中的正则表达式是全局的,则每次要替换的完全匹配项都会多次调用该函数。
基本上,该函数f
不返回任何内容(undefined
)。
使用返回特定值的函数查看此问题:
let f = function() {
return 'Ele from Stack';
};
console.log('a'.replace('a', f)); //the result is: Ele from Stack
答案 2 :(得分:0)
如果您为String.prototype.replace
引用MDN文档here,则会显示以下内容:
您可以将函数指定为第二个参数。在这种情况下, 匹配完成后将调用函数。的 函数的结果(返回值)将用作替换 串。 (注:上述特殊更换方式不 在这种情况下适用。)请注意,该函数将被多次调用 如果正则表达式位于中,则将替换每个完全匹配的时间 第一个参数是全局参数。
对于您的摘要:
let f = function() {};
console.log('a'.replace('a', f)); //the result is: undefined
出于所有明显的原因,未定义函数f的返回值。从而替代。
作为扩展,请尝试以下方法:
let f = function() {};
console.log('ab'.replace('a', f));
您将得到的输出为undefinedb
如果可以的话:
let f = function() {return 'Hola'};
console.log('ab'.replace('a', f));
猜猜您将得到什么输出?应该是Holab
。