如果其他代码优化JavaScript

时间:2014-04-17 07:13:54

标签: javascript jquery

有没有更好的方法来编写下面的JS代码?

var check1 = model1.validateAll();
var check2 = model2.validateAll();

if (check1.isValid === false || check2.isValid === false) {
    self.showValidationErrors(check1.messages);
    self.showValidationErrors(check2.messages);
    return true;
} 

我唯一担心的是,一旦进入if块,check1.messages check2.messages可以有一些价值(取决于check1.isValid OR check2.isValidfalse

5 个答案:

答案 0 :(得分:1)

首先,很少需要使用=== false=== true。通常,您只需按以下方式进行测试:!check1.isValid === false表单有用例,但它们很少见。

这里简单的事情是:

if (!check1.isValid && !check2.isValid) {
    if (!check1.isValid) {
        self.showValidationErrors(check1.messages);
    } 
    if (!check2.isValid) {
        self.showValidationErrors(check2.messages);
    } 
    return true;
}

或者如果您处于ES5环境中(我们下面的内容可以填充):

var invalid = false;
[check1, check2].forEach(function(chk) {
    if (!chk.isValid) {
        self.showValidationErrors(chk.messages);
        invalid = true;
    }
});
if (invalid) {
    return true;
}

这可能看起来效率低下,但是我认为这是对用户操作的回应,所涉及的几毫秒都不是问题。

答案 1 :(得分:0)

使用单独的if块。不是立即从块中返回,而是设置一个变量并在完成所有块时返回它。

returnVal = false;
if (check1.isValid) {
    self.showValidationErrors(check1.messages);
    returnVal = true;
}
if (check2.isValid) {
    self.showValidationErrors(check2.messages);
    returnVal = true;
}
return returnVal;

此外,当您发现自己创建名称为check1check2等的变量,并对所有变量做同样的事情时,您可能应该使用数组并循环它们。

答案 2 :(得分:0)

对于完全不同的东西:

return [model1, model2].map(function(model) {
    var check = model.validateAll();
    if (!check.isValid) this.showValidationErrors(check.messages);
    return check.isValid;
}, self).indexOf(false) > -1;

检查map的第二个参数的含义。

请注意,IE8及更低版本不支持mapindexOf等数组方法,但它们很容易被填充。

答案 3 :(得分:0)

我会创建一个函数,这样你就不会重复自己(干)。

function validateModel(model, self)
{
   var check = model.validateAll();
   if(check === false){
      self.showValidationErrors(check.messages);
   }
}

然后你就这么称呼它:

validateModel(model1, self);
validateModel(model2, self);

答案 4 :(得分:0)

我这样做,但只有在没有必要检查两个检查对象才能写出验证信息时才会这样做:

var check1 = model1.validateAll();
var check2 = model2.validateAll();

self.showValidationErrors(check1);
self.showValidationErrors(check2);

return !check1.isValid || !check2.isValid;

并将showValidationError(check) - 函数添加到第一行

if (check.isValid) return;

如果只有一个验证不有效,我认为你不得不写两条消息,对吗?如果我错了,那么这当然不是最好的。