Javascript-perusteet

Harjoitellaan Javascriptin perusteita. Tehtäviin löytyy myös malliratkaisu (malli.js).

Alkuvalmistelut

Hello World

Muuttujat

Debuggaus

Tietorakenteet

Silmukat

If-lause

Funktiot

Objektit

let elukka = new Object();
elukka.tyyppi = 'Kissa';
elukka.nimi = 'Mirri';
elukka.paino = 4;
// objektin ominaisuuksiin voi viitata kuin taulukon alkioihin:
console.log ( elukka['tyyppi'] );
console.log ( elukka['nimi'] );
elukka['paino'] = 5;

// toinen tapa luoda ja alustaa objekti. Vrt json
let elukka2 = {
  tyyppi: 'Koira',
  nimi: 'Musti',
  paino: 10
};

Objektin sisältämät avaimet ja arvot voi käydä läpi for...in-silmukalla.

Luo omaan ohjelmaasi edellä tehdyt objektit ja kokeile tulostaa niiden sisältö konsoliin silmukalla.

Voit vapaasti keksiä ja lisätä uusia avaimia (attribuutteja) mihin tahansa javascript-objektiin.

Taulukot ja objektit ovat viitteitä

Javascriptissa objektit ovat viitteitä (osoittimia). Taulukko on vain erikoistapaus objektista. Taulukoiden ja objektien kopioiminen ei ole aivan yksinkertaista. Pelkkä sijoitusoperaatio kopioi vain osoittimen.


// kopioidaan elukat-taulukon osoitin uuteen muuttujaan
let otukset = elukat;
otukset[0] = 'Rotta';
// kokeile nyt tulostaa sekä elukat että otukset taulukot

jos halutaan kopioida koko taulukko se on tehtävä Array.from-funktiolla. Tee oikea kopio elukat-taulukasta.

Array.from tekee taulukosta vain pnnaillisen kopion eli shallow copyn eli jos taulukko sisältää osoittimia tai objekteja niin kopioidaan vain näiden osoittimet eikä oikeaa sisältöä.

let ihmiset = ["Tommi", "Ville", "Kalle"];
let elaimet = ["Kissa", "Koira", "Hevonen"]
let kaikki = [ihmiset, elaimet, "Testi", "testi"];
// tee kopio kaikki-taulukosta Array.from-funktiolla. 
// Kokeile muuttaa ihmiset- ja elaimet-taulukoiden sisältöä. 
// esim. elaimet[0] = "Kakadu";
// Miten kaikki-taulukosta tehdyn kopion sisältö muuttuu? Tutki debuggerilla
// Miten korjaisit asian eli estäisit kopion sisällön muuttumisen? 
// Katso korjausehdotus vasta kun olet itse miettinyt ja kokeillut
Korjausehdotus

jos tehdään syvä kopio (deepcopy) eli halutaan kopioida kaikki kyseiseen taulukkoon liittyvät objektit kaikilta tasoilta, niin täytyy vain kopioida yksitellen jokainen osa.

let deepcopy = Array.from(kaikki);
deepcopy[0] = Array.from(kaikki[0]);
deepcopy[1] = Array.from(kaikki[1]);

edellä oleva on sama kuin seuraava:

let deepcopy = Array.from(kaikki);
deepcopy[0] = Array.from(ihmiset);
deepcopy[1] = Array.from(elaimet);
Jos rakenne sisältää sisäkkäisiä taulukoita ja/tai objekteja, on jokainen osa kopioitava erikseen. Mahdollisesti tasoja voi olla useita. Tässä on vain kaksi tasoa.
ts. jos rakenne sisältää sisäkkäisiä taulukoita ja/tai objekteja, on vaan jokainen osa kopioitava erikseen.

Monimutkaisemmat tietorakenteet

Usein joudutaan käsittelemään sisäkkäisiä tietorakenteita. Taulukoita, joiden sisällä on lisää taulukoita tai objekteja, tai objekteja, jotka sisältävät uusia objekteja ja taulukoita.

Kts. Javascript-tietorakenteet

Elaintarha on objekti, joka sisältää ominaisuudet tyypit ja elaimet. Tyypit on taulukko. Elaimet on myös taulukko. Tyypit sisältää merkkijonoja. Elaimet sisältää objekteja. Lisää seuraava tietorakenne omaan ohjelmaasi ja tulosta se console.log- tai console.dir-komennolla konsoliin. Tämän jälkeen voit konsolissa selailla tarkemmin rakennetta.

let elaintarha = {
  "tyypit": [
    "Kissa",
    "Koira",
    "Hiiri"
  ],
  "elaimet": [
    {
      "tyyppi": "Kissa",
      "nimi": "Mirri",
      "paino": 5
    },
    {
      "tyyppi": "Koira",
      "nimi": "Musti",
      "paino": 10
    },
    {
      "tyyppi": "Koira",
      "nimi": "Murre",
      "paino": 10
    }
  ]
};

import ja export

Käyttäjien kommentit

Kommentoi Lisää kommentti