Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSHint -Expected a conditional expression and instead saw an assignment

I am well aware of similar questions, but I still can't solve mine basing on those.

So, my code looks like this:

for (var e, i = 0; e = formErrors[i]; i += 1)

JSHint returns said error in char 39, so with ; after formErrors[i]. What can I do?

like image 355
Tomek Buszewski Avatar asked Oct 22 '15 07:10

Tomek Buszewski


2 Answers

JSHint is warning you of a potential bug. It is expected that the 2nd part of a for statement will be a Boolean expression. Normally, you'd use one of the comparison operators for this (==, ===, !=, > etc..). Since the expression is e = formErrors[i] it looks like it might be a mistake, possibly due to a missing equal sign. This is a common typo that causes a lot of bugs.

Apparently, in this case it is not a bug, but rather an intentional usage of the fact that any expression evaluates to something, and an assignment expression evaluates to the assigned value:

var x;

alert(x = 1);

So the for statement actually assigns a new value to e, but also evaluates that value as a condition, casting it to Boolean if required.

You could refactor your code such that it both assigns the value and uses a casting operation that would satisfy JSHint and make the code a bit more obvious to the reader:

for (var e, i = 0; !!(e = formErrors[i]); i += 1)

The 2nd ! (the one directly in front of (e...) causes a casting to Boolean, but also negates it, the 1st ! reverts this negation.

like image 88
Amit Avatar answered Oct 04 '22 00:10

Amit


That's just a very weird way of writing a loop. JsHint expects a boolean expression ("conditional") there, and judges that your assignment is a mistake and you actually wanted a comparison (== instead of =).

What you should do is switch to the following common array iteration idiom:

for (var i = 0; i < formErrors.length; i += 1) {
    var e = formErrors[i];
    …

(Which works the same as your original code for non-sparse formErrors arrays that contain no falsy values.)

Or alternatively, if you want to write non-idiomatic code, dump jshint :-)

like image 34
Bergi Avatar answered Oct 04 '22 01:10

Bergi