# FUNPODIUM 奕兆有限公司 2022/03/07 ###### tags: `面試經驗`、`前端` ## 上機考 [Link](https://vscode.dev/liveshare/FDDC6C26D4F3513656973BEB55FB215CDA02) - 考 JS 語言特性 - Format 資料能力 - React 觀念 1. What will the code below output to the console? ```javascript= console.log(foo); // undefined var foo = 1; console.log(foo); // 1 ``` ```javascript= console.log(foo); // foo is not defined let foo = 1; console.log(foo); // Error 所以跳出 ``` ```javascript= console.log(foo); // foo is not defined const foo = 1; console.log(foo); // Error 所以跳出 ``` ```javascript= foo = 1 console.log(foo) // 1 var foo = 2 console.log(foo) // 2 ``` ```javascript= foo = 1 console.log(foo) // Cannot access 'foo' before initialization let foo = 2 console.log(foo) ``` ```javascript= foo = 1 console.log(foo) // Cannot access 'foo' before initialization const foo = 2 console.log(foo) ``` > Hosting with var、let、const 2. What will the code below output to the console? **Basic** ```javascript= var val = 1; const obj = { val: 2, foo() { return this.val; }, bar: () => { return this.val; }, }; console.log('foo: ', obj.foo()); // 2 console.log('bar: ', obj.bar()); // 1 ``` > obj 呼叫 foo(),所以 this 是 obj > arrow function 是呼叫自己 function scope 外的 scope 的 this **Advanture** ```javascript= var val = 1; const obj = { val: 2, foo() { return this.val; }, bar: () => { const zoo = () => { // this 因為 zoo arrow func 指向 bar 的 func scope 的 this return this.val; } console.log(zoo()) // obj.foo() => 1 return zoo(); }, }; console.log('foo: ', obj.foo()); // 2 console.log('bar: ', obj.bar()); // 1 ``` 3. remove duplicates ```javascript= const arr = [1, 2, 2, 3, 4, 5]; const result = arr.reduce((prev, cur) => { if(!prev.includes(cur)) { prev.push(cur) } return prev }, []) console.log(result) // [1, 2, 3, 4, 5]; ``` 4. Assuming we have an array that ```javascript= // From const arr = [ { name: 'John', age: 18 }, { name: 'Peter', age: 20 }, ]; // format to output: { names: ['John', 'Peter'], ageSummary : 38 } ``` ```javascript= const result = arr.reduce((prev, cur) => { prev.names.push(cur.name) prev.ageSummary += cur.age return prev }, {names: [], ageSummary: 0}) ``` > 這題關鍵是知道 reduce 的 inital 可以初始的很詳細 5. What will the code below output to the console? ```javascript= import React, { useState, useEffect } from 'react'; const Component = () => { const [foo, setFoo] = useState('a'); useEffect(() => { setFoo('b'); }, []); useEffect(() => { console.log('effect', foo); }, [foo]); console.log('render', foo); return <div></div>; }; export default Component; ``` ``` render: a effect: a render: b effect: b ``` > 這題是知道 render 與 useEffect 執行順序 第一次程式 render 由上往下, foo 是 'a', 繼續往下 遇到第一個 useEffect 要做 setState, 此行為先暫存,再往下遇到到二個 useEffext, 此行為要 console.log, 先往後暫存,之後往下執行 console.log('render'), 印出 `render a` 接下來繼續把之前的第一個useEffect暫存的動作做完,所以把foo做setState成b,之後把第二個useEffect暫存的動作執行 console.log 印出 `effect a`, 因為被setState,所以Component re-render,程式下面的console.log `render b` 一次, useEffect 的 foo因為改變,所以再 console.log 一次 `effect 'b'`