En værdi i JavaScript er altid af en bestemt type – f.eks. en tekststreng eller et tal.
Der er otte grundlæggende typer i JavScript. Her vil jeg beskrive dem overordnet og på de næste sider vil jeg tale om hver enkelt mere uddybende.
Du kan putte alle typer data i en variabel. F.eks. kan en variabel på et tidspunkt indeholde en tekststreng og kort efter et tal:
// no error
let message = "hallo";
message = 123456;
Sprog der tillader den slags ting kaldes “dynamically typed”, hvilket betyder, at der findes datatyper, men variable er ikke bundet af dem.
Number
let n = 123;
n = 12.345;
Datatypen number repræsenterer både heltal og kommatal.
Der er mange operatorer vor numre, som f.eks. multiplikation *, division /, addition +, subtraktion - og flere andre.
Udover regulære tal findes der også såkaldte “specielle numeriske værdier” der høre med under denne datatype: Infinity, -Infinity og NaN.
-
Infinityrepræsenterer et matematisk Uendeligt ∞. Det er en speciel værdi, der er højere end hvilket som helst andet tal.Du kan få det som et resultat af at dividere med nul:
alert( 1 / 0 ); // InfinityEller referere til det direkte:
alert( Infinity ); // Infinity -
NaNrepræsenterer en fejl i en beregning. Det er et resultat af en forkert eller ikke klart defineret matematisk operation:alert( "not a number" / 2 ); // NaN, sådan en division resulterer ikke i et talNaNhænger fast. Alle fremtidige oprerationer påNaNvil resultere iNaN:alert( NaN + 1 ); // NaN alert( 3 * NaN ); // NaN alert( "not a number" / 2 - 1 ); // NaNSå, hvis der er et
NaNet eller andet sted i udtrykket, så vil det påvirke hele beregningen (der er kun én undtagelse for dette:NaN ** 0giver1).
Matematik er “sikkert” i JavaScript. Du kan gøre alt: dividere med nul, behandle ikke-nummeriske tekststrenge som tal, etc.
Dit script vil aldrig stoppe med en fatal fejl (“die”). Det værste der kan ske er, at du får et NaNsom resultat.
Specielle nummeriske værdier tilfører formelt datatypen “number”, selv om de ikke i ordets forstand er tal.
Du lærer mere om at arbejde med tal i kapitlet Tal (Numbers).
BigInt
I JavaScript kan datatypen “Number” ikke repræsentere heltal større end (253-1) (det svarer til 9007199254740991), eller mindre end -(253-1) for negative tal. Dette skyldes en intern begrænsning.
For at være helt præcis kan “number”-typen gemme større heltal (op til <308>1.7976931348623157 * 10308), men uden for det sikre heltalsområde ±(253-1) vil der være en præcisionsfejl, fordi ikke alle cifre kan passe ind i den faste 64-bit lagring. Så en “omtrentlig” værdi kan blive gemt.
For eksempel er disse to tal (lige over det sikre område) de samme:
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
Så at sige, kan alle ulige heltal større end (253-1) slet ikke gemmes i “number”-typen.
Til de fleste formål er området ±(253-1) mere end tilstrækkeligt, men nogle gange har vi brug for hele området af virkelig store heltal, f.eks. til kryptografi eller tidsstempler med mikrosekund-præcision.
BigInt datatypen er tilføjet sproget for nyligt til at repræsentere heltal af en vilkårlig længde.
En BigInt værdi oprettes ved at tilføje et n i slutningen af tallet:
// Et "n" i slutningen betyder at det er et BigInt
const bigInt = 1234567890123456789012345678901234567890n;
Fordi BigInt bruges meget sjældent vil jeg ikke dække det yderligere her, men du kan læse mere om dem i et seperat kapitel BigInt. Læs det, hvis du skal arbejde med virkelig store tal.
<<<<<<< HEAD
Som det er nu, understøttesBigInt i Firefox/Chrome/Edge/Safari, men ikke i IE.
Du kan tjekke MDN BigInt kompatabilitetstabel for et overblik over, hvilke browsere der understøtter.
=======
d78b01e9833009fab534462e05c03cffc51bf0e3
String
En string (tekststreng) i JavaScript skal omkranses af anførselstegn (citationstegn).
let str = "Hallo";
let str2 = 'enkelt anførselstegn er også ok';
let phrase = `backtick kan indlejre variable ${str}`;
I JavaScript er der tre typer af anførselstegn.
- Dobbelt anførselstegn:
"Hallo". - Enkelt anførselstegn:
'Hallo'. - Grave (Backticks):
`Hallo`.
Dobbelt og enkelt anførselstegn er “simple” anførselstegn. Der er stort set ingen forskel på dem i JavaScript.
Backticks har “udvidet funktionalitet”. De tillader dig at indlejre variable og udtryk i tekststrengen ved at skrive ${…}, for eksempel:
let name = "John";
// embed a variable
alert( `Hej, ${name}!` ); // Hej, John!
// embed an expression
alert( `resultatet er ${1 + 2}` ); // resultatet er 3
Udtryk inde i ${…} evalueres først og resultatet bliver en del af tekststrengen. Du kan putte stort set alt ind: en variabel i stil med name, en aritmetisk operation som 1 + 2 eller noget mere komplekst.
Vær opmærksom på, at du kun kan gøre dette i backticks. Normale anførselstegn har ikke denne mulighed!
alert( "resultatet er ${1 + 2}" ); // resultatet er ${1 + 2} (anførselstegn udfører ikke beregningen)
Du vil lære mere om tekststrenge i kapitlet Tekststrenge (Strings).
I nogle sprog er der en speciel “character” datatype for enkelte karakterer. F.eks. i sproget C og Java findes typen “char”.
I JavaScript er der ikke sådan en type. Her er kun én type: string. En tekststreng kan indeholde nul karakterer (være tom), en karakter eller mange af dem.
Boolean (logisk type)
Datatypen boolean har to værdier: true og false.
Denne type bruges normalt til at gemme ja/nej værdier: true byder “ja, rigtigt”, og false betyder “nej, forkert”.
For eksempel:
let nameFieldChecked = true; // ja, name feltet er krydset af
let ageFieldChecked = false; // nej, age feltet er ikke krydset af
Boolean værdier kan ske som et resultat af en sammeligning:
let isGreater = 4 > 1;
alert( isGreater ); // true (sammeligningen er rigtig "ja")
Du lærer mere om booleans i kapitlet Logiske operatorer.
Værdien “null”
Den specielle null værdi hører ikke til nogle af datatyperne beskrevet ovenfor.
Den er sin egen type og kan kun indeholde en null værdi:
let age = null;
I JavaScript er null ikke en “reference til et ikke-eksiserende objekt” eller en “null pointer” som i nogle andre sprog.
Det er simpelthen bare en speciel værdi til at repræsentere “ingenting” eller “tom”.
Koden ovenfor fortæller at værdien for age ikke findes.
Værdien “undefined”
Den specielle værdi undefined skiller sig også ud. Den er sin egen datatype på samme måde som null.
Meningen med undefined er “værdien er ikke blevet tildelt”.
Hvis en variabel er blevet deklareret, men ikke tildelt en reel værdi er dens værdi undefined:
let age;
alert(age); // viser "undefined"
Teknisk set er det muligt eksplicit at tildele en variabel værdien undefined:
let age = 100;
// Ændr værdien til undefined
age = undefined;
alert(age); // "undefined"
… men, det anbefaleas ikke. Normalt vil du bruge null til at tildele en variabel værdien “tomt” eller “ukendt”, hvor undefined er reserveret til standard default værdien for variable der ikke har fået værdi tildelt endnu.
Object og Symbol
Datatypen object er speciel.
Alle andre typer kaldes “primitive” fordi deres værdi indeholder én information (en tekststreng, et tal osv.). I modsætning til dette kan objekter gemme komplekse samlinger af information.
Med så mange underliggende muligheder fortjener objekter specialbehandling. Du lærer mere om dem senere i kapitlet Objekter, efter du har lært mere om primitiver.
Datatypen symbol bruges til at skabe unikke identifikationer for objekter. Jeg skriver det her for at du ved, at de findes som datatype, men jeg venter med at forklare dem yderligere før du ved mere om objekter.
typeof operator
typeof operatoren returnere datatypen af det argument den modtager. Dette er brugbart hvis du vil arbejde mde værdier af forskellige typer, eller bare vil sikre, at en variabel er af en bestemt type.
Den understøtter to former for syntaks:
- Som en operator:
typeof x. - Som en funktion:
typeof(x).
Sagt på en anden måde, den virker både med og uden paranteser. Resultatet er det samme.
Et kald til typeof x returnerer en tekststreng med datatypens navn:
typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
De sidste tre linjer kræver lidt yderligere forklaring:
Mather et indbygget objekt, der leverer matematiske operationer. Du lærer mere om det i kapitlet Tal (Numbers). Her, skal det bare ses som et eksempel på et objekt.- Resultatet af
typeof nuller"object". Det er officielt anerkendt som en fejl itypeofopførsel. Det startede i de tidlige dage af JavaScript og er blevet på grund af kompatibilitet. Det er sikkert atnullikke er et objekt, men sin egen datatype … men JavaScript ved det bare ikke. - Resultatet af
typeof alerter"function", fordialerter en funktion. Du lærer mere om funktioner i næste kapitel, hvor du vil se, at der ikke er nogen speciel “funktion” datatype i JavaScript. Funktioner tilhører typenobject. Mentypeofbehandler dem forskelligt og returnerer"function". Det fører også tilbage til gamle dage. Teknisk set er det forkert, men kan være praktisk i det daglige.
typeof(x) syntaxDu vil også kunne se en anden syntax: typeof(x). Det gør det samme som typeof x.
For klarhedens skyld: typeof er en operator, ikke en funktion. Parantesen der bruges her hører ikke til typeof. Det skal mere forstås som den slags parenteser der bruges til matematisk gruppering.
Normalt vil sådanne parenteser indeholde matematiske udtryk så som (2 + 2), men her indeholder de kun ét argument (x). Syntakstisk tillader de at man undlader et mellemrum mellem typeof operatoren og dens argument, og det er der nogle der foretrækker.
Så du vil se brugen af typeof(x), men syntaksen typeof x er noget mere udbredt.
Opsummering
Der er 9 grundlæggende datatyper i JavaScript.
- Syv primitive datatyper:
numbertil alle slags tal: heltal og kommatal, heltal er begrænset af±(253-1).biginttil heltal af vilkårlig længde.stringtil tekststrenge. En tekststreng kan have nul, en eller flere karakterer. Der er ikke en seperat datatype for enkelte karakterer.booleantiltrue/false.nullfor ukendte værdier – en selvstændig datatype der kun kan have værdiennull.undefinedfor ikke tildelte værdier – en selvstændig datatype der kun kan have værdienundefined.symboltil unik identifikation.
- Og en ikke-primitiv datatype:
objecttil mere komplekse datastrukturer.symboltil unik identifikation.
typeof operatoren tillader dig at se, hvilken datatype en variabel er.
- To måder:
typeof xellertypeof(x). - Returnerer en tekststreng med navnet på datatypen, i stil med
"string". nullreturnerer"object"– dette er en fejl i sproget, det er ikke et objekt.
I det næste kapitel vil jeg koncentrere mig om primitive værdier. Så snart du er fortrolig med dem vil jeg gå videre med objekter.
Kommentarer
<code>-taggen, for flere linjer - omslut dem i<pre>-tag, for mere end 10 linjer - brug en sandbox (plnkr, jsbin, codepen…)