Todos los datos en JS tienen dos interpretaciones, la real y la lógica, con lógica se refiere a si corresponde a un true o a un false.
// Tipos de datos en JS
undefined // vacio - undefined - es asignado por JS
null // vacio - object - es asignado por los desarrolladores
12312, NaN, Infinity, 2e232, 0.1231, 0 // number
'sadfasdf', `asdasd${number}`, "asdfasdf" // string
[1,2,3,4,5] // arrays
{key1: 'value1', key2: 2} // objects
true, false // boolean
Symbol['propiedad'] // symbol
// para obtener el tipo de un dato es suficiente con usar typeof
typeof(NaN) // number
typeof NaN // number
// truthy
true // all is not falsy
-3, 0.5 // all numbers except 0
" " // all not empty strings
[] // empty or full arrays
{} // empty or full objects
// falsy
false
0
'' // empty strings
null
undefined
String(true) // 'true'
String(123) // '123'
Number('123') // 123
Number(true) // 1
Number('asdf') // NaN
Boolean('asd') // true
Boolean('') // false
Boolean(13) // true
JS correrá casi cualquier sentencia que mandes para seguir con la aplicación, por lo que cuando un resultado no cuadra lo convertirá para que la operación continúe.
8 * null // 0 , convierte null en su operador logico y luego
"5" - 1 // 4 , la resta solo existe en numeros
"5" + 1 // 51, porque esperaba concatenar
'five' * 2 // NaN, quiere multiplicar pero no hay manera de leer 'five' como un numero
false == 0 // true, su operador logico es el mismo
"200" * 1 // 200
Cada valor lleva consigo una interpretación lógica, ya sea true o false o ninguna de las dos, y su operación consiste en comparar 2 parámetros o cambiar de un valor al otro
null == undefined // true, cualquier valor vacio es igual a otro vacio
null == 0 // false, pero vacio no es igual al valor numerico 0
NaN == NaN // false, es el unico valor negativo que no es igual a si mismo
0 == false // true
"" == false // true son falsos por la 'Automatic type conversion'
/** En comparacion de strings,
* se compara uno por uno en cada posicion, de izq a der
* y se compara su valor en unicode
* */
'Z' < 'a' // true
'hola que hace' != 'hola que mira' // true
'hola que quiere' == 'hola mi vida' // false
/** Si no deseas la Automatic type conversion */
//===, !==
'' === false // false
null === undefined // false, recuerda que null es tipo objeto y undefined es su propio tipo
// Operadores que manejan solo un parametro
typeof('x') // string
-(52) // -52
!(true) // false
// Comparan o manejan dos parametros
10 - 2 // 8
3 > 2 // true
3 < 2 // false
/** En comparacion de strings, se compara uno por uno en cada posicion, de izq a der, y se compara su valor en Unicode posicion por posicion*/
'Z' < 'a' // true
'hola que hace' != 'hola que mira' // true
'hola que quiere' == 'hola mi vida' // false
/** El unico valor que no es igual a si mismo es NaN */
NaN == NaN // false
// Solo recuerda, que el ternario no ejecuta el return dentro de él
true ? 1 : 2 // 1
true ? 1 : 2 // true