# Object i JavaScript
```
author: krm
created: 2018-09-27
status: alpha
```

# 👁️‍🗨️ Om object i js

- Objekt och funktioner är grunden för JS
- Allt annat är egentligen trasel.
- Bort sätt ifrån de grundläggande typerna, så är det mesta objekt.

# ❓ Vad är ett object?

Object är ett samling av egenskaper.

- En egenskap består i sin tur av namn och värden.
- Namnet används för att hitta ett värde.
- Ett värde kan vara av vilken typ som helst.
- Om värdet är en funktion kallas egenskapen för en metod.
- Ett namn är en String eller en Symbol. Används andra typer som namn 
  kommer de konverteras till String.

# 📣 Några kommentar om Object

Objekt finns äver allt i JS.

- Funktioner i js är objekt.
- Array i js är object.
- Värden av övriga typer beter sig ibland som objekt.
  - Men det är kompliserat.

# 🚜  Vad kan vi använder Object till?

Till nästan allt!

- För att representera något i vår kod
- För att hålla ordning på metoder i ett bibliotek.
- För att kapsla in värden saå att koden inte blir krånglig.


# 🀄️ Finns Object i andra språk?

Objekt i JS har funktoner som återfinns i många olika koncept i andra 
språk.

- I C++, java eller C# används klasser för att skapa objekt.
- Det finns också en datatype Map i många språk som har en liknade 
  funktion.
- I python kallas denna för *Dictionaries*.


#  Att sätta in ett värde i ett Object

Ett värde kan tilldelas genom att använda "=" och en hård parantes.

- Exempel: *let o={}* - *o["tre"]=3* - *o["points"]=35*
- Exempel: *o[1]="ett"* - *let a="result"; o[a]=35*
- Fry gåt också istället för paranteser bara använda en punkt "." och 
  namnet på egenskapen. 
- Exempel: *o.tre = 3* - *o.points = 35*

Den senare syntaxen är den som föredras i många samnahang. Parantesrna 
ska bara användas om det inte går med punkt.

# Att få ett värde ifrån ett Object

Ett värde kan fås genom att helt enkel skriva namnet på egenskapen du behöver innan för hårda paranteser.

- Exempel: *o["tre"]*
- Exempel: *o.points + o[3]* 
- Exempel: *o.tre*

# 🔄 Att konvertera till och från ett Object

Det ger oftas inga bra resultat att konvertera till eller ifrån Object.

- Boolean({})  //true
- Number({})   //NaN
- String({})   //"[object Object]"

# 🔬 Är detta ett Object?

Det går att använa typeof eftersom den returnerar "object", men tänk på:

```js
if(o !== undefined && o.p !== undefined) {
   console.log("Objectet o har en egenskap p!");
}
```

- Att detta är sant även för Array:er. Eventuellt får du undersöka om det inte är en Array.
- Det är inte sant för funktoiner där *typeof* ger värde "function".

Ofta vill du bara testa om ett värde har en egenskap heller inte. Då räcker det att testa och blir resultatet "undefined" finns den inte.

# Referenser

- Kan lätt bli fel med dessa.

# Exempel med referenser

 Exempel på hur referenser kan missförstås

```js
let a = 5;
let b = a;
b=0;
console.log(a);   //5

let o={};
o.a = 5;
b=o;
b.a=0;
console.log(o.a);  //0
```

Egentligen inte så förvirande om du tänker på objekt och referenser.

# 👿 Att kopiera Object

Det kan vara svårt att kopiera ett objekt eftersom det kan vara svårt 
att samtidigt kopiera eventuella referenser.

- En djup kopia ("deep copy") innebär att alla data kopiera till ett 
  nytt objekt och det sker rekursiv för alla objekt som finns. 
  Resultatet blir att inga referenser blir kvar mellan det ursprunglia 
  objektet och kopian.
- En yttlig kopia("shallow copy") innebär att alla värden i objektet 
  kopieras. Det innebär att referesner till bli kopierade men inte 
  själva objekten som kommer vara samma i både orginalet och kopian.


# Method för att göra en djup kopia av ett Object

Det finns ingen inbyggd funktion för dettam utan man får använda sig av 
olika metoder.

```js
let my_copy = JSON.parse(JSON.stringify(my_object));
```

- Denna metod som presenteras här är kanske inte intuitiv
- men det är den mest effektiva på de flesta system.
- Vi omvandlar helt enkelt objetet till ett text och parsar den sedan 
  för att få tillbaka objektet.

# assign

Om vi istället vill ha en yttlig kopia kan vi använda kommandot *assign*.

```js
let my_copy = assign({},)
```

- Assign används egentligen för att kombinera två objekt.
- För att göra en kopia kan du göra detta:

# keys

Om du vill ha alla namn på egenskaper i ett object

- A

# Exempel med for-of

Ett exempel.

# Det finns mycket mer om Object

Kan samla lite fler tips här ...
