Värden och Datatyper
#Primitiva värden
JavaScript har ett antal primitiva värden.
- Boolska variabler som
true
ochfalse
. - Numeriska värden som
42
och4.2
. - Strängar som
"mumin"
och'mumin'
. - Icke-värden i form av
null
ochundefined
.
De är primitiver, enkla värden.
#Objekt
De literaler som representerar ett icke-primitivt värde representeras som ett objekt.
Alla nedan har samma värde för typeof()
, alla är "object"
.
[]
array literal.{}
objekt literal././
ett reguljärt uttryck.
En funktion har också en upplevd typ i form av "function"
.
> typeof(function(){})
'function'
I samtliga fall så är dessa icke-primitiva värden en instans av Object
, det ursprungliga objektet i en hierarki av JavaScript objekt.
[] instanceof Object
[] instanceof Array
true
/./ instanceof Object
/./ instanceof RegExp
true
> a = {}
{}
> a instanceof Object
true
> a = function(){}
[Function]
> a instanceof Object
true
> a instanceof Function
true
Det finns alltså en objekthierarki dit ett värde hör, baserat på dess typ.
#Objektbaserade datatyper
I JavaScript finns ett antal objektbaserade datatyper. Följande lista ger en översikt. Dessa inbyggda objekt innehåller inbyggda funktioner som kan användas för att jobba med värden av respektive typ.
Namn | Syfte |
---|---|
Number |
Siffror, tal, nummer |
String |
Strängar och tecken |
Boolean |
Boolska värden, sant eller falskt |
Object |
Moderobjektet, samt en osorterad lista av key:value |
Array |
En sorterad lista av numrerade värde |
Function |
Funktioner som exekverbar kod |
RegExp |
Reguljära uttryck |
Varje datatyp är representerad som ett objekt med medlemsvariabler och metoder. Dessa används när man jobbar med värden som är av en viss typ. Objektets medlemmar och metoder avgör vad man kan göra med ett värde som är av en viss typ.
Till exempel kan du ta reda på längden av en sträng på följande sätt.
> "Mumintrollet".length
12
> "Mumintrollet".charAt(1)
'u'
Det som sker är att strängliteralen omvandlas automatiskt till ett String-object och dess property length
avläses och metoden String.charAt()
anropas.
På det viset kan man säga att även primitiverna har en koppling till ett objekt som i sin tur bestämmer vad man kan göra med värdet.
En strängliteral blir alltså till ett String-objekt vilket är kopplat till objektet Object. De metoder och properties som finns i Object
och i String
kan användas.
Se detta exempel som använder en metod som finns i Object
.
> a = 42
42
> a.toString()
'42'
Detta är grunden i hur värden och datatyper byggs upp och vilka metoder som finns tillgängliga.
#Fler objekttyper utan literaler
Låt oss titta på två andra objekttyper inte har en egen literal.
Namn | Syfte |
---|---|
Date |
Datum och datumhantering |
Error |
Felhantering för syntax och fel under körning |
Dessa objekt skapar man med operatorn new
så här.
// Date
> a = new Date()
Mon Nov 07 2016 18:05:33 GMT+0100 (CET)
> a instanceof Object
true
> a instanceof Date
true
> typeof(a)
'object'
// Error
> e = new Error()
[Error]
> e instanceof Object
true
> e instanceof Error
true
> typeof(e)
'object'
Här skapar vi alltså en instans av objektet och får därmed tillgång till de metoder som objektet implementerar.
#Sammanfattningsvis om typer och värden
Det är number
, string
, boolean
som är primitiver och resten är specialiserade objekttyper. Typerna Number
, String
, Boolean
, Function
, Array
, Date
och RegExp
är en variant, en specialisering, av typen Object
.
Funktionen typeof()
svarar med en upplevd typ i form an en sträng.
Uttrycket instanceof
testar om ett objekt/värde/variabel är av en viss Objekt.
Samtliga objekttyper är något som kallas globala objekt, de innehåller metoder och properties som kan användas för att jobba med dem och de värden de representerar.
Till dessa tillkommer undefined
och null
.
Namn | Syfte |
---|---|
undefined |
En variabel som inte givits ett värde har värdet undefined som är en egen typ. |
null |
Null är avsaknaden av ett värde, men ändå ett medvetet värde som blivit tilldelat till en variabel. Det är en egen typ. |
En variabel som ännu inte blivit tilldelad ett värde sägs ha värdet undefined
. En funktion som inte returnerar något sägs returnera undefined
. Ett odefinierat värde, helt enkelt.
Man kan tilldela en variabel ett värde null
som kan sägas innebära avsaknaden av värde. Vill man undvika undefined
kan man explicit tilldela en variabel null
. Internt representeras null
av ett objekt, iallafall enligt funktionen typeof()
och det kan kännas lite udda, men det är inget som bör störa oss.
Vi tar och kikar lite djupare in i var och en av dessa, samtidigt som vi gör lite övningar. Då fortsätter vi.