Permalänk
Avstängd

JS: nybörjare undrar

Jag hittade det här på stackoverflow:

var nua = navigator.userAgent; var is_android = ((nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1) && !(nua.indexOf('Chrome') > -1));

Variabeln is_android tycks vara boolean och ger antingen true eller false. Vad är det som styr att den är boolean?

Permalänk
Medlem

Det som står efter lika med teckenet är i stort sett en if sats. Dock är den rätt dåligt skriven..
Eftersom det finns en evaluation av något i den blir det implicit en boolean. (X > -1 osv)..

T.ex;
var random = (2 > 1 && 1 > 2)

blir

var random = (true && false) = false, och den slutar som en boolean.

Permalänk
Medlem

Nu kan inte jag särskilt mycket JS. Men det ser ut som att den kontrollerar vilken webbläsare användaren använder.

Visa signatur

Speldator: i5 4670k stock | 8GB ram | Asus Z87-plus | Xonar Essence STX | SSD: Intel g2 , Samsung 830 256gb | R9 290 Tri-x | Define R4| Win 8 | Noctua nh-u12p | Qpad Mk-50
marinlik.wordpress.com/ Min blogg för nedbrytning av spel och diverse andra artiklar om NFL
500px.com/niclasbrundell

Permalänk
Medlem
Skrivet av Marinlik:

Nu kan inte jag särskilt mycket JS. Men det ser ut som att den kontrollerar vilken webbläsare användaren använder.

Inte direkt, den kollar webbläsarens user agent och gör en uteslutesmetod för att ta reda på om man sitter på en Android device eller inte. Men det finns mycket bättre sätt att göra det på.

Dock var hans fråga varför det blir en boolean inte vad den gör.

Permalänk
Avstängd

Tack!

Skrivet av Rupenbritz:

Det som står efter lika med teckenet är i stort sett en if sats. Dock är den rätt dåligt skriven..
Eftersom det finns en evaluation av något i den blir det implicit en boolean. (X > -1 osv)..

T.ex;
var random = (2 > 1 && 1 > 2)

blir

var random = (true && false) = false, och den slutar som en boolean.

Permalänk
Hedersmedlem

I lite längre ord, och med klatschig färg:

Den är ett resultat av att använda jämförelseoperatorer ("lika med", "större än", "större än eller lika med", "mindre än", etc.) och logiska operatorer ("och", "eller", "inte"). Varför man jämför strängmetoden indexOf med talet −1 beror på hur den är utformad (−1 betyder att strängen inte hittades; ett icke-negativt tal betyder att strängen hittades på den position som talet anger; ett arv från språket C, kan man säga).

Ett jämförande påstående som "x > 7" (alltså "x är större än 7") ger "sant" eller "falskt". I detta fall så är det uttryck du citerar bara en logisk kombination av flera sådana uttryck, som i slutändan kommer reduceras till ett enda "sant" eller "falskt".

Man kan skriva ut jämförelseuttrycket som:

( nua.indexOf('Mozilla/5.0') > -1 && nua.indexOf('Android ') > -1 && nua.indexOf('AppleWebKit') > -1 ) && !(nua.indexOf('Chrome') > -1)

där varje "lång" rad är en jämförelse, som i sig kommer resultera i en boolean. Låt säga att det första blocket evalueras och alla tre test ger true. Detta block kommer då i praktiken lyda (true && true && true), vilket logiskt kommer ytterligare reduceras till ett enda true. Vi kan nu skriva uttrycket som:

true && !(nua.indexOf('Chrome') > -1)

Vi ser att uttrycket med den kvarstående jämförelseoperatorn kommer att ge antingen "falskt" eller "sant" beroende på om strängen 'Chrome' ingår i variabeln nua eller ej. Låt säga att strängen ingår i nua; då får vi:

true && !(true)

vilket efter att ha inkluderat den logiska negationen ger

true && false

Den logiska operatorn && ("och") ger "sant" om både uttrycket till vänster och uttrycket till höger är sanna. Det gäller inte här, så då reduceras uttrycket till

false

och vi har nått en boolean.

Uttrycket reduceras alltså med hjälp av jämförelse- och logikoperatorer tills bara en boolean återstår.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.