title |
---|
Fyrirlestur 9.2 – JavaScript villur og regex |
Ólafur Sverrir Kjartansson, osk@hi.is
- Kynnt í ECMAScript 5
- Setur strangari kröfur á kóðann þinn
- Villum kastað ef t.d.
- Reynt að nota óskilgreindar breytur
- Sama eigindi skilgreint oftar en einu sinni í hlut
'use strict'
skilgreinir strict mode- Tvö scope:
- Per skrá
- Per fall
- Æskilegra að skilgreina per fall þar sem þá fáum við ekki óvart strict mode á allt
function sum(a, a, c) {
'use strict';
return a + b + c;
}
// Uncaught SyntaxError:
// Duplicate parameter name not allowed
// in this context
function canYouSpotTheProblem() {
'use strict';
for (counter = 0; counter<10; counter++) {
console.log('Happy happy');
}
}
canYouSpotTheProblem();
// ReferenceError: counter is not defined
- JavaScript hefur stuðning við
try catch
eðaexceptions
- Kóði getur kastað villum: innbyggðum og okkar eigin
- Grípum villur og gerum eitthvað í þeim
- Köstum villu með
throw
- Notum
Error
, innbyggðan hlut sem heldur utan um villur throw Error('villa');
- Notum
- Fáum stacktrace með villum, hvaðan þær koma upp
- Ef við grípum ekki villu flýtur hún upp þar til hún veldur usla á efsta lagi
- Í versta falli stoppar keyrslu
- Getum gripið villur og gert eitthvað við þær með
try catch
try {
// e-ð sem kastar villu
} catch (e) {
// gera e-ð í villu
}
- Með
finally
getum við keyrt kóða hvort sem við grípum villu eða ekkitry { /* .. */ } catch (e) { /* .. */ }
- T.d. til að hreinsa upp, loka tengingum
try {
// e-ð sem kastar villu
} catch (e) {
// gera e-ð í villu
}
Getum fengið upp villur þegar við köllum í innbyggð föll eða gerum eitthvað vitlaust
TypeError
– villa þegar gildi er ekki af þeirri tegund sem við gerum ráð fyrirReferenceError
– villa þegar reynt að eiga við óskilgreinda breytu- o.fl.
Getum notað instanceof
virkja sem athuga hvernig hlutur gildi er til að vita hvernig villa kom upp:
try {
/* ... */
} catch (e) {
if (e instanceof TypeError) {
console.log('TypeError', e);
} else if (e instanceof ReferenceError) {
console.log('ReferenceError', e);
}
}
- Þegar við notum kóða frá öðrum
- Verjast villum sem geta stoppað keyrslu
- Pössum okkur samt, getur falið villur og búið til erfiða bögga
- Setjum utan um eins fáar línur í einu og við getum
- Höfum stuðning við reglulegar segðir í JavaScript
- Skilgreinum mynstur sem er borið saman við texta til að vinna með hann
- Kraftmikið, flókið og oft óskiljanlegt
- Að skrifa og skilja reglulegar segðir er sér verkefni sem við ætlum ekki að fara djúpt í
- Skoðum aðeins nokkur dæmi sem geta verið handhæg
- Reglulegar segðir ber að varast, það eru yfirleitt betri leiðir í boði
Some people, when confronted with a problem, think “I know, I'll use regular expressions.” Now they have two problems.
- Skilgreindar með
let r = new RegExp('segð', flags);
let r = /segð/flags;
segð
er regluleg segð ogflags
er strengur sem stillir til hegðun
- Strengur skrifaður samkvæmt reglum
- Myndar stöðuvél sem finnur og framkvæmir það sem segð biður um
^[0-9]{1,2}.*AB?C$
- Strengur sem byrjar á einni eða tveim tölum, eftir fylgir einhver strengur og endar síðan á nákvæmlega "AC" eða "ABC"
[]
skilgreinir bil[abcd]
,a
,b
,c
eðad
[0-9]
, allar tölur[a-z]
, ASCII lágstafir (unicode er vesen!)
^
– byrjun strengs$
– endi strengs[^]
skilgreinir bil sem við viljum ekki[^a-c]
ekkia
–c
\s
– whitespace, bil, tab, nýlína.+
– einu sinni eða oftar.*
– núll sinnum eða oftar.{n,m}
– n til m sinnum?
– Gæti verið eða ekki
g
- global, ekki stoppa eftir fyrstu niðurstöðui
- ignore case, ekki vera hástafanæmm
- multiline,^
og$
virka milli lína
- Þegar við keyrum regex fáum við niðurstöður til baka
- Hvaða strengur fannst
- Ef við notum sviga til að skilgreina subexpressions, fáum við í niðurstöðum hver þeirra fundust
r.test(string)
- athugar hvort efr
passi viðstring
r.exec(string)
- keyrirr
og skilar niðurstöðum í fylki fyrir hvern hóp innan svigastring.match(r)
- svipaðexec
en efg
er sett fáum við alla strengi sem finnaststring.replace(r, newString)
- skipta út öllum tilvikum þar semr
passar fyrirnewString
/foo/.test('foo bar baz');
/bar/.test('foo baz');
const re = /quick\s(brown).+?(jumps)/ig;
re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');
'The Quick Brown Fox Jumps Over The Lazy Dog'
.match(/quick\s(brown).+?(jumps)/ig);
'foo bar er ekki fooz baz'
.replace(/foo/g, 'lol');