Comparison may cause unexpected type coercion...

This inspection warning pops up on any JavaScript using == or != apparently:

This seems unnecessary as I've had to fix code where === or !== was used everywhere (as "good practice" supposedly) because the code would fail when it encountered an unexpected datatype even though all that mattered was the value...

For instance, say you get in XML or JSON from a request response, and your if statement is `if(value === 86)` but the XML/JSON value is string '86', the processing will fail even though the value matched and that's all that was wanted from the response. For the === to work properly, you'd either have to type '86' or convert the value to an integer... which is far more coding than simply deleting an =. 

In some case I've seen datatype convert through various processes or functions or even languages, and while the value remains the same, it will not be seen as the same by this "good practice". It's as good as being completely different in this case.

I want to disable this inspection because it is highlighting EVERY value check in my JavaScript, but I'm not sure if it will ever be useful, I just think it is a very overboard warning and not a good idea to be recommending datatype check on EVERYTHING, especially when PHP handles type conversion so well (this is PHPStorm after all and we're also using PHP code) and JavaScript is close. 

8 comments
Comment actions Permalink

Not sure I follow you... Indeed, if you don't care about using explicit types conversion, and intentionally rely on javascript type coercion, comparing string to integer, changing `==` to `===` would result in unexpected result.

The IDE does not force you to use this or that coding style. You can disable this inspection completely, or suppress it for the statements where type coercion is used intentionally

0
Comment actions Permalink

I'm saying the warning is overly broad, and its advice is probably not good practice in PHP with its auto-conversion, as usually the value matters but not the datatype, and checking datatype when it's not necessary can cause failure in real-world scenarios.

1
Comment actions Permalink

to suppress this warning unset this checkbox:

Settings > Editor > Inspections > JavaScript > Probable Bugs > Equality operator may cause type coercion 

official help page:

https://www.jetbrains.com/help/resharper/CoercedEqualsUsing.html

0
Comment actions Permalink

Is it possible to suppress a specific statement? Can I use some kind of a comment mark-up if I want to use the type coercion somewhere?

0
Comment actions Permalink

Sure:

// noinspection EqualityComparisonWithCoercionJS
if (document.getElementById(id).style.display == "") {

 

This can be done with Alt+Enter - see https://www.jetbrains.com/help/webstorm/2019.3/disabling-and-enabling-inspections.html#suppress-in-editor

1
Comment actions Permalink

Nice, thank you!

0
Comment actions Permalink

I have found this warning particularly useless and very annoying in cases similar to the following example:

 

const myVar = (username == 'JohnDoe') ? 0 : 10;

 

How can this possibly cause a type coercion? 'JohnDoe' is clearly a string and user will either be equal to it or not. There is no way in hell that the JS interpreter will be confused by this ... and it's a case insensitive comparison. There is nothing much to it. Unless there is something super obvious that I am not noticing.

Please correct me if I am wrong because I cannot afford disabling this inspection ... it is often very helpful.

0
Comment actions Permalink

As it's written above, you can suppress inspection for current statement only by adding

// noinspection EqualityComparisonWithCoercionJS
0

Please sign in to leave a comment.