JAVASCRIPT INTRODUKTION TIL INTRODUKTION TIL JAVASCRIPT KENNETH GEISSHIRT



Relaterede dokumenter
GMAIL LÆR DET SELV GMAIL LÆR DET SELV

JavaScript. nedarvning.

ONENOTE 2010 LÆR DET SELV

Kapitel 4 Løkker i C#

Noter til C# Programmering Iteration

Programmering I Java/C#

Programmering for begyndere Lektion 2. Opsamling mm

Python programmering. Per Tøfting. MacFest

Noter til C# Programmering Selektion

WINDOWS 7 FOR SENIORER

Exceptions i Delphi. Try except

INDHOLDSFORTEGNELSE. INDLEDNING... 7 Kristian Langborg-Hansen. KAPITEL ET... 9 I gang med App Inventor. KAPITEL TO...

Kapitel 3 Betinget logik i C#

Sproget Rascal (v. 2)

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Introduktion til funktioner, moduler og scopes i Python

EXCEL 2011 TIL MAC GODT I GANG MED PETER JENSEN GUIDE VISUEL

SWC eksamens-spørgsmål. Oversigt

Lær Python dag 1 - modul 1

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

DM507 Algoritmer og datastrukturer

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

G-MAIL (GOOGLE)

En lille vejledning til lærere og elever i at bruge matematikprogrammet WordMat (begynderniveau)

Eksempel: Skat i år 2000

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

EXCEL 2010 KURSUSHÆFTE TRIN 2 EXCEL 2010 KURSUSHÆFTE TRIN 2

Tillæg til Libris-hæftet: WordPress. Temaredigering og sikkerhed m.m.

Kom godt i gang med I-bogen

DM507 Algoritmer og datastrukturer

Klasse 1.4 Michael Jokil

Sproget Limba. Til brug i G1 og K1. Dat1E 2003

IT opgave. Informationsteknologi B. Vejleder: Karl. Navn: Devran Kücükyildiz. Klasse: 2,4

PHP Quick Teknisk Ordbog

Forelæsning Uge 2 Torsdag

Programmering i C. Lektion december 2008

Programmering i C. Lektion september 2009

Opgaveteknisk vejledning Word 2016 til Mac. Tornbjerg Gymnasium 10. december 2015

Python 3 kursus lektion 1:

POWERPOINT 2010 LÆR DET SELV POWERPOINT 2010 LÆR DET SELV

Andengradsligninger. Frank Nasser. 12. april 2011

Start på javascript. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 03. Feb 2009 af webstuff I kategorien Programmering / JavaScript

At klippe en streng over på det mest hensigtsmæssige sted

De rigtige reelle tal

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Zotero er et smart værktøj til at få styr på dine referencer og litteraturlister. Zotero er gratis og på dansk.

Test af It-komponent

Kom godt i gang med Fable-robotten

Vejledning til referencehåndteringssystemet. Forsvarets Bibliotekscenter Anita Elleby

2) Det er let at være produktiv med Python, da Python som regel kun har mellem 67 og 80% færre linier end tilsvarende C eller Java kode.

Kontrol-strukturer i PHP

Procesbeskrivelse - Webprogrammering

Greenfoot En kort introduktion til Programmering og Objekt-Orientering

Udarbejdet af CFU Absalon

Grundlæggende Matematik

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Andengradsligninger. Frank Nasser. 11. juli 2011

DANMARKS TEKNISKE UNIVERSITET

Jørgen Koch. Access. Opgavehæfte

INDHOLDSFORTEGNELSE. Et stort spring... 7 Jesper Bove-Nielsen, forlagsdirektør. KAPITEL ET... 9 Introduktion til Windows 7

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Forelæsning Uge 4 Torsdag

Dokumentation af programmering i Python 2.75

Kort introduktion til Google.

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

Lav din egen forside i webtrees

Baggrundsnote om logiske operatorer

DM507 Algoritmer og datastrukturer

It og informationssøgning Forelæsning september 2006 Nils Andersen. Gentagelser og tekster

Fable Kom godt i gang

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Adobe Acrobat Professional 11. ISBN nr.:

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

Opgaveteknisk vejledning Word 2011 til Mac. Tornbjerg Gymnasium 10. december 2015

Fable Kom godt i gang

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Kursus 02199: Programmering. Kontrol af programudførelsen. afsnit if (indkomst > ) topskat = (indkomst ) * 0.

Opgaveteknisk vejledning Word Tornbjerg Gymnasium 10. december 2015

Problemstilling ved DBK integration i BIM Software Hvad skal der til. Nicolai Karved, Betech Data A/S

MICROSOFT OUTLOOK 2010

Baggrund. Introduktion. Kan du genkende dig selv her:

WINDOWS LIVE MAIL

Introduktion til ActionScript

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Namespaces. Vi kan kvalificere elementer på denne måde: <?xml version="1.0" encoding="iso "?>

Forelæsning Uge 2 Mandag

Databaseadgang fra Java

DM507 Algoritmer og datastrukturer

Regulære udtryk, 2. del

Forelæsning Uge 4 Torsdag

Anvendelse af metoder - Programmering

EXCEL 2010 KURSUSHÆFTE TRIN 1 EXCEL 2010 KURSUSHÆFTE TRIN 1

vorbasse.dk Redaktørmanual Kentaur

Indhold. Produkter oprettelse og vedligehold v Side 2 af 20

Hjælp under login på Mit DLR Oktober 2015

En open source løsning til bibliotekernes publikumspc ere

Specialiseringen Rapport Lavede Af Rasmus R. Sørensen Side 1 af 6

Transkript:

INTRODUKTION TIL JAVASCRIPT KENNETH GEISSHIRT INTRODUKTION TIL JAVASCRIPT Lær at programmere i Javascript Sprogets opbygning og syntaks Blokke, forgreninger og løkker

Introduktion til Javascript 1. udgave, 1. oplag 2010 Copyright 2010 Forlaget Libris Forfatter: Kenneth Geisshirt Forlagsredaktion: Peter Svendsen Omslag: Per-Ole Lind DTP: Jan Nyborg Tarbensen Korrektur: Jens Lyng Tryk: Norhaven A/S ISBN: 978-87-7843-917-8 Om Libris Libris er sat i verden for at gøre vanskeligt stof tilgængeligt og anvendeligt for både professionelle og almindelige brugere. Siden 1994 har vi gjort det inden for Computer og it Digitalfoto Job, karriere og erhverv Sundhed og sygdom Alene i Danmark er hæfterne solgt i over otte millioner eksemplarer, og vores titler udgives i 14 europæiske lande. Besøg Libris.dk Besøg os på libris.dk, hvor du finder alle vores udgivelser. Her kan du også give os kommentarer og tilmelde dig vores gratis nyhedsservice. På www.libris.dk/bilag kan du hente eventuelle øvelsesfiler, smagsprøver og opdateringer. Fås overalt Vores udgivelser kan købes i alle boghandler. It-hæfterne fås tillige i større computerforretninger, og flere større kiosker fører et udvalg af vores hæfter. Er der et hæfte, du ikke kan finde, så kan boghandleren normalt skaffe det hjem på et par dage. Hæfterne kan også købes på Libris.dk, men vær klar over, at der tillægges et ekspeditionsgebyr.

Indhold Indledning...4 Implementeringer...5 Historien...5 Opbygning af hæftet...6 Download...6 Taksigelser...6 1. Sproget...7 Hvad er en linje?...7 Konstanter...7 Navne...8 Udtryk...8 Arrays...9 Blokke...11 Forgreninger...11 Løkker...12 Undtagelser...13 Funktioner...13 Closures...14 Objekter...15 2. Objektorienteret programmering... 17 Attributter...17 Metoder...17 Constructor...19 Prototype...19 Differentiel nedarvning...20 Refleksion...20 Kloning...20 Beskyt attributter...21 3. DOM...23 HTML som objekter...23 Andet end HTML...24 Alle skal have et ID...24 Find elementer...25 Hændelser...26 Leg med stil...27 Indsæt nye elementer...29 4. AJAX...31 HTTP request...31 Browser-specifik...32 Frontend...33 Backend...34 JSON...35 5. Prototype...37 Installation...37 Metoder og attributter...37 De magiske $-funktioner...37 Arrays...39 AJAX...40 Hændelser...41 En slags klasse...43 Flotte effekter...44 6. jquery...46 Installation...46 Find elementer...46 Skift mellem jquery og $...47 Arrays og anden hjælp...48 Hændelser...48 AJAX...49 Effekter...50 Plugins...50 7. Dojo...53 Installation og konfiguration...53 Find elementer...53 Hændelser...54 Closures...55 AJAX...56 Effekter...58 Træk/slip...59 8. YUI...60 Installation...60 Det globale objekt...60 Find og brug elementer...61 Arrays...61 Hændelser...62 AJAX...63 Effekter...64 Træk/slip...65 9. Afslutning...66 Firebug...66 Javascript i fremtiden...67 Bøger...67 Stikordsregister...68 3 FORLAGET LIBRIS

Indledning Dette er et hæfte om Javascript et programmeringssprog som har stor medvind i disse år. Mange mennesker har aldrig hørt om det, men bruger applikationer skrevet i Javascript hver dag. Web-applikationer som Gmail og Facebook indeholder mange funktioner, som er skrevet i Javascript. Hos dem, som har hørt om sproget, forbindes det med web-applikationer. Du sidder måske med dette hæfte, fordi du er software-udvikler og skal til at skrive applikationer til internettet og web-browsere. Eller måske er du en webdesigner, som gerne selv vil give dit flotte design liv i form af programkode, som vekselvirker med dine brugere. Hæftet er til dig, så du hurtigt kan komme i gang. Det er rigtigt, at Javascript er et programmeringssprog, som har sin store base i webapplikationer. Alle web-browsere i dag har Javascript indbygget. Men du finder også Javascript mange andre steder. Dashboard til Mac OS X, Microsoft Gadgets (Windows Vista og 7) og Google Gadgets bruger alle Javascript til udvikling af komponenter. Adobe ActionScript er et programmeringssprog, som er baseret på Javascript. Endvidere kan du udvikle applikationer til de to open source desktop-miljøer GNOME og KDE i Javascript. Du kan sige, at sproget er sprunget ud af web-browseren og har fundet vej til mange andre dele af din computer. Du vil opdage, at jo mere du arbejder med Javascript, jo gladere bliver du for sproget. Det er et utroligt elegant sprog, og du kan meget ofte skrive meget kompakt kode i det. Personligt har jeg for ikke lang tid siden implementeret et lille graf-bibliotek i Javascript. Formålet var at foretage afhængighedsanalyser, og kildeteksten for topologisk sortering (Du kan læse mere om grafer og topologisk sortering på Wikipedia: http://en.wikipedia.org/wiki/topological_sort) endte med at være meget kort og læselig. Som programmeringssprog har Javascript en række vigtige egenskaber, du bør kende: Det er et fortolket sprog. Det er objektorienteret (dog uden brug af klasser). Det har et dynamisk og svagt typesystem. Funktioner er første-klasse medlemmer og er objekter. Når der ikke er klasser, men objekter, skal nedarvning og lignende begreber fra objektorienteret programmering (OOP) naturligvis gøres på anden vis. I Javascript løses det ved at anvende en skole inden for OOP, nemlig den prototype-baserede. Hvad det helt præcis betyder, vil du læse om i kapitel 2. Det dynamiske typesystem betyder egentlig bare, at Javascript-fortolkeren selv finder ud af hvilken type en variabel har på et givent tidspunkt. Samtidig vil der ske en konvertering af typen, hvis Javascript-fortolkeren finder det nødvendigt. Du kan sige at typen ikke følger variablen men den værdi, som variablen har. I visse datalogiske kredse omtales sådan et typesystem som duck typing (hvis det rapper som en and og vralter som en and, så er det en and 42 er et heltal fordi du kan gange det med andre tal, det indeholder ikke bogstaver, etc.). Det, der gør funktioner i Javascript specielle, er, at de ikke er specielle. En funktion er et objekt på samme måde, som tallet 42 er et objekt. Det giver dig mulighed for at bruge funktioner på en helt anden måde end i mange andre programmeringssprog. I dette hæfte vil du finde mange nyttige eksempler, hvor funktioner er objekter. FORLAGET LIBRIS 4

Indledning Implementeringer Nogle programmeringssprog har det med at blive implementeret få gange. PHP og Perl er eksempler på sprog, hvor der kun er én implementering. Andre sprog har mange implementeringer C, C++ og Javascript hører til denne kategori. Alle nutidige web-browsere understøtter Javascript og har hver sin implementering af sproget. I det store hele er implementeringerne ens, men der findes dog små forskelle. I tabellen nedenfor finder du en række implementeringer, som er i brug. Åben i kolonnen Licens henviser til open source software. Godt nok er Javascript-fortolkerne stabile og hurtige, men udviklingen af Javascriptimplementeringer stopper ikke. Der arbejdes p.t. på at tilføje Jit (Just-in-Time) oversættelse af Javascript-programmer, så de kan afvikles endnu hurtigere. Google har allerede taget hul på denne udvikling med V8, og de andre leverandører er lige i hælene på dem. Historien Javascript er som sprog udviklet helt tilbage i 1995 af Brendan Eich for Netscape Corp. I starten hed det egentligt LiveScript, men skiftede navn, da Netscape og Sun (nu Oracle ejeren af Java) indgik et partnerskab, og alt skulle hedde noget med Java. Ideen var og er stadig at give web-udviklere et værktøj til at udføre funktioner ude hos brugeren. På den måde kan brugerens input valideres, inden de sendes til serveren, og det er muligt at give brugeren hurtigere respons på hvad hun foretager sig. Det er værd at huske at i 1995 brugte langt de fleste brugere af internettet modems og havde en båndbredde på under 50 kbps. Filosofien var, at jo mindre data som sendes mellem browser og server, jo bedre. Men allerede nogle år før Netscape havde firmaet Nombas udviklet et objektorienteret programmeringssprog baseret på C. Sproget hed i begyndelsen Cmm (C-minus-minus), men skiftede navn til Cenvi og senere til ScriptEase. Nombas udviklede og markedsførte en plugin til tidens web-browsere, så det var muligt at skrive programmer som kunne afvikles direkte i browseren. Sproget Cmm var en af Brendan Eichs inspirationskilder. Efter Netscape introducerede Javascript, fulgte Microsoft hurtigt med og udviklede en implementering af sproget og dets runtime-miljø til Internet Explorer version 3. Med andre ord har Javascript været en mulighed på internettet siden midten af 1996 hvor tidens to store browsere, (Netscape Communicator 2 og Internet Explorer 3), begge havde Javascript. For at sikre Javascript et bedre offentligt liv, overgav Netscape specifikationen af sproget til standardiseringsorganisationen ECMA (European Computer Manufacturers Association) og siden 1997 har ECMAscript været en åben standard. ECMAscript er det officielle navn for sproget, mens Javascript i princippet kun refererer til en bestemt implemen- Fortolker Leverandør Bruges i Licens JScript Microsoft Internet Explorer Lukket Futhark Opera Software Opera Lukket SpiderMonkey Mozilla Firefox Åben Rhino Mozilla Desktoppen/Java-programmer Åben JavaScriptCore Apple Safari Åben V8 Google Chrome Åben 5 FORLAGET LIBRIS

Indledning tering nemlig Mozillas implementering. I dette hæfte og det meste af verden er navnet Javascript det mest udbredte. I december 2009 frigav ECMA den femte udgave af ECMAscript. Det er nu op til leverandørerne at implementere de nyeste ændringer i deres fortolkere. Opbygning af hæftet Hæftet kan groft taget deles op i tre dele. De to første kapitler omhandler Javascript som sprog. Kapitel 1 viser dig sproget syntaksen og dens betydning. I kapitel 2 vil du læse, hvordan klasseløse objekter kan bruges til objektorienteret programmering. Eftersom Javascript bruges primært i webbrowsere, vil du komme tæt på, hvordan Javascript er integreret med en browser, i kapitel 3. I de sidste par år er web-applikationer blevet mere interaktive end tidligere. Især en teknik ved navn AJAX har haft stor betydning hele kapitel 4 er fokuseret på AJAX. Nutidens browsere stiller et stort runtimemiljø til rådighed for web-udvikleren. Desværre er hver implementering lidt forskellig fra de andre. Det gør, at web-applikationer bliver unødig komplekse, da du ikke på forhånd kender dine brugere og hvilke webbrowsere de anvender. Software-biblioteker som prototype.js, jquery, Dojo og YUI har set dagens lys og tilbyder dig hjælp til at reducere kompleksiteten. Mens prototype. js og jquery er gode biblioteker, hvis du ønsker at give eksisterende applikationer lidt liv, er Dojo og YUI komplette framework til udvikling af store, komplekse web-applikationer. Disse fire biblioteker har fået et kapitel hvert. Men det er ikke muligt at give en fuldstændig introduktion på så kort plads. Du skal derfor læse kapitlerne 5-8 for at søge inspiration til dit valg af software-bibliotek. Download Hæftets kodeeksempler kan hentes på nettet. Gå ind på www.libris.dk/bilag og klik på hæftets titel. Kodeeksemplerne ligger samlet i én fil, som du kan downloade. Taksigelser Jeg vil gerne takke Peter Svendsen og resten af Libris for at give mig mulighed for at skrive om et af tidens bedste programmeringssprog. Libris har været en professionel sparringspartner i udgivelsen af hæftet med mange vigtige bidrag. Endvidere vil jeg gerne takke Hans Henrik Møller for hans henvisninger til Javascripts tidligere historie. Hans Henrik korrigerede mig høfligt i en pause under et foredrag om Javascript og fortalte, at han for lang tid siden havde programmeret i Javascripts næsten ukendte forfader. En del aftener og søndage har jeg tilbragt foran computeren og skrevet. Jeg skylder min familie, Svea, Svante og Pia, en stor tak for tålmodigt at lade mig få fred til at skrive. FORLAGET LIBRIS 6

1. Sproget Javascript er et generelt og fuldstændigt programmeringssprog, og det er på højde med andre sprog. Når du kradser lidt i overfladen, ligner Javascript sprog som C, C++ og Java. Men går du sproget efter i sømmene, vil du opdage et sprog, som har sin helt egen elegance og nogle ganske få mørke sider. I dette kapitel kommer du igennem et kort kursus i Javascript. Det er en god idé at lege med sproget ved at skrive en række små programmer og se, hvordan de forskellige sprogelementer virker. Har du tidligere programmeret i f.eks. C, C++ eller Java, vil du hurtigt føle dig hjemme. Hvad er en linje? Det virker måske som et tåbeligt spørgsmål. Men enhver designer af et programmeringssprog er nødt til at beslutte, hvad en linje er (den engelske betegnelse er statement). Du skal ikke tage ordet linje for bogstaveligt. Der kan godt være tegnet linjeskift som en del af en linje. Ud over tegnet linjeskift opfattes mellemrum og tabulator som blanktegn i Javascript, og de har ingen betydning. To linjer adskilles med semikolon (;). Kommentarer i Javascript kommer i to udgaver. Den første er meget enkel: Javascriptfortolkeren ignorerer alle kommentarer fra og med tegnene // og til og med tegnet linjeskift. Den anden form for kommentarer er alt mellem /* og */. Den første udgave foretrækkes blandt langt de fleste Javascriptudviklere. message = "Hello, World"; z = 1 / (x+y); // udtrykket over to linjer Eksempel: eks1-1.js Konstanter Javascript er et sprog med et svagt typesystem. Det betyder, at du ikke behøver at angive typen for en variabel eller en konstant, og konvertering mellem typerne sker helt automatisk. Et svagt typesystem er ikke ensbetydende med, at der ikke findes typer. Logiske værdier Logiske værdier (eng. boolean) er sande (true) eller falske (false). Der er dog en række andre værdier, som også betragtes som falske. Det drejer sig om null, NaN, '' (den tomme streng), 0 og undefined. Alle andre værdier betragtes som sande. Konstanten NaN er Not a Number og kan være resultatet af en numerisk udregning, som ikke giver mening. Det er værd at bemærke, at Javascript både har en værdi for ingenting (null) og udefineret (undefined). Tal Tal er tal og det er både heltal og kommatal. Javascript skelner ikke mellem de to slags tal modsat så mange andre programmeringssprog. Det betyder, at tallet 1 og 1.0 er det samme tal! Det er muligt at arbejde med både positive og negative tal, men negative tal angives faktisk som et udtryk gennem minus-operatoren. Du vil ikke tænke over det, når du programmerer. Heltal giver sig selv; du skriver blot tallets cifre. Kommatal skrives med punktum (.) for at angive, hvor heltalsdelen slutter, og bogstavet e (eller E) bruges til at angive 10 er potenser. Der er to særlige tal: NaN er omtalt i afsnittet før, og med Infinity kan du angive uendelig. I Javascript begynder uendeligt allerede ved ca. 1,7979 10 308. NaN kan ikke være lig med noget andet tal inkl. NaN. 7 FORLAGET LIBRIS

1. Sproget Strenge En streng (eng. string) er en sekvens af tegn (evt. nul tegn). Du angiver en streng vha. citationstegn. På dit tastatur er der både enkelte og dobbelte citationstegn, og de er begge lige gode. Du skal dog afslutte strenge med samme slags, som du begyndte med. Har du brug for at skrive noget i citationstegn inde i strengen, kan du bruge det andet citationstegn i forhold til den form, som omslutter strengen. Et par enkle eksempler på strenge er: "Hello", 'world', "Don't panic". Du kan bruge alle tegn fra (16 bits) Unicode i dine strenge, og det er på den måde muligt at skrive både amerikansk, dansk og japansk i dine Javascript-programmer. Der findes en række styrekoder eller escape-sekvenser. De er taget fra UNIX, og med dem kan du f.eks. angive linjeskift (\n), tabulator (\t), backslash (\\). Der findes en rar streng-operator, nemlig + (plus). Med + kan du sammenkæde to strenge til en ny streng. Den implicitte typekonvertering og sammenkædningsoperatoren kan du bruge i mange sammenhænge. Du kan f.eks. kæde en streng sammen med et tal. Tallet konverteres først til en streng, og derefter sammenkædes talstrengen med strengen. Endvidere har alle strenge metoden length, som angiver hvor mange tegn strengen indeholder. s = "Hello"; t = "World"; print(s+" "+t); n = 12345; print((""+n).length); // antal cifre i n Eksempel: eks1-2.js Navne Navne i et programmeringssprog bruger du til variabler og funktioner. Javascript følger denne tradition. Det er vigtigt at huske, at der er forskel på store og små bogstaver. Generelt kan navne bestå af bogstaver, cifre og tegnene _ (underscore) og $ (dollar). Der er det lille krav, at et navn ikke må begynde med et ciffer. Eksempler på gyldige navne er: efternavn, Adresse2, _intern, penge$. Generelt er det en god idé, hvis du holder dig til bogstaverne i det engelske alfabet. Udtryk Udtryk kan i Javascript være lige så komplicerede, som du har brug for. De mest enkle udtryk er blot en konstant, men du kan udregne, foretage sammenligninger, kæde strenge sammen og kalde funktioner. Alt dette benævnes som udtryk. Har du bare den mindste erfaring med programmering, kender du reglerne for udtryk også i Javascript. Regneudtryk minder meget om ganske almindelige udregninger, som du finder i enhver bog om matematik. De mest enkle udtryk er enten en konstant (tal, streng, etc.) eller en variabel. Parenteser er gode til at gruppere deludtryk. Er du i tvivl om, det er nødvendigt at sætte parentes omkring et deludtryk, så gør det. Det skader bestemt ikke, og du mindsker risikoen for fejl. Det er muligt at dele udtryk ind i forskellige grupper. Den første gruppe er udtryk med en præfiks-operator. I Javascript er der seks forskellige præfiks-operatorer: + (plus), - (minus),! (logisk ikke), typeof, new samt delete. De tre første kender du fra matematik, mens typeof giver dig typen af et udtryk (som streng). Eftersom Javascript har et svagt typesystem med implicit typekonvertering, er det ofte meget nyttigt at kunne tjekke typen på en variabel el.lign. De sidste to operatorer bruges hhv. sammen med objekter og arrays, som du kan læse mere om senere i kapitlet. Endvidere er det kun de fire første præfiks-operatorer, som virker direkte på et deludtryk. Der findes en lang række operatorer, som kræver to udtryk et på hver side. Du skal bide mærke i, at operatoren + også kan bruges sammen med strenge. Er det ene eller FORLAGET LIBRIS 8

1. Sproget begge deludtryk strenge, kæder + dem sammen til en lang streng. Er det ene deludtryk et tal, konverterer Javascript først tallet til en streng, og kæder dem sammen. Funktioner kan også kaldes som en del af et udtryk, men det kræver at den kaldte funktion returnerer en værdi. En arv fra programmeringssproget C er operatoren?:. Det er en forgrening, som vælger enten det andet eller det tredje deludtryk ud fra sandhedsværdien af det første deludtryk. Det er en lidt speciel konstruktion. Det kan være svært at læse og forstå udtryk, hvor?: indgår, og det er ofte bedre at opbygge sådanne udtryk over en række trin med if-konstruktionen. I tabellen nedenfor finder du Javascripts forskellige operatorer. Jo højere oppe i tabellen en operator står, jo højere præcedens har den. Præcedens i et programmeringssprog fortæller, hvor stærk en operator er. Da parenteser står øverst, kan du gøre en operator med lav præcedens stærkere ved at sætte den i parentes. Det lyder nok flyvsk, men du kender det fra matematik, hvor 2 3+4 ikke er det samme som 2 (3+4) idet multiplikation har højere præcedens end addition. Operatorer Bruges til. [] () Kald, indeksering og gruppering delete new typeof + -! Præfiks-operatorer * / % Multiplikation, division og modulo (divisionsrest) + - Addition og subtraktion >= <= > < Ulighed!== === Lighed && Logisk og Logisk eller?: Forgrening Der findes også operatorerne!= og ==, men i næsten alle tilfælde er det ikke anbefalet at bruge dem. I eksemplet nedenfor finder du en række små udtryk. var x, y, z; x = 2; y = 3; print('x*y='+x*y); z = (x<y)?5:6; print('z='+z); print('x*y+z='+x*y+z); print('x*(y+z)='+x*(y+z)); Eksempel: eks1-3.js Arrays Javascript har mange indbyggede typer, og arrays er en af dem. Et array er en tabel eller en slags mængde. Hvert element har et indeks, som du bruger til at få værdien. Heldigvis siger Javascript-standarden, at der skal være et objekt, som giver dig arrayagtig funktionalitet. Det objekt hedder Array. Det implementerer langt det meste, du ønsker dig af et array. I Javascript er indeks et heltal, og første element har indeks 0. Der er to måder at oprette et nyt array på. Den første er at bruge Array som constructor (new Array()). Det er ikke anbefalet (se kapitel 2). Den anden måde er at bruge kantede parenteser ([]). Elementer kan tilføjes ved oprettelsen ved at skrive dem imellem de kantede parenteser med komma imellem. Skriver du ingen elementer ved oprettelse, får du oprettet et tomt array. Der er ingen begrænsninger i, hvad et element kan være. Senere i dette kapitel kan du læse mere om objekter, og elementerne i et array skal være objekter. Endvidere behøver elementerne ikke at være af samme type, dvs. dit array kan bestå af strenge og tal samtidig. Eftersom et array er et objekt, kan du godt have et array af arrays. Et array af arrays er Javascripts måde at implementere fler-dimensionale arrays. 9 FORLAGET LIBRIS

1. Sproget Spørger du til et ikke-eksisterende element, er værdien undefined. Et ikke-eksisterende element rammer du ind i, hvis du bruger et indeks, som ikke har et tilhørende element. Med andre ord, det giver ingen fejl hvis du rammer uden for et array. Du bør derfor altid tjekke værdien, før du bruger den. Har du brug for at undersøge alle elementerne i et array, kan du bruge for..in konstruktionen. Med operatoren delete kan du slette et element i dit array. Du angiver ganske enkelt elementet vha. indeks, f.eks. delete a[2] sletter det tredje element i arrayet a. I eks1-4.js finder du en række små eksempler på, hvordan du kan bruge arrays. Der findes en del metoder, som du kan bruge på dine arrays. De er opsummeret i tabellen nedenfor. Endvidere har ethvert array en a = [3.14, 2.71]; print('a har '+a.length+' elementer'); print('sorteret: '+a.sort(function(a,b) { return a-b; )); a[a.length] = 1.0; print('ekstra element: '+a); delete a[1]; print('og næsten slettet: '+a); a.splice(1, 1); print('slettet helt: '+a); b = ["Hello", 1, "World"]; print('blandede typer: '+b); for(i in b) { print('element '+i+' er '+b[i]); Eksempel: eks1-4.js attribut ved navn length. Den giver dig antal elementer i arrayet. Sætter du length til nul, fjerner du alle elementer i dit array. Metode Funktion Eksempel concat(data) Opretter et nyt array hvor data er føjet til et array (virker også hvis data er et array). A = [1,2,3] b = [4,5,6] a.concat(b) [1,2,3,4,5,6] join(streng) Sætter alle elementer sammen til en streng. a = [1,2,3] a.join(':') '1:2:3' pop() Fjerner sidste element og returnerer elementet. a = [1,2,3] a.pop() 3 og a=[1,2] push(data) Tilføjer data til et array. a = [1,2,3] a.push(4) a=[1,2,3,4] reverse Vender rækkefølgen om på elementerne. a = [1,2,3] a.reverse() a=[3,2,1] shift() Fjerner første element og returnerer det. a = [1,2,3] a.shift() 1 og a=[2,3] slice(start,slut) Kopierer elementer fra start til slut. a = [1,2,3,4] a.slice(1,3) [2,3] sort(f) Sorterer elementerne vha. funktionen f. Uden f sorteres elementerne som strenge (og så kommer 10 før 9). splice(start, antal, data) Sletter elementer fra start og et antal frem. Er data ikke-tom, erstattes de slettede elementer med data. a = [5,2,3,1,4] a.sort(function(a,b) {return a-b;) a=[1,2,3,4,5] a = [1,2,3,4] a.splice(1,2) [2,3] og a=[1,4] unshift(data) Tilføjer data i begyndelsen. a = [1,2,3] a.unshift(7) a=[7,1,2,3] FORLAGET LIBRIS 10

1. Sproget Blokke Du kan gruppere linjer af kode i blokke. En blok er omsluttet af krøllede parenteser ({). Blokke bruges mange steder i Javascript og det vil du se i det efterfølgende afsnit. Men blokke er en af Javascripts mest mørke sider. Mens alle moderne programmeringssprog definerer virkefeltet (eng. scope) til at følge blokke, gør Javascript det ikke. Et virkefelt er en variabels levetid. I sprog som Java og C++ kan du erklære en variabel inden i en blok, og variablen er så kun synlig i den blok. Javascript har et noget anderledes virkefelt. Enten er virkefeltet globalt eller hører til en funktion. Hvis du erklærer en variabel i en blok inde i en funktion, vil variablen være synlig uden for blokken. Og variablen lever videre, efter udførelsen af blokken er afsluttet. Nedenfor finder du et eksempel på, hvordan Javascripts lidt mærkelige virkefelt fungerer. Du skal med andre ord bryde vanen med sene erklæringer af variabler og holde dig til kun at have globale variabler eller variabler erklæret i begyndelsen af en funktion. var x = 1; print("x = "+x); // x = 1 - ok { var x = 2; print("x = "+x); // x = 2 - ok print("x = "+x); // x = 2 uventet Eksempel: eks1-5.js Forgreninger En vigtig del af ethvert computerprograms logik er forgreninger. Javascript byder på hele to slags forgreninger. Den første slags er den enkle slags: hvis en betingelse er opfyldt, gør et eller andet, ellers gør evt. noget andet. Der er her tale om en klassisk if... else... konstruktion. Den alternative del (else) kan udelades, hvis der ikke er brug for den. Det er altid en god idé at bruge krøllet parentes, selvom du kun har en kodelinje i blokken. Krøllet parentes og indrykning giver et bedre overblik over koden og du vil lettere kunne læse og forstå den, når du vender tilbage efter lang tid. Undtagelsen fra denne tommelfingerregel er, hvis du har en else if altså ønsker at undersøge mere end to tilfælde. Her vil de unødvendige krøllede parenteser ofte være mere forvirrende end til gavn. var i = 7, j = 6; if (i > j) { print(i+' er større end '+j); var a = 'Hello',b = 'Hallo'; if (a < b) { print(a+' kommer før '+b); else { print(b+' kommer før '+a); var x = 1, y = 2; if (x > y) { print("x > y"); else if (x === y) { print("x = y"); else { print("x < y"); Eksempel: eks1-6.js Der findes som sagt også en anden slags forgrening, nemlig switch. Den bruges, når du har flere tilfælde, du ønsker at tjekke. Du finder et eksempel på brugen af switch nedenfor. Det er mest nyttigt kun at have et enkelt udtryk en variabel og bruge case-blokke til at opremse de forskellige tilfælde. Det er vigtigt at huske break, da du ellers vil fortsætte med næste tilfælde. Konstruktionen switch bruges ofte til at reagere på returværdier. 11 FORLAGET LIBRIS

1. Sproget var rc = Math.floor(3*Math.random()); // returværdier - her et tilfældigt tal 0, 1 eller 2 switch (rc) { case 0: print("ok"); break; case 1: print("ups"); break; case 2: print("det gik næsten"); break; Eksempel: eks1-7.js Løkker Javascript er velsignet med en masse valgmuligheder når det kommer til løkker. Ikke mindre end fire forskellige slags løkker! Det betyder, at du kan gøre en ting på flere måder. Samtidig betyder det, at du skal overveje hvilken type løkke, hver gang du har brug for en løkke. Alle fire muligheder er illustreret i eksemplet nedenfor. print('for'); for(i=1; i<=3; i=i+1) { print(i+':'+3*i); print('while'); i = 1; while (i<=3) { print(i+':'+4*i); i = i+1; print('do while'); i = 1; do { print(i+':'+4*i); i = i+1; while (i<=3); print('for in'); a = [1,2,3]; for (i in a) { print(a[i]+':'+6*a[i]); Eksempel: eks1-8.js Den første type løkke er en simpel tælleløkke: for-løkken. Den har sine rødder i C og C++, hvor den ofte er brugt. Den består af tre dele: initiel værdi af tællevariabel (i=1), stopbetingelse (i<=3) og opskrivning af tællevariabel (i=i+1). Hver del er adskilt af et semikolon. Du kan naturligvis også tælle baglæns og skrive tællevariablen op med mere end 1. Sætter du den initielle værdi af tællevariablen, så betingelsen er opfyldt med det samme, vil der ikke ske et gennemløb af løkken. I andre programmeringssprog er det anbefalet at vente med at erklære variabler, til de bruges første gang. Men virkefeltet i Javascript er anderledes, og du skal ikke erklære tællevariablen ved løkken. Det kan give dig store problemer, hvis tællevariablens navn også bruges uden for for-løkken, da det vil være den samme variabel! Den næste slags løkke er while-løkken. Her er det et (boolesk) udtryk, som afgør, hvornår gentagelsen af løkken stopper (evalueres udtrykket til falsk, afbrydes løkken). Det giver en stor fleksibilitet, som for-løkken ikke har, men det betyder også, at du ikke er garanteret, at programmet holder op med at køre. Begrebet uendelig løkke er en reference til while-løkker også i andre programmeringssprog. Omvendt er du heller ikke garanteret, at løkken gennemløbes en eneste gang, hvis betingelsen er falsk allerede første gang. Tredje løkke-konstruktion er do while-løkken, og med den er du garanteret mindst et gennemløb. Løkken gennemløbes, indtil betingelsen er falsk. Denne løkke-konstruktion bruges ikke nær så tit som de andre tre. Endelig er der en variant af for-løkken, nemlig for in-løkken. Med for in kan du gennemløbe alle elementer i et array eller attributter i et objekt. Er der tale om et array, skal du være opmærksom på, at du ikke får værdien af de enkelte elementer, men derimod indeks til elementerne. FORLAGET LIBRIS 12

1. Sproget Undtagelser Håndtering af fejlsituationer er ikke altid elegant. Hvis du vil tjekke alle kaldte funktioners fejlkoder og reagere på fejl, bliver dine programmer hurtig lange og meget komplekse. Samtidig kan det være besværligt at komme ud af løkker på en hurtig og effektiv måde. Heldigvis har Javascript en mulighed i form af undtagelser (eng. exceptions). Området eller kodeblokken, hvor en fejlsituation kan opstå, beskyttes med en try-blok. I en fejlsituation kan du smide en fejl eller undtagelse med throw. Programmet afbryder øjeblikkelig og hopper tilbage fra løkker og funktioner, indtil undtagelsen fanges (af en exception handler) vha. catch. Har dit program ikke noget til at fange undtagelsen, vil Javascriptmotoren fange undtagelsen. try { x = 5; y = 0; if (y === 0) { throw({name: "Fejl", message: "Division by zero"); else { z = x/y; print('z = '+z); catch (e) { print(e.name+' : '+e.message); Eksempel: eks1-9.js Du kan smide alle slags objekter som undtagelse. Strenge som beskriver fejltilstanden, er meget almindelige, men du kan også som i eksemplet ovenfor bruge et objekt med to attributter (name og message). Netop et objekt med disse to attributter er udbredt blandt Javascript-udviklere. Eftersom du kan bruge try catch rundt om en række funktionskald, kan du behandle fejlene i en samlet catch. Er undtagelserne et objekt, hvor du får både et entydigt fejlnavn og en fejlbesked, kan du med en switch-konstruktion behandle fejlene hver for sig og derved give brugeren bedre information om, hvad der er gået galt. Funktioner Funktioner er ikke bare funktioner. På en måde er funktioner egentlig ikke noget særligt i Javascript og det er præcis det, der gør dem særlige. Funktioner er objekter som alt andet i Javascript. På den måde har et heltal og en funktion mere tilfælles i Javascript end i så mange andre programmeringssprog. Det åbner en række muligheder for brugen af funktioner. Der er hele fire måder at kalde en funktion på: klassisk funktionskald som metode constructor gennem apply Funktioner som metoder og constructor kan du læse mere om i næste kapitel, som handler om objektorienteret programmering. Det klassiske funktionskald kræver, at du definerer funktionen først. Til det bruger du det reserverede nøgleord function. Funktioner kan tage et antal parametre, men antallet kan også være nul. Typen af parametrene kan være hvad som helst de skal blot være Javascript-objekter. Det er ikke nødvendigt, men funktioner kan returnere en værdi. Værdien kan være alle slags objekter, inkl. tal, strenge og arrays. Da funktioner er objekter, kan funktioner bruges som både parametre og returværdier. I eksemplet nedenfor finder du tre klassiske funktionskald. Funktioner i Javascript kan være rekursive, dvs. en funktion kan kalde sig selv. Generelt er Javascript-motorerne gode til at håndtere rekursive funktioner, da rekursion er meget anvendelig i arbejde med objekt-træer i en web-browser. Men det er altid en god idé at overveje, om en rekursiv funktion kan erstattes med en løkke, da en 13 FORLAGET LIBRIS