JS: varför funkar inte denna if...else?

Permalänk
Medlem

JS: varför funkar inte denna if...else?

Först av allt, jag kan inte javascript särskilt bra, men lyckas alltid pussla ihop enklare script med hjälp av tutorials och jättelånga trial/error sessioner. Men nu har jag stött på en if...else if som inte funkar och som jag inte lyckas reda ut. Detta är i en webextension för Firefox, baserad på Mozillas Your second extension (men otroligt nerskalad).

Jag har en variabel som växlar i värde beroende på vad man tidigare har klickat på. Men när jag kommer till reset() lyckas jag inte få testet att funka. Oavsett variabelns värde så exekveras if, även om det borde vara else if som exekveras. Fattar noll.

$printifyMode kan ha strängvärdet text eller images. I början av reset() kollar jag för säkerhets skull vilket värde den har för tillfället. Men oavsett om det poppar upp "text" eller "images" i konsolen så är nästa konsolmeddelande "resetmode is text", d.v.s., den första if valideras som sann även när strängvärdet är "images". Vad gör jag för fel? Har provat att använda integers också men problemet kvarstår.

function reset() { console.log(printifyMode); if (printifyMode = "text") { console.log("resetmode is text"); CSSremove = 'printifyText'; } else if (printifyMode = "images") { console.log("resetmode is images"); CSSremove = 'printifyImagesToo'; } browser.tabs.removeCSS({code: CSSremove}); }

Permalänk
Medlem

Du måste ha dubbla '==' för att jämföra. Enkelt '=' tilldelar bara ett värde till variabeln.

Permalänk
Medlem

@guermantes: när du jämför värden ska du använda två stycken =

Dvs
If(a == b)

Visa signatur

[4770k delid] [1080 EK] [PG348Q] [Custom loop][1.75TB SSD]

Permalänk
Medlem
Skrivet av guermantes:

Först av allt, jag kan inte javascript särskilt bra, men lyckas alltid pussla ihop enklare script med hjälp av tutorials och jättelånga trial/error sessioner. Men nu har jag stött på en if...else if som inte funkar och som jag inte lyckas reda ut. Detta är i en webextension för Firefox, baserad på Mozillas Your second extension (men otroligt nerskalad).

Jag har en variabel som växlar i värde beroende på vad man tidigare har klickat på. Men när jag kommer till reset() lyckas jag inte få testet att funka. Oavsett variabelns värde så exekveras if, även om det borde vara else if som exekveras. Fattar noll.

$printifyMode kan ha strängvärdet text eller images. I början av reset() kollar jag för säkerhets skull vilket värde den har för tillfället. Men oavsett om det poppar upp "text" eller "images" i konsolen så är nästa konsolmeddelande "resetmode is text", d.v.s., den första if valideras som sann även när strängvärdet är "images". Vad gör jag för fel? Har provat att använda integers också men problemet kvarstår.

function reset() { console.log(printifyMode); if (printifyMode = "text") { console.log("resetmode is text"); CSSremove = 'printifyText'; } else if (printifyMode = "images") { console.log("resetmode is images"); CSSremove = 'printifyImagesToo'; } browser.tabs.removeCSS({code: CSSremove}); }

Börja med att skriva === istället för ett enkelt = och se vad som händer.
Ett enskilt = betyder att du tilldelar ett värde.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

@guermantes:

'=' betyder tilldelning, '===' är likhetsjämförelse utan type coersion.

if (printifyMode = "text")

kommer därmed att gå till på följande sätt: Uttrycket 'printifyMode = "text"' returnerar "text" efter att tilldelningen är gjord. Alla strängar utom tomma strängen ("") tolkas som true och därmed körs if-satsen alltid (plus att printifyMode nu alltid har värdet "text" oavsett vad det var tidigare).

Else-satsen körs aldrig, men där har du samma problem.

Visa signatur

Vad har jag i min dator? Kopparrör.

Permalänk
Medlem

ooops...
Tack allihop!

Permalänk
Medlem
Skrivet av guermantes:

Först av allt, jag kan inte javascript särskilt bra, men lyckas alltid pussla ihop enklare script med hjälp av tutorials och jättelånga trial/error sessioner. Men nu har jag stött på en if...else if som inte funkar och som jag inte lyckas reda ut. Detta är i en webextension för Firefox, baserad på Mozillas Your second extension (men otroligt nerskalad).

Jag har en variabel som växlar i värde beroende på vad man tidigare har klickat på. Men när jag kommer till reset() lyckas jag inte få testet att funka. Oavsett variabelns värde så exekveras if, även om det borde vara else if som exekveras. Fattar noll.

$printifyMode kan ha strängvärdet text eller images. I början av reset() kollar jag för säkerhets skull vilket värde den har för tillfället. Men oavsett om det poppar upp "text" eller "images" i konsolen så är nästa konsolmeddelande "resetmode is text", d.v.s., den första if valideras som sann även när strängvärdet är "images". Vad gör jag för fel? Har provat att använda integers också men problemet kvarstår.

function reset() { console.log(printifyMode); if (printifyMode = "text") { console.log("resetmode is text"); CSSremove = 'printifyText'; } else if (printifyMode = "images") { console.log("resetmode is images"); CSSremove = 'printifyImagesToo'; } browser.tabs.removeCSS({code: CSSremove}); }

Skrivet av Kiane:

Du måste ha dubbla '==' för att jämföra. Enkelt '=' tilldelar bara ett värde till variabeln.

Skrivet av theo0019:

@guermantes: när du jämför värden ska du använda två stycken =

Dvs
If(a == b)

OBS!
I de flesta populära språken betyder "==" likhetsjämförelse, samt att saker som "1" == 1 returnerar false. Problemet med Javascript är att "==" genomför en vild och liberal typecasting som emellanåt kan få oönskade effekter (exempelvis att "1" == 1 är true). Vänligen se till att rekommendera "===" i alla lägen som standard, och reservera "==" till situationer där man verkligen vet vad man gör.

Visa signatur

Vad har jag i min dator? Kopparrör.

Permalänk
99:e percentilen

@guermantes, detta är verkligen ett klassiskt misstag. Det kan verkligen diskuteras hur vettigt det är att = betyder tilldelning och att tilldelningar dessutom är uttryck! Det vill säga, till skillnad från satser – till exempel if (c) s – som helt saknar värden och ej kan användas som om de hade värden, har uttrycket a = b värdet b (samt förstås sidoeffekten att tilldela det värdet till variabeln a).

@kirayatail har också alldeles rätt i att == aldrig borde användas eller rekommenderas, utom i vissa enstaka undantagsfall, och då bara där användningen verkligen är avsiktlig. (Ett sådant exempel, under vissa förutsättningar, kan vara x == null istället för x === null || x === undefined.)

Kan för övrigt tipsa om BB-taggen [cmd] för inline-kod.

Visa signatur

Skrivet med hjälp av Better SweClockers