在javascript中编写更高效的代码

时间:2009-12-17 15:37:03

标签: javascript refactoring

我正在尝试编写更具可读性和更高效的代码,我总是讨厌如果是否如果链......是否可以用其他更“优雅”的方式编写以下语句,就像使用三元操作一样:< / p>

if(text.length < 1){
    if(errtext.length > 1){
        errtext+="<br>";
    }
    errors = true;
    errtext += "Field cannot be empty";
}

谢谢

5 个答案:

答案 0 :(得分:10)

老实说,在大多数情况下,您希望使用if链,因为它们对读者来说更清晰。有一些例外,但并不多。

通常,如果您的代码很尴尬,那么您的基本方法就是错误的。试试这个:

function validate()
{
  errs = [];
  // ...
  if (!txt.length) {
    errs.push("Must have text, man!");
  }
  // ...
  return errs.join("<BR>");
}

值得一提的是,字符串在Javascript中是不可变的。如果你+ = on strings,你就会创建很多中间字符串,这会降低性能。

E.G。

var msg = "Tom";
msg += ", Brad";
msg += ", Sam";
msg += ", Rick";

这最终会在内存中创建以下字符串:

"Tom"
"Brad"
"Sam"
"Rick"
"Tom, Brad"
"Tom, Brad, Sam"
"Tom, Brad, Sam, Rick"

如下:

var msg = ["Tom", "Brad", "Sam", "Rick"];
var msg = msg.join(", ");

在内存中创建以下内容:

"Tom"
"Brad"
"Sam"
"Rick"
"Tom, Brad, Sam, Rick"

在这种情况下,最不可能产生很大的不同,但是养成创建字符串数组和使用join方法的习惯是很好的。在较大的文本操作/生成问题中,它可能导致巨大的减速。

编辑:

如果调用函数需要检查是否存在错误,则始终可以在返回的字符串的.length上执行if。如果您想更明确,可以随时执行此操作:

if (!errs.length) {
  return null; // or false, or a constant...
}
return errs.join("<BR>");

然后在您的调用代码中添加一个检查(=== null等)

答案 1 :(得分:3)

你能做的一件事就是利用大于0的数字的真实性和数字等于0的虚假性:

if(!text.length) {
  if (errtext.length) {
    errtext += "<br />";
  }

  errors = true;

  errtext += "Field cannot be empty";
}

答案 2 :(得分:2)

如何使用add方法创建Error类和某种Errors集合?

您的错误集合将知道如何添加br标记,您的调用代码将是所有验证逻辑而不是验证,消息文本和标记都混合为一个。

您可以检查您的错误集合是否有任何条目,并且有标记。

您甚至可以在应用程序的其他位置重用该错误!

答案 3 :(得分:1)

引用的代码似乎很清楚。你可以投入三元组(我假设支票应该是> 0,而不是> 1):

if(text.length < 1){
        errors = true;
        errtext += (errtext.length > 0 ? "<br>" : "") + "Field cannot be empty";
}

但这不仅不太清楚,而且使用非优化编译器,效率也会降低。 (并不是说你在这里提到的上下文中很重要,我猜这不是一个紧密的循环。)

更好的选择比三元(再次,如果有很多这些测试):

  • 始终在所有错误文本案例中包含<br>,然后在演示之前删除第一个案例。如果你有很多地方可能会附加错误文本,那就简单多了。
  • 在数组中构建错误消息,然后join使用<br>作为分隔符进行展示。

答案 4 :(得分:0)

这样的事情怎么样:

errors = (text.length < 1);
if (errors) {
    errtext += (errtext.length > 1 ? "<br>" : "") + "Field cannot be empty";
}