var.replace不是函数


133

我正在使用以下代码尝试在Javascript中修剪字符串,但出现标题中提到的错误:

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}

编辑:

我解决了这个问题。...对不起,我也应该将代码放在如何调用它的方法上。...意识到我不小心传递了表单字段本身的对象而不是其值。


21
str可能不是字符串
-Pekka

顺便说一句:您会在regex字符串本身周围缺少引号,但这可能并不好。
格兰特·托马斯

4
@MrDisappointment Javascript具有文字正则表达式-它们不必是字符串
Gareth


15
使用str.toString().replace(/^\s+|\s+$/g,'')代替。
M罗斯塔米

Answers:


213

我的猜测是,调用您的trim函数的代码实际上并未向其传递字符串。

要解决此问题,您可以制作str一个字符串,如下所示:str.toString().replace(...)
...如下面的alper所指出的。


39
str.toString()解决了我的问题。
alper

好吧,str.toString()这只是解决方案,如果您传递的是可以成功转换字符串的正确值;就我而言,我完全错了。:)
Brett

我也遇到了同样的错误,我尝试了toString(),但是遇到了错误:无法读取属性“ toString”是未定义的,并且与“替换”相同
Hitesh Kumar,

90

可能的问题:

  • 变量是NUMBER(而不是字符串);
    num=35; num.replace(3,'three'); =====> ERROR
    num=35; num.toString().replace(3,'three'); =====> CORRECT !!!!!!
    num='35'; num.replace(3,'three'); =====> CORRECT !!!!!!
  • 变量是对象(而不是字符串);
  • 变量未定义;

1
谢谢,为此,我面临一个问题,我在typeof对象中获取String。我用toString()转换了该对象。而且正在工作!谢谢!
Vishwajit R. Shinde 2014年

14

替换不会替换数字。它仅替换字符串。

这应该工作。

function trim(str) {
    return str.toString().replace(/^\s+|\s+$/g,'');
}

如果只想修剪字符串。您可以简单地使用“ str.trim()”


6

您没有传递字符串,否则它将具有replace方法。希望您function trim(str) { return var.replace(blah); }不要输入而不是return str.replace


6

在实际执行功能之前,您可能应该做一些验证:

function trim(str) {
    if(typeof str !== 'string') {
        throw new Error('only string parameter supported!');
    }

    return str.replace(/^\s+|\s+$/g,'');
}

5

您是否正确调用了函数?就是 您作为参数传递的东西真的是字符串吗?

否则,我看不到您的代码有问题-以下示例按预期工作

function trim(str) {
    return str.replace(/^\s+|\s+$/g,'');
}


trim('    hello   ');  // --> 'hello'

但是,如果您使用非字符串形式的函数调用functoin,则确实会出现上述错误:

trim({});  // --> TypeError: str.replace is not a function

5

如果是数字,可以尝试转换为字符串:

var stringValue = str.toString();
return stringValue.replace(/^\s+|\s+$/g,'');

3

您应该使用Java脚本的toString()方法将其转换为字符串,因为replace方法是一个字符串函数。


1

我解决了这个问题。...对不起,我也应该把代码放在如何调用它的方法上。...意识到我不小心传递了表单字段本身的对象,而不是传递它的值。

仍然感谢您的回复。:)


1
您可以编辑问题,这比给自己一个答案要好。哦,当您在这么做的时候,选择一个好人并接受他们的回答。:-)
Christopher Creutzig 2011年

2
@克里斯托弗:不;如果他自己解决了该问题,则应写下并接受该回答。那是最佳实践。提出问题解决方案并接受任意答案不是。
在轨道进行比赛

@Tomalak:这里有几个正确的答案,比这个答案还早。我同意,如果您的答案是第一个正确答案,那么接受您的答案是一件好事™,并且当然也不想建议将解决方案放入问题中。
Christopher Creutzig 2011年

@Christopher:可接受的答案应该是包含OP使用的解决方案的答案。
轨道轻度比赛

0

确保将字符串传递给“替换”方法。有同样的问题,并通过传递字符串解决了。您也可以使用toString()方法将其设置为字符串。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.