title |
---|
Fyrirlestur 9.1 – JavaScript array og objects |
Ólafur Sverrir Kjartansson, osk@hi.is
- Til þess að geta skrifað forrit þurfum við yfirleitt leið til þess að hópa saman gögnum
- Fylki (arrays) og hlutir (objects) leyfa okkur að gera það
- Fylki leyfa okkur að safna hlutum í raðaða lista
- Búum til array með
[]
const list = [];
- Nálgumst gildi innan fylkis með bracket notation
- Nálgumst eftir index, byrjar frá 0
array[0]
nálgast fyrsta stak í index 0,array[1]
annað stak í index 1 o.s.fr.
length
skilar fjölda staka í fylki, frá 0 til stærsta index
const
eru block scoped fastar sem banna endurskilgreiningu á grunngildi- Getum bætt við fylki sem eru skilgreindir með
const
- Getum ekki breytt grunngildi úr array yfir í t.d. streng
- Getum bætt við fylki sem eru skilgreindir með
- Góður vani að skilgreina sem flestar breytur með
const
- Minnkar líkur á að við blöndum saman týpum
- Að breyta ekki gildum breyta getur dregið úr böggum
const list = [1, 2, 3];
list.length; // 3
list[100] = 1; // má þó skilgr sem const
list.length; // 101
list = ''; // TypeError
- Næstum öll JavaScript gildi hafa property (eigindi)
'foo'.length
,Math.min()
- Öll nema
null
ogundefined
- Property nálgumst við með:
.
– dot notation['foo']
– bracket notation
- Notum yfirleitt dot notation nema:
- Þegar við erum að vinna með property sem heita einhverju sem er óleyfilegt breytunafn
- Þegar við notum breytu til að vísa í property
- Property innihalda gildi en ef það er
function
köllum við það methodtoUpperCase()
er method á strengjum sem skilar streng í hástöfum, höfum fleiri methods á strengjum
const a = 'hello world';
a.length; // 11
a['length']; // 11
a.toUpperCase(); // "HELLO WORLD"
array.join(s)
– breytir fylki í streng meðs
á milliarray.push(item)
– ýtiritem
aftast á fylkiarray.pop()
– fjarlægir og skilar aftasta hlut í fylkiconcat, shift, slice, sort, splice
o.fl.
const foo = [0, 1, 2];
foo[0]; // 0
foo.push('foo'); // 4
foo.join(', '); // '0, 1, 2, foo'
foo.pop(); // 'foo'
- Byrjum á að hugsa um object í JavaScript sem geymslu fyrir gildi þar sem gildi á sér nafn
- Skilgreinum með
{}
, innan þess skilgreinum við eigindi hluts meðheiti: gildi
- Ef heiti er óleyfilegt breytunafn skilgreinum við sem streng
gildi
eru öll leyfileg gildi
- Eigindi eru oftast skilgreind eitt per línu til að auka lesanleika
- Seinasta eigindi má hafa kommu á eftir sér, kallað trailing comma
- Ef við biðjum um eigindi sem ekki er skilgreint á hlut fáum við
undefined
- Mjög ólíkt
object
í Java
const person = {
name: 'Jón Jónsson',
// óleyfilegt breytunafn
'home-address': 'Aðalgata 1',
age: 100,
registered: true,
// trailing comma
interests: ['foo', 'bar', 'baz', ],
};
const a = {};
a['1%-foo']; // undefined
a.1%-foo; // SyntaxError
const key = 'bar';
a[key] = 'baz';
a[key]; // baz
a.bar; // baz
delete
er unary operator sem eyðir eigindi af hlut- Getum eytt gögnum með
delete
- Skilar
boolean
sem segir til um hvort eigindi hafi verið eytt
in
er binary operator sem segir til um hvort eigindi sé á hlut- Skilar
boolean
- Ef við setjum property sem
undefined
eðanull
er það samt sem áður enn þá tengt hlutnum ogin
skilartrue
const obj = { foo: 1 };
obj.foo; // 1
'foo' in obj; // true
obj.bar = 'foo'; // "foo"
obj['foo-bar'] = true; // true
delete obj.foo; // true
'foo' in obj; // false
obj; // { bar: "foo", foo-bar: true}
- Til að fá fylki af öllum eigindum getum við notað
Object.keys
- Kemur frá
Object
, sem er constructor Object.assign()
,Object.freeze()
,Object.values()
og fleiri
const foo = { x: 1, y: 2, z: 3 };
Object.keys(foo); // ['x', 'y', 'z']
Object.values(foo); // [1, 2, 3]
Object.freeze(foo);
delete foo.x; // false
// afritum foo yfir í bar
const bar = Object.assign({}, foo);
const baz = { a: true, x: 9 };
// afritum foo yfir í baz, yfirskrifar
Object.assign(baz, foo);
array
erobject
!- Til að athuga hvort eitthvað sé í alvöru array getum við notað
Array.isArray()
const a = [1, 2, 3];
typeof a; // "object"
Array.isArray(a); // true
- Ef við berum saman hluti fáum við
true
þá og því aðeins að það séu nákvæmlega sömu hlutirnir- Bendi á sama hlutinn í minni
- Að athuga hvort tveir hlutir líti eins út er kallað deep comparsion og er ekki stutt í JavaScript, aðeins shallow comparison
const foo = { a: 1 };
foo === { a: 1 }; // false
const bar = foo;
foo === bar; // true
const baz = { a: 1 };
foo === baz; // false;
// sama gildir fyrir fylki
const list = [1, 2, 3];
const list2 = [1, 2, 3];
list === list2; // false
- Getum notað
for
lykkjur og haldið utan um index í fylkinu for of
lykkjur leyfa okkur að sækja hvert stak í röð án bókhalds- Getum þó ekki breytt gildinu
const items = [1, 2, 3, 4, 5];
for (let i = 0; i < items.length; i++) {
items[i] *= 2;
}
items; // [2, 4, 6, 8, 10]
const items = [1, 2, 3, 4, 5];
for (const item of items) {
console.log(item);
}
1, 2, 3, 4, 5
- Ef við skilgreinum parameter í falli með
...
fyrir framan er það rest parameter- (parameter er skilgreiningin, argument er raun gildið sem sent er inn)
- Inniheldur rest af argumentum þegar kallað er í fallið
- Kemur í staðinn fyrir
arguments
hlut í föllum- Arrow functions hafa ekki
arguments
hlut en geta notað rest parameter
- Arrow functions hafa ekki
function foo(x, y, ...rest) {
return x + y + rest.length;
}
foo(1, 2); // 3
foo(1, 2, 3, 4); // 5
function avg(...rest) {
let sum = 0;
for (const i of rest) {
sum += i;
}
return sum / rest.length;
}
- Ef við notum
...
fyrir utan parameter í föllum kallast það spread operator - Dreifir úr breytu
- Getum dreift úr
string
ogarray
, ekkiobject
,number
og öðrum gildum
const list = [1, 2, 3];
console.log(...list); // 1 2 3
// sama og að hafa gert
console.log(1, 2, 3);
function sum(x, y, z) {
return x + y + z;
}
sum(...list); // 6
// sama og að hafa gert
sum(1, 2, 3);
// getum gert í bland við önnur argument
avg(1, ...list, 10); // 3.4
[1, ...list, 10]; // [1, 1, 2, 3, 10]
// afritum fylki
[...list]; // [1, 2, 3]
- Niðurbrot á fylkjum og hlutum í breytur
- Virkar einsog maður myndi halda, dreifir úr hlutum í þær breytur sem maður vill
- Getum skilgreint sjálfgefin gildi
- Fáum
undefined
ef ekkert gildi passar, ekki villu
const list = [1, 2, 3];
const [a, , b] = list;
console.log(a, b); // 1 3
const obj = { foo: 1, bar: 'baz' };
const { foo, bar, baz } = obj;
// 1 "baz" undefined
console.log(foo, bar, baz);
- Þurfum ekki að skilgreina bæði lykil og gildi ef þau heita það sama
- Getum skilgreint eigindi með segð ef við höfum innan
[]
- Þurfum ekki að skilgreina föll á hlutum með
function
const a = '1';
const b = '2';
const c = { a, b }; // { a: "1", b: "2" };
const d = {
foo: 'bar',
// eigindi úr segð
[`foo${c.a}`]: 'bar',
};
d; // { foo: "bar", foo1 : "bar" }
const utils = {
// í staðinn fyrir sum: function (x, y)
sum(x, y) {
return x + y;
},
};
utils.sum(1, 2); // 3