Guest User

Untitled

a guest
Jun 20th, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.87 KB | None | 0 0
  1. # Läsförståelseövningar
  2.  
  3. Övningarna nedan ska du läsa igenom och först gissa dig fram till vad svaret ska vara. Du ska inte kolla på lösningsförslagen och du ska inte köra koden i Chrome/Firefox/Opera/Safari. När du har skrivit ner svaren för varje övning kan du kolla om du hade rätt eller inte. Att du har rätt eller inte spelar egentligen ingen roll, huvudsaken här är att du ska förstå vad som händer. Svarade du inte som lösningsförslaget? Försök att förstå vad det var som gjorde så att du fick fel svar eller på vilket steg du tänkte snett på, jag har lämna några kommentarer men du kan behöva googla själv.
  4.  
  5. ### Övning 1
  6. > Vilka datatyper är följande uttryck? Varje ny rad är kommer visa en ny datatyp. Tips: använd typeof för att kontrollera ditt svar
  7.  
  8. Exempelvis kan man svara att första uppgiften är datatypen `Number` och har värdet `1,01`. Se till att du förstår varför resultatet blir som det blir.
  9.  
  10. ```js
  11. 1.01
  12. true + true + false
  13. 'false'
  14. 5 && 8
  15. 5 || 8
  16. !5
  17. 1 / 0
  18. !!5
  19. false || true
  20. true && false || false && true
  21. "123" - 0
  22. typeof (typeof true)
  23. "1000" / 10
  24. 123.4 - ''
  25. 2 < 3
  26. '5' + "0" / '2'
  27. 'två' < 'tre'
  28. '5' + "0" / '5' + 0
  29. 17 === 17.0
  30. '1' + '5' - '4' * '2' - '3'
  31. 17 === '17'
  32. 'kalle' - 5
  33. 17.000000000000000000001 == 17
  34. undefined || null || 0 || false || "foo"
  35. ```
  36.  
  37. ### Övning 2
  38.  
  39. Vilket värde kommer variabeln `z` att ha efter att respektive kodrad har körts? Skriv ut vad `z` är på varje rad utan att köra koden.
  40. ```js
  41. let z = 5;
  42. z++;
  43. --z;
  44. z += 15;
  45. let x = 8;
  46. let y = 16;
  47. z = y - x;
  48. x = 10;
  49. z = x++;
  50. x = 2;
  51. y = 5;
  52. x = x + y;
  53. y = x + y;
  54. z = y;
  55. ```
  56.  
  57. ### Övning 3
  58. > Förklara i text hur funktionen nedan körs när vi kallar på den(dvs. i vilken ordning allt händer) i dessa scenarion:
  59.  
  60. * a) Vi kallar på funktionen med: `multiply(2, 2, 2);`
  61. * b) Vi kallar på funktionen med: `multiply(2, 2);`
  62. * c) Vi kallar på funktionen med: `multiply(2, 2, "2");`
  63. * d) Vi kallar på funktionen med: `multiply(2, 2, function(){ return 2;});`
  64.  
  65. ```javascript
  66. function multiply(a, b, c){
  67. return a * b * c;
  68. }
  69. ```
  70.  
  71. ### Övning 4
  72.  
  73. I koden ovan, vilka värden är parametrar och vilka värden är argument? Hur skiljer de sig åt och i vilket scope är parametrarna tillgängliga?
  74.  
  75. ### Övning 5
  76.  
  77. Förklara i text hur denna funktion kommer att köras och vad som kommer att hända på varje rad:
  78.  
  79. ```js
  80. const text = "Do not call me!";
  81. function callMe(){
  82. const text = "Call me!";
  83. return text;
  84. console.log(text);
  85. }
  86.  
  87. callMe();
  88. ```
  89.  
  90. ### Övning 6
  91. > Vad skriver följande kodrader ut?
  92.  
  93. __a)__
  94. ```js
  95. function foo() {
  96. console.log("test");
  97. }
  98. foo("hej");
  99. ```
  100.  
  101. ---
  102.  
  103. __b)__
  104. ```js
  105. let a = foo(3);
  106. console.log(a);
  107. function foo(i) {
  108. return i * i;
  109. }
  110. ```
  111.  
  112. ---
  113.  
  114. __c)__
  115. ```js
  116. console.log(foo(3, 5));
  117. function foo(x, y) {
  118. return x * y;
  119. }
  120. ```
  121.  
  122. ---
  123.  
  124. __d)__
  125. ```js
  126. console.log(foo(3, 5));
  127. const foo = function(x, y) {
  128. return x * y;
  129. }
  130. ```
  131.  
  132. ---
  133.  
  134. __e)__
  135. ```js
  136. let x = 2;
  137. let y = 3
  138. let a = foo(foo(x) + foo(y));
  139. console.log(a);
  140. function foo(i) {
  141. return 5 * i;
  142. }
  143. ```
  144.  
  145. ---
  146.  
  147. __f)__
  148. ```js
  149. const person = {
  150. name: "Steffe",
  151. sayName(){
  152. console.log(this.name);
  153. }
  154. }
  155. person.sayName();
  156. ```
  157.  
  158. ---
  159.  
  160. __g)__
  161. ```js
  162. const person = {
  163. name: "Steffe",
  164. }
  165.  
  166. function sayName(){
  167. console.log(this.name);
  168. }
  169. person.sayName = sayName;
  170. person.sayName();
  171. ```
  172.  
  173. ---
  174.  
  175. __h)__
  176. ```js
  177. const animals = ["dog", "cat", "zebra", "horse", "cow"];
  178. animals.shift();
  179. console.log(`My favourite animal is ${animals[0]}`);
  180. ```
  181.  
  182. ---
  183.  
  184. __i)__
  185.  
  186. ```js
  187. let a = 5;
  188. function foo(a) {
  189. a++;
  190. }
  191. a += 2;
  192. console.log(a);
  193. ```
  194.  
  195. ---
  196.  
  197. __j)__
  198. ```js
  199. function foo(a) {
  200. return a + 2;
  201. };
  202. function goo(x, y) {
  203. return x(y);
  204. };
  205. let a = goo(foo, 3);
  206. console.log(a);
  207. ```
  208.  
  209. ---
  210.  
  211. __k)__
  212.  
  213. ```js
  214. var text = "";
  215. var a = {
  216. value: "c"
  217. };
  218. var b = {
  219. value: "a"
  220. };
  221. var c = {
  222. value: "b"
  223. };
  224. text = a.value + b.value + c.value;
  225. console.log(text);
  226. ```
  227.  
  228. ---
  229.  
  230. __l)__
  231. ```js
  232. const a = 0;
  233. const objekt = {
  234. a: 100,
  235. b: 200,
  236. c: 300
  237. };
  238. for(const value in objekt){
  239. a += value;
  240. }
  241.  
  242. console.log(a);
  243. ```
  244.  
  245. ---
  246.  
  247. __m)__
  248. ```js
  249. function foo () {
  250. //Här returneras bar() innan funktionen har deklarerats
  251. return bar();
  252. //Dock så hoistas bar() upp ovanför return vilket gör att funktionen ändå
  253. //kallas på eftersom här blir funktionen deklarerad innan return p.g.a hoist
  254. function bar() {
  255. return "FOOBAR!!";
  256. }
  257. }
  258. console.log(foo());
  259. ```
  260.  
  261. ---
  262.  
  263. ### Lösningsförslag
  264.  
  265. ### Övning 1
  266. ```js
  267. 1.01 // Float number, still 'Number'
  268. // true === 1 and false which means that this is 1 + 1 + 0
  269. true + true + false
  270. // Just a string, you can convert it with Boolean('false')
  271. 'false'
  272. //5 is true, so we negate that and get false
  273. !5
  274. // Can't divide 0, we get 'Infinity'
  275. 1 / 0
  276. // 5 is true, negate that and get false, negate that and get true
  277. !!5
  278. // one must be true, the second is true
  279. false || true
  280. // Neither is true so we get false
  281. true && false || false && true
  282. // 123 as a Number, the 0 converts it to a number
  283. "123" - 0
  284. // Implicit conversion of "1000" to 1000 === 100
  285. "1000" / 10
  286. // empty string is false === 0, so nothing happens
  287. 123.4 - ''
  288. // 2 is not bigger than 3 so we get false
  289. 2 < 3
  290. // "5" + "0" is concatenation so "50". We can't divide a string so "2" is ignored
  291. '5' + "0" / '2'
  292. // comparing strings, false
  293. 'två' < 'tre'
  294. // The '5' is ignored but the 0 is converted to a string === "500"
  295. '5' + "0" / '5' + 0
  296. // the decimal doesn't add anything so === true
  297. 17 === 17.0
  298. // Only numbers are being implicit converted
  299. '1' + '5' - '4' * '2' - '3'
  300. // The are no strictly the same === false
  301. 17 === '17'
  302. // But these are kinda the same === true
  303. 17 == '17'
  304. // NaN, you can't subtract 5 from a string
  305. 'kalle' - 5
  306. //every value before is false, which will reach 'foo' and return 'foo'
  307. undefined || null || 0 || false || "foo"
  308. ```
  309.  
  310.  
  311. ### Övning 2
  312.  
  313. ```js
  314. let z = 5;
  315. // z = z + 1;
  316. z++;
  317. // z = z - 1;
  318. --z;
  319. // z = z + 15;
  320. z += 15;
  321. let x = 8;
  322. let y = 16;
  323. // z = 16 - 8
  324. z = y - x;
  325. // x = 10
  326. x = 10;
  327. // z = 10
  328. z = x++;
  329. x = 2;
  330. y = 5;
  331. // x = 7
  332. x = x + y;
  333. // y = 7 + 5
  334. y = x + y;
  335. // z = 12
  336. z = y;
  337. ```
  338.  
  339. ### Övning 3
  340. > Denna får ni beskriva med egna ord men här är ett ungefärlig förklaring
  341.  
  342. __a)__
  343. Funktionen tar 3 argument för att vi har 3 parametrar, alla parametrar multipliceras med varandra inuti funktionen. Vilket gör att vi får `2 * 2 * 2` vilket för att funktionen returnerar `8`
  344. __b)__
  345. Vi kallar på funktionen med enbart 2 argument. Detta skulle möjligtvis kunna gå men vi har sagt att vi ska lägga ihop **alla 3 värden**, om ett av dessa värden saknas så kommer parametern (`c` i det här fallet) att bli `undefined` vilket betyder att vi gör följande `return 2 * 2 * undefined`. Detta kommer att resultera att vi får tillbaka `NaN` (Not A Number). Alternativet är att vi kollar så att alla värden finns med en if-sats och sedan lägger ihop värdena.
  346. __c)__
  347. JavaScript konverterar i smyg alla strängar som kan konverteras till nummer, i detta fall så kan `"2"` bli `2` och inget konstigt händer. Funktionen fungerar som den ska.
  348. __d)__
  349. Nej, vi kan inte skicka med en funktion heller. Funktionen förväntar sig ett värde, en funktion är en variabel men den kan inte multipliceras. Vi skulle kunna lösa detta med följande:
  350. ```js
  351. function multiply(a, b, c){
  352. return a * b * c();
  353. }
  354. ```
  355. Men samtidigt så skulle vi då inte kunna kalla på funktionen med ett sista värde som är ett nummber, sista värdet måste här alltid vara en funktion i så fall. Dum idé!
  356.  
  357.  
  358. > Förklara i text hur funktionen nedan körs när vi kallar på den(dvs. i vilken ordning allt händer) i dessa scenarion:
  359.  
  360. * a) Vi kallar på funktionen med: `multiply(2, 2, 2);`
  361. * b) Vi kallar på funktionen med: `multiply(2, 2);`
  362. * c) Vi kallar på funktionen med: `multiply(2, 2, "2");`
  363. * d) Vi kallar på funktionen med: `multiply(2, 2, function(){ return 2;});`
  364.  
  365. ```javascript
  366. function multiply(a, b, c){
  367. return a * b * c;
  368. }
  369. ```
  370.  
  371. ### Övning 4
  372.  
  373. Argumenten är de värden som skickas med när vi kallar på funktionen. Dessa kan vara ensamstående värden eller variabler. Det spelar ingen roll vad variablerna heter när vi skickar med de som argument, de kommer ändå att få namnen `a,b,c` **inuti** funktionen.
  374. ```js
  375. let blabb = 4;
  376. let slabb = 2;
  377. let klabb = 2;
  378. multiply(2,2,2);
  379. multiply(blabb, slabb, klabb);
  380. ```
  381.  
  382. Parametrarna är de variabler som är innanför paranteserna på en funktion. I det här fallet så är det `a`, `b` och `c`. I princip är det som att vi skapar nya variabler i scopet men vi behöver aldrig skriva `var` eller `let`. `a`, `b` och `c` existerar bara i funktionens scope.
  383. ```js
  384. function multiply(a, b, c){
  385. let a;
  386. let b;
  387. let c;
  388. return a * b * c;
  389. }
  390. ```
  391.  
  392.  
  393. ### Övning 5
  394.  
  395. Vi deklarerar och initierar en global variabel som är av typen `String` och som heter `text`. Vi skapar en funktion som heter `callMe`. Funktionen `callMe` deklarerar en ny variabel som också heter `text`. `text` finns i två olika scope och kan därför ha olika värden utan att störa varandra. Vi returnerar direkt detta inre värde `text` som när vi returnerar det är `"Call me!"`. Eftersom `console.log` ligger efter `return` så kommer de raderna aldrig att nås eftersom vi redan har "gått ur" funktionen, när vi skriver `return` så lämnar vi funktionen. `callMe()` kommer att returnera texten, men den kommer aldrig sparas eller skrivas ut någonstans eftersom vi varken loggar ut den eller sparar den i en variabel.
  396.  
  397. ### Övning 6
  398.  
  399. __a)__
  400. ```js
  401. function foo() {
  402. console.log("test");
  403. }
  404. foo("hej");
  405. ```
  406.  
  407. Svar: `"test"`
  408. Argumentet `"hej"` spelar ingen roll, vi använder det ändå inte så det försvinner bara när vi kallar på funktionen.
  409.  
  410. __b)__
  411. ```js
  412. let a = foo(3);
  413. console.log(a);
  414. function foo(i) {
  415. return i * i;
  416. }
  417. ```
  418.  
  419. Svar: `9`
  420. Funktionen `foo` gångrar värdet som vi skickar in med sig själv. `a` blir därför 3*3 = 9.
  421.  
  422. __c)__
  423. ```js
  424. console.log(foo(3, 5));
  425. function foo(x, y) {
  426. return x * y;
  427. }
  428. ```
  429.  
  430. Svar: `15`, vi kan kalla på en function declaration innan vi har skapat den. Den **hoistas** upp längst upp i scopet
  431.  
  432. __d)__
  433. ```js
  434. console.log(foo(3, 5));
  435. const foo = function(x, y) {
  436. return x * y;
  437. }
  438. ```
  439.  
  440. Svar: `undefined is not a function` vi kan INTE kalla på en function expression innan vi har skapat den. Den **hoistas inte** upp längst upp i scopet
  441.  
  442. __e)__
  443. ```js
  444. let x = 2;
  445. let y = 3
  446. let a = foo(foo(x) + foo(y));
  447. console.log(a);
  448. function foo(i) {
  449. return 5 * i;
  450. }
  451. ```
  452. Svar: `125`
  453.  
  454. `foo` returnernar det värde vi skickar in och gångrar det med 5. På rad tre plussar vi ihop 2 stycken returnvärden från två anrop till `foo`. Så rad tre blir
  455.  
  456. ```
  457. foo(2) === 15
  458. foo(3) === 10
  459. 15 + 10 === 51
  460. foo(25) === 125
  461. ```
  462.  
  463. ---
  464.  
  465. __f)__
  466. ```js
  467. const person = {
  468. name: "Steffe",
  469. sayName(){
  470. console.log(this.name);
  471. }
  472. }
  473. person.sayName();
  474. ```
  475.  
  476. Svar: `"Steffe"`
  477.  
  478. När vi använder `this` pekar vi mot de inre egenskaperna av ett objekt. `this.name` är där vi har skrivit `name: "Steffe`. När vi kallar på funktionen som vanligt så hämtas detta namn upp.
  479.  
  480. ---
  481.  
  482. __g)__
  483. ```js
  484. const person = {
  485. name: "Steffe",
  486. }
  487.  
  488. function sayName(){
  489. console.log(this.name);
  490. }
  491. person.sayName = sayName;
  492. person.sayName();
  493. ```
  494. Svar: `"Steffe"`
  495.  
  496. Vi behöver inte direkt lägga funktionen i objektet. I första läget så kommer funktionen `sayName` INTE skriva ut Steffe då funktionen inte ligger i objektet. Men på näst sista raden så ger vi objektet funktionen så att objektet kommer att se ut som föregående övning och vi får samma resultat. Skulle vi kappa på funktionen som den är `sayName()` så får vi `this === window` medan om vi kallar på `person.sayName` så får vi objektets namn som är `"Steffe"`.
  497.  
  498. ---
  499.  
  500. __h)__
  501. ```js
  502. const animals = ["dog", "cat", "zebra", "horse", "cow"];
  503. animals.shift();
  504. console.log(`My favourite animal is ${animals[0]}`);
  505. ```
  506. Svar: `"cat"`
  507.  
  508. ---
  509.  
  510. __i)__
  511.  
  512. ```js
  513. let a = 5;
  514. function foo(a) {
  515. a++;
  516. }
  517. a += 2;
  518. console.log(a);
  519. ```
  520.  
  521. Svar: `7`
  522.  
  523. funktionen `foo` kallas aldrig på så det är bara den femte raden som gör någonting med `a`. Därför får vi 7 och inte 8.
  524.  
  525. ---
  526.  
  527. __j)__
  528. ```js
  529. function foo(a) {
  530. return a + 2;
  531. };
  532. function goo(x, y) {
  533. return x(y);
  534. };
  535. let a = goo(foo, 3);
  536. console.log(a);
  537. ```
  538.  
  539. Svar: `5`
  540.  
  541. `goo`s första parameter föräntas vara en funktion eftersom vi kallar på den med den andra parametern `x(y)`. `foo` är den funktion som vi skickar med och kallar på den andra parametern med så det vi säger i `goo` är `return foo(3)`. `foo(3)` i sin tur returnerar `return 3 + 2` vilket gör att `a` är `4`;
  542.  
  543. ---
  544.  
  545. __k)__
  546. ```js
  547. var text = "";
  548. var a = {
  549. value: "c"
  550. };
  551. var b = {
  552. value: "a"
  553. };
  554. var c = {
  555. value: "b"
  556. };
  557. text = a.value + b.value + c.value;
  558. console.log(text);
  559. ```
  560.  
  561. Svar: `"cab"`
  562.  
  563. Vi hämtar värdet av varje egenskap `value` i de olika objekten. `value` är dock en sträng i samtliga fall och inte själva värdet. namnet `value` är nyckeln.
  564.  
  565. ---
  566.  
  567. __l)__
  568. ```js
  569. const a = 0;
  570. const objekt = {
  571. a: 100,
  572. b: 200,
  573. c: 300
  574. };
  575. for(const value in objekt){
  576. a += value;
  577. }
  578.  
  579. console.log(a);
  580. ```
  581.  
  582. Svar: **`"0abc"`**
  583.  
  584. `for..in` loopar inte igenom värdena utan enbart nyklarna. Så vi får `a,b,c` och inte `100,200,300`. Vi har redan `0` sen konkatenerar vi på bokstäverna vilket betyder att vi får **`"0abc"`**
  585.  
  586. ---
  587.  
  588. __m)__
  589. ```js
  590. function foo () {
  591. //Här returneras bar() innan funktionen har deklarerats.
  592. return bar();
  593. //Dock så hoistas bar() upp ovanför return vilket gör att funktionen ändå
  594. //kallas på eftersom här blir funktionen deklarerad innan return p.g.a hoist
  595. function bar() {
  596. return "FOOBAR!!";
  597. }
  598. }
  599. console.log(foo());
  600. ```
  601.  
  602. Svar: `"FOOBAR!!"`
  603.  
  604. Märk också att funktionen kallas på när den returnernas. Om vi skulle skriva `return bar` så skulle vi behöva göra följande:
  605.  
  606. ```js
  607. function foo () {
  608. //Här returneras bar() innan funktionen har deklarerats.
  609. return bar();
  610. //Dock så hoistas bar() upp ovanför return vilket gör att funktionen ändå
  611. //kallas på eftersom här blir funktionen deklarerad innan return p.g.a hoist
  612. function bar() {
  613. return "FOOBAR!!";
  614. }
  615. }
  616. const foobar = foo();
  617. console.log(foobar());
  618. ```
  619.  
  620. Vi måste alltid kalla på funktionen `()` för att den ska köras. Annars så skickar vi bara runt variabeln som funktionen ligger i.
Add Comment
Please, Sign In to add comment