Back to Developer
JavaScript
Grundläggande JavaScript för testare och utvecklare — språkgrunder, asynkronitet och OOP.
Grunder
const vs let vs var: vilken använder du och varför?
Använd
const som standard (bindningen kan inte tilldelas om), let när du behöver tilldela om, och undvik var — den har funktionsomfång och hissas med förvirrande beteende, medan const/let har blockomfång. Observera: const förhindrar omtilldelning, inte mutation: egenskaperna hos ett const-objekt kan fortfarande ändras.Vad gör map, filter och reduce, och hur skiljer de sig från forEach?
map transformerar varje element och returnerar en ny array av samma längd; filter returnerar en ny array med endast elementen som klarar ett predikat; reduce ackumulerar arrayen till ett enda värde. forEach itererar bara för sidoeffekter och returnerar inget. map/filter/reduce är rena (muterar inte originalet); push/pop/splice/sort muterar.Vad används destrukturering och spread-operatorn till?
Destrukturering packar upp värden från arrayer eller objekt till variabler:
const { name, age } = user, eller i funktionsparametrar function f({ id }). Spread (...) kopierar/slår ihop: const merged = { ...base, env: 'prod' } eller const all = [...a, ...b]. Spread-kopior är ytliga — nästlade objekt delas, klonas inte.Vad gör optional chaining (?.) och nullish coalescing (??)?
Optional chaining kortsluter till
undefined i stället för att kasta fel när ett mellanvärde är null/undefined: res.data?.user?.name. Nullish coalescing returnerar högra sidan endast när vänstra är null eller undefined (inte för 0 eller '', till skillnad från ||): const total = res.data?.order?.total ?? 0. Båda är vanliga när man verifierar formen på API-svar.Asynkronitet & OOP
Vad är en Promise och vilka tillstånd kan den ha?
En
Promise representerar det eventuella resultatet av en asynkron operation. Den är pending medan den pågår, fulfilled vid framgång (hanteras med .then), eller rejected vid fel (hanteras med .catch); .finally körs alltid. Promise.all kör många parallellt och avvisas om någon misslyckas, Promise.allSettled väntar på alla oavsett utfall, och Promise.race löser med den första som blir klar.Hur förhåller sig async/await till Promises, och sekventiell vs parallell await?
async/await är syntaktiskt socker över Promises: en async-funktion returnerar alltid en Promise, och await pausar inuti den tills Promisen blir klar, med fel hanterade via try/catch. Att await:a i sekvens (await a; await b) är långsamt; kör oberoende arbete parallellt med await Promise.all([a, b]).Vad behöver man veta om JavaScript-klasser?
En klass har en
constructor som sätter instansfält med this, instansmetoder, och statiska medlemmar som nås på själva klassen (MathUtils.PI), inte på instanser. Getters/setters exponerar beräknade eller skyddade egenskaper (get fahrenheit(), set celsius(v) med validering). Statiska factory-metoder som ApiResponse.ok(body) är ett rent sätt att skapa vanliga instanser.Hur fungerar arv och polymorfism i JavaScript?
En subklass använder
extends och måste anropa super(...) i sin constructor innan this används; den kan åsidosätta metoder och anropa super.metod() för att utöka beteendet. Polymorfism innebär att samma anrop beter sig olika per klass — t.ex. en lista av Vehicle/Car/Motorbike som var och en implementerar info(). instanceof kontrollerar prototypkedjan.Hur kapslar man in tillstånd i JavaScript?
Använd privata klassfält med prefixet
# (this.#balance) så att de inte kan läsas eller skrivas utifrån; exponera kontrollerad åtkomst via getters och metoder som validerar indata. Den klassiska metoden före # är en closure (en factory-funktion med en privat variabel). Att returnera en kopia (t.ex. [...this.#history]) undviker att läcka interna referenser.Vilka designmönster dyker ofta upp i testramverk?
Singleton (en delad instans, t.ex. en
Config), Factory (bygga konfigurerade objekt, t.ex. en HttpClient per miljö), Builder (flytande steg-för-steg-konstruktion, t.ex. en RequestBuilder) och Observer/EventEmitter (prenumerera på händelser, som en test runner som sänder pass/fail). Dependency injection — att skicka in samarbetspartners i stället för att hårdkoda dem — gör alla dessa lätta att mocka.