Introducció
Tots hem escrit aquella funció útil anomenada twoSum: recórrer un array, trobar dos números que sumin un objectiu i retornar els seus índexs. Sembla senzill, però en JavaScript un valor tan innocent com 0 pot convertir-se en un parany subtil.
La idea bàsica que molts fem servir és mantenir un mapa de valors a índexs i, per a cada element, calcular el complement amb target menys el valor actual. Si el complement és al mapa, retornem els índexs. En aparença funciona en exemples simples com [2, 7, 11, 15] amb target 9 que retorna [0, 1].
El problema sorgeix quan l'índex emmagatzemat al mapa és 0. Si es verifica l'existència amb una comprovació de veritat tipus if (map[complement]) el valor 0 es considera falsy i la condició falla. Per exemple amb l'array [3, 2, 4] i target 6 la solució correcta és [1, 2], però el codi pot retornar un array buit perquè map[3] és 0 i la comprovació falla.
Explicació pas a pas: guardem índexs a map; quan complement és 3 guardem map[3] = 0; la condició if (map[complement]) avalua a fals si map[complement] és 0; per tant s'ignora una coincidència vàlida.
La solució és no confiar en verificacions de veritat que fallin amb 0 o amb altres valors falsy. En lloc d'això es pot fer servir hasOwnProperty per comprovar si la clau existeix: if (map.hasOwnProperty(complement)). O alternatives segures són fer servir key in obj o fer servir typeof obj[key] !== undefined comparant amb la cadena undefined en la pràctica del llenguatge. També és possible fer servir Object.prototype.hasOwnProperty.call(map, complement) per evitar col·lisions amb propietats heretades.
Amb aquest canvi l'algorisme torna a funcionar correctament i retorna [1, 2] en el cas anterior. La moral és que en JavaScript 0, null, undefined, false, cadena buida i NaN són valors falsy, per tant if (obj[key]) pot trencar la lògica si el valor legítim és 0 o false.
Cas real: em vaig trobar aquest bug en una petita app front end on mapejava l'estat de components a identificadors de camps de formulari. El camp amb id 0 se saltava en la validació i la fallada va trigar a aparèixer fins que vaig revisar la comprovació d'existència de les claus.
Bones pràctiques ràpides: evitar if(obj[key]) si key pot mapejar a 0 o false; fer servir obj.hasOwnProperty(key) o key in obj; per a comparacions més explícites emprar typeof obj[key] per detectar undefined. Entendre la truthiness de JavaScript ajuda a evitar sorpreses.
Q2BSTUDIO i com podem ajudar
En Q2BSTUDIO som una empresa especialitzada en desenvolupament de programari i aplicacions a mida. Oferim serveis de programari a mida i solucions d'aplicacions a mida alineades amb les necessitats del negoci. Som experts en intel·ligència artificial i podem integrar IA per a empreses mitjançant agents IA personalitzats i solucions de machine learning que milloren processos i experiències d'usuari.
També prestem serveis de ciberseguretat per protegir aplicacions i dades, i disposem de serveis cloud aws i azure per desplegar infraestructures escalables i segures. Els nostres serveis d'intel·ligència de negoci inclouen implementacions de power bi i pipelines de dades per transformar informació en decisions accionables.
Si necessites desenvolupar programari a mida, integrar intel·ligència artificial en els teus processos, desplegar al núvol amb serveis cloud aws i azure, o millorar la seguretat amb ciberseguretat professional, en Q2BSTUDIO podem ajudar-te amb solucions clau en mà i consultoria tècnica.
Resum ràpid TLDR
Evita if(obj[key]) quan key pugui retornar 0, false o altres valors falsy. Fes servir hasOwnProperty, key in obj o comprovacions de typeof per detectar l'existència de claus. La truthiness de JavaScript és útil però pot provocar bugs difícils de detectar.
Vols que revisem el teu codi o dissenyem una solució a mida amb intel·ligència artificial, agents IA, power bi i serveis cloud aws i azure? Contacta amb Q2BSTUDIO per a una consultoria personalitzada en desenvolupament, programari a mida, ciberseguretat i serveis d'intel·ligència de negoci.


