函数replace()异常行为的示例

时间:2018-07-15 12:37:45

标签: javascript function

为什么在下面的示例中,字符串'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() {}

3 个答案:

答案 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