¿Por qué mi comparación de igualdad usando = (un solo igual) no funciona correctamente?

Estoy tratando de verificar si una cadena está en blanco, menos de o igual a 9 dígitos, o hasta 10 dígitos. Pero siempre sigue el else if (str.length <= 9) .

 if (str = ''){ console.log("The string cannot be blank"); } else if (str.length <= 9) { console.log("The string must be at least 9 characters long"); } else if (str.length <= 10) { console.log("The string is long enough."); } 

No importa lo que ponga, siempre recibo The string must be at least 9 characters long . ¿Por qué?

= siempre es una tarea. La comparación de igualdad es == (suelta, coacciona tipos para intentar hacer una coincidencia) o === (sin coerción de tipo).

Entonces quieres

 if (str === ''){ // -----^^^ 

no

 // NOT THIS if (str = ''){ // -----^ 

Qué sucede cuando lo haces if (str = '') es que la asignación str = '' está hecha, y luego el valor resultante ( '' ) se prueba, efectivamente así (si ignoramos un par de detalles):

 str = ''; if (str) { 

Como '' es un valor falso en JavaScript, esa comprobación será falsa y pasará al paso else if (str.length <= 9) . Como en ese punto, str.length es 0 , esa es la ruta que toma el código.