var x; ... x.trim();为什么有时它会允许,但有时它会使其余代码停止工作?

时间:2016-01-31 10:53:04

标签: javascript

这个小问题让我有5个小时的时间来修复。最后我想通了。看到这段代码:

<script language="JavaScript" type="text/javascript">
   var x;
   .... // a lot of codes here
   var k=x.trim();

</script>

以上代码使整个应用程序停止运行!

我记得以前我曾经这样做但没有问题。

所以,关于var x; ... x.trim();为什么有时它会允许,但有时它会使其余代码停止工作?

它的最佳代码实践是什么?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

if(typeof x === 'undefined'){
    // your get an error message
}
else
{
     var k=x.toString().trim();
}

上面使用严格相等运算符===是个好主意,因为在JS中,你可以将变量命名为undefined:

var undefined = "something";

因此,使用===可确保您确实检查变量的未定义值。

答案 1 :(得分:0)

trimString的函数。请参阅MDN - String.trim()

因此,当您将其应用于整数时,它会失败并抛出错误,导致代码停止工作

实施例

&#13;
&#13;
try{
  var a = 1;
  console.log(a.trim());
}
catch(ex){
  console.log(ex);
}
&#13;
&#13;
&#13;

您可以尝试使用.toString()将数字转换为字符串,然后应用.trim()

&#13;
&#13;
try{
  var a = 1;
  console.log(a.toString().trim());
}
catch(ex){
  console.log(ex);
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我会扩展Rajesh的答案。他是对的,当你尝试调用一个不存在的方法时,会抛出一个TypeError。最简单和万无一失的方法是使用try / catch来确保其余代码按原样执行。但即使它确实存在,也不会得到你想要的结果。

我认为最好的方法是将你拥有的值包装到String对象中。它就像

一样简单
var k = String(x).trim();

它做了几件重要的事情:

  1. x的值转换为字符串,即当您检查其类型时,它总是'string'并且始终是String对象的实例。
  2. 确保结果值的方法trim具有应有的功能。
  3. 不会抛出任何错误,因此执行其余代码。
  4. 可能存在一些陷阱。如果x未定义,null,NaN或对象,则String(x)的结果相应地为'undefined''null''NaN'或{{ 1}}。如果'[object Object]'是一个数组,那么它就是一个特定的情况,其值与调用x时的值相同,例如

    x.join(',')

    所以请始终牢记您正在处理的类型。

    就像使用String一样,您可以将变量转换为其他类型,但天真地将任何内容转换为数字,字符串或数组都被认为是一种非常糟糕的做法。你应该总是确定你正在使用什么类型。