Если у вас в элементах var2-var4 записаны числа, то тип данных всё равно строка, и для сравнения с нулём нужно преобразовать строку в число. Либо как сказал
@GM2mars, только в его примере лучше указать вторым параметром систему счисления: parseInt(form.var4.value, 10) === 0, потому как в старых браузерах числа, начинающиеся с нуля ("012"), считались восьмеричным числом. Либо просто указать +form.var4.value === 0, где унарный плюс переведёт строку в число.
А само присвоение valid = false в данном случае корректно.
Но я обычно делаю так:
function validate(form) {
var errors = [];
if (form.var1.value.length < 2) errors.push('length');
if (+form.var2.value == 0) errors.push('var2');
if (+form.var3.value == 0) errors.push('var3');
if (+form.var4.value == 0) errors.push('var4');
showErrors(errors);
return errors.length == 0;
}
function showErrors(errors) {
foreach (error in errors) {
switch (errors[error]) {
case 'length': document.getElementById('var1_e').innerHTML='err1'; break;
case 'var2': document.getElementById('var2_e').innerHTML='err2'; break;
case 'var3': document.getElementById('var3_e').innerHTML='err3'; break;
case 'var4': document.getElementById('var4_e').innerHTML='err4'; break;
}
}
}
Такой подход позволяет разделить собственно проверку значений и обработку ошибок.