You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
객체를 분해함으로써, 오른쪽 객체의 값을 꺼내고, 꺼낸 값은 왼쪽 객체에 같은 속성 이름의 값으로 할당 할 수 있어요. 이 경우, 값 "💀"을 `spookyItems[3]`에 할당했어요. 이건 `spookyItems`을 수정, 즉 배열에 "💀"을 추가한다는 의미예요. `spookyItems`을 출력하면, `["👻", "🎃", "🕸", "💀"]`이 출력ㅗ대요.
4103
+
4104
+
</p>
4105
+
</details>
4106
+
4107
+
---
4108
+
4109
+
###### 128. 무엇이 출력 될까요?
4110
+
4111
+
```javascript
4112
+
const name = 'Lydia Hallie';
4113
+
const age = 21;
4114
+
4115
+
console.log(Number.isNaN(name));
4116
+
console.log(Number.isNaN(age));
4117
+
4118
+
console.log(isNaN(name));
4119
+
console.log(isNaN(age));
4120
+
```
4121
+
4122
+
- A: `true` `false` `true` `false`
4123
+
- B: `true` `false` `false` `false`
4124
+
- C: `false` `false` `true` `false`
4125
+
- D: `false` `true` `false` `true`
4126
+
4127
+
<details><summary><b>답</b></summary>
4128
+
<p>
4129
+
4130
+
#### 답: C
4131
+
4132
+
`Number.isNaN` 메소드를 사용하면, 전달한 값이 _숫자 값_ 그리고 `NaN`인지 확인 할 수 있어요. `name`은 숫자 값이 아니에요, 따라서 `Number.isNaN(name)` 은 `false`을 반환해요. `age`는 숫자 값이지만, `NaN`은 아니에요, 따라서 `Number.isNaN(age)`은 `false`을 반환해요.
4133
+
4134
+
`isNaN` 메소드를 사용하면, 전달한 값이 숫자가 아닌지 확인할 수 있어요. `name`은 숫자가 아니에요, 따라서 `isNaN(name)`은 true를 반환해요. `age`은 숫자이고, 따라서 `isNaN(age)`은 `false`을 반환해요.
4135
+
4136
+
</p>
4137
+
</details>
4138
+
4139
+
---
4140
+
4141
+
###### 129. 무엇이 출력 될까요?
4142
+
4143
+
```javascript
4144
+
const randomValue = 21;
4145
+
4146
+
function getInfo() {
4147
+
console.log(typeof randomValue);
4148
+
const randomValue = 'Lydia Hallie';
4149
+
}
4150
+
4151
+
getInfo();
4152
+
```
4153
+
4154
+
- A: `"number"`
4155
+
- B: `"string"`
4156
+
- C: `undefined`
4157
+
- D: `ReferenceError`
4158
+
4159
+
<details><summary><b>답</b></summary>
4160
+
<p>
4161
+
4162
+
#### 답: D
4163
+
4164
+
`const` 키워드를 사용해 선언된 변수는 초기화 되기 전에 참조 할 수 없어요: 이건 _일시적 사각지대_ 라고 불려요. `getInfo`힘수에서, 변수 `randomValue`는 함수 `getInfo`의 스코프 안에 있어요. `typeof randomValue`의 값을 출력하고 싶은 줄에서, 변수 `randomValue`는 아직 초기화 되지 않았어요: `ReferenceError`가 던져져요! 변수 `randomValue`를 함수 `getInfo`안에 선언했기 때문에 엔진은 스코프 체인 아래로 내려가지 않아요.
4165
+
4166
+
</p>
4167
+
</details>
4168
+
4169
+
---
4170
+
4171
+
###### 130. 무엇이 출력 될까요?
4172
+
4173
+
```javascript
4174
+
const myPromise = Promise.resolve('Woah some cool data');
4175
+
4176
+
(async () => {
4177
+
try {
4178
+
console.log(await myPromise);
4179
+
} catch {
4180
+
throw new Error(`Oops didn't work`);
4181
+
} finally {
4182
+
console.log('Oh finally!');
4183
+
}
4184
+
})();
4185
+
```
4186
+
4187
+
-A:`Woah some cool data`
4188
+
-B:`Oh finally!`
4189
+
-C:`Woah some cool data``Oh finally!`
4190
+
-D:`Oops didn't work``Oh finally!`
4191
+
4192
+
<details><summary><b>답</b></summary>
4193
+
<p>
4194
+
4195
+
#### 답:C
4196
+
4197
+
`try` 블록에서, `myPromise`의 awaited 값을 출력하고 있어요:`"Woah some cool data"`. `try` 블록에서 오류가 없기 때문에, `catch` 블록 안의 코드는 실행되지 않아요. `finally` 블록 안의 코드는 _항상_ 실행되고, `"Oh finally!"`가 출력돼요.
4198
+
4199
+
</p>
4200
+
</details>
4201
+
4202
+
---
4203
+
4204
+
###### 131. 무엇이 출력 될까요?
4205
+
4206
+
```javascript
4207
+
const emojis = ['🥑', ['✨', '✨', ['🍕', '🍕']]];
4208
+
4209
+
console.log(emojis.flat(1));
4210
+
```
4211
+
4212
+
-A:`['🥑', ['✨', '✨', ['🍕', '🍕']]]`
4213
+
-B:`['🥑', '✨', '✨', ['🍕', '🍕']]`
4214
+
-C:`['🥑', ['✨', '✨', '🍕', '🍕']]`
4215
+
-D:`['🥑', '✨', '✨', '🍕', '🍕']`
4216
+
4217
+
<details><summary><b>답</b></summary>
4218
+
<p>
4219
+
4220
+
#### 답:B
4221
+
4222
+
`flat`를 사용하면, 새로운 평평한 배열을 만들어요. 평평한 배열의 깊이는 전달한 값에 달려있어요. 이 경우, 값 `1`(기본 값)을 전달했고,, 1번째 깊이에 있는 배열만 연결된다는 뜻이에요. 이 경우에선 `['🥑']` 그리고 `['✨', '✨', ['🍕', '🍕']]`. 두 배열을 연결하면 `['🥑', '✨', '✨', ['🍕', '🍕']]`가 돼요.
4223
+
4224
+
</p>
4225
+
</details>
4226
+
4227
+
---
4228
+
4229
+
###### 132. 무엇이 출력 될까요?
4230
+
4231
+
```javascript
4232
+
class Counter {
4233
+
constructor() {
4234
+
this.count = 0;
4235
+
}
4236
+
4237
+
increment() {
4238
+
this.count++;
4239
+
}
4240
+
}
4241
+
4242
+
const counterOne = new Counter();
4243
+
counterOne.increment();
4244
+
counterOne.increment();
4245
+
4246
+
const counterTwo = counterOne;
4247
+
counterTwo.increment();
4248
+
4249
+
console.log(counterOne.count);
4250
+
```
4251
+
4252
+
-A:`0`
4253
+
-B:`1`
4254
+
-C:`2`
4255
+
-D:`3`
4256
+
4257
+
<details><summary><b>답</b></summary>
4258
+
<p>
4259
+
4260
+
#### 답:D
4261
+
4262
+
`counterOne`는 클래스 `Counter`의 인스턴스예요. counter 클래스는 생성자 안에 속성 `count`와 `increment` 메소드를 포함해요. 우선, `counterOne.increment()`를 사용해 `increment` 메소드를 두 번 호출해요. 현재, `counterOne.count`는 `2`예요.
그리고서, 새로운 변수 `counterTwo`를 만들고, `counterOne`과 동일하게 설정해요. 객체는 참조로 상호작용 하므로, `counterOne`을 가리키는 같은 메모리 영역에 새로운 참조를 만들었어요. 메모리의 같은 장소에 존재 하므로, 참조를 가진 `counterTwo` 객체의 모든 변화는, `counterOne` 객체에도 적용돼요. 지금, `counterTwo.count`은 `2`예요.
-A:`Promise! Last line! Promise! Last line! Last line! Promise!`
4300
+
-B:`Last line! Timeout! Promise! Last line! Timeout! Promise!`
4301
+
-C:`Promise! Last line! Last line! Promise! Timeout! Timeout!`
4302
+
-D:`Last line! Promise! Promise! Last line! Timeout! Timeout!`
4303
+
4304
+
<details><summary><b>답</b></summary>
4305
+
<p>
4306
+
4307
+
#### 답:D
4308
+
4309
+
우선, `funcOne`를 호출했어요. `funcOne`의 첫 번째 줄에서, _비동기_ 작업 `myPromise` 프로미스를 불러요. 엔진이 프로미스를 처리하느라고 바쁜 와중에도, 계속해서 `funcOne` 함수를 실행해요. 다음 줄은 _비동기_ `setTimeout` 함수이고, 콜백을 Web API로 보내요. (내가 작성한 이벤트 루프에 대한 글 보기 <a href="https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif">여기</a>.)
4310
+
4311
+
프라미스와 타임아웃 모두 비동기 작업이고, 함수는 프라미스 함수와 `setTimeout` 콜백을 처리하느라고 바쁜 와중에도 계속해서 실행해요. 이건 비동기 작업이 아닌 `Last line!`가 첫 번째로 출력된다는 걸 의미해요. 이건 `funcOne` 함수의 마지막 줄에 있고, 프라미스가 resolved 되어, `Promise!`가 출력돼요. 그러나, `funcTwo()`를 호출 했기 때문에, 콜 스택은 비어있지 않고, `setTimeout` 콜백 함수는 아직 콜 스택에 추가할 수 없어요.
4312
+
4313
+
`funcTwo`에서, 우선 myPromise 프라미스를 _기다려요_. `await`키워드를 사용해서, 프라미스가 resolved (or rejected) 될 때까지 함수의 실행을 멈췄어요. 그리고서, `res`의 값을 기다렸다가 출력해요. (프라미스 자체가 프라미스를 반환하기 때문에). 이건 `Promise!`을 출력해요.
4314
+
4315
+
다음 줄은 _비동기_ `setTimeout` 함수로, 콜백을 Web API로 보내요.
4316
+
4317
+
`funcTwo`의 마지막 줄에서, `Last line!`가 콘솔에 출력돼요. 지금, `funcTwo`가 콜 스택에서 제거되었기 때문에, 콜 스택은 비어있어요. 대기열에서 대기 중인 콜백은(`funcOne`에서의 (`() => console.log("Timeout!")`, 그리고 `funcTwo`에서의 `() => console.log("Timeout!")`) 호출 스택에 하나씩 추가되어요. 첫 번째 콜백은 `Timeout!`을 출력하고, 스택에서 제거돼요. 그리고서, 두 번째 콜백은 `Timeout!`을 출력하고, 스택에서 제거돼요. 이건 `Last line! Promise! Promise! Last line! Timeout! Timeout!`을 출력해요.
4318
+
4319
+
</p>
4320
+
</details>
4321
+
4322
+
---
4323
+
4324
+
###### 134.`index.js`에서 `sum.js` 안에 있는 `sum`을 호출 하려면 어떻게 해야하나요?
4325
+
4326
+
```javascript
4327
+
// sum.js
4328
+
export default function sum(x) {
4329
+
return x + x;
4330
+
}
4331
+
4332
+
// index.js
4333
+
import * as sum from './sum';
4334
+
```
4335
+
4336
+
-A:`sum(4)`
4337
+
-B:`sum.sum(4)`
4338
+
-C:`sum.default(4)`
4339
+
-D: Default aren't imported with `*`, only named exports
4340
+
4341
+
<details><summary><b>답</b></summary>
4342
+
<p>
4343
+
4344
+
#### 답: C
4345
+
4346
+
별표 `*`를 사용하면, 파일에서 내보낸 모든 값(기본값과 명명된 것 모두)을 가져와요. 만약 다음 파일을 가지고 있다면:
4347
+
4348
+
```javascript
4349
+
// info.js
4350
+
export const name = 'Lydia';
4351
+
export const age = 21;
4352
+
export default 'I love JavaScript';
4353
+
4354
+
// index.js
4355
+
import * as info from './info';
4356
+
console.log(info);
4357
+
```
4358
+
4359
+
아래와 같이 출력될 거예요:
4360
+
4361
+
```javascript
4362
+
{
4363
+
default: "I love JavaScript",
4364
+
name: "Lydia",
4365
+
age: 21
4366
+
}
4367
+
```
4368
+
4369
+
`sum`을 예로 들자면, 가져온 `sum`의 값은 다음처럼 보인다는 의미에요:
4370
+
4371
+
```javascript
4372
+
{ default: function sum(x) { return x + x } }
4373
+
```
4374
+
4375
+
`sum.default`을 불러 함수를 호출 할 수 있어요.
4376
+
4377
+
</p>
4378
+
</details>
4379
+
4380
+
---
4381
+
4382
+
###### 135. 무엇이 출력 될까요?
4383
+
4384
+
```javascript
4385
+
const handler = {
4386
+
set: () => console.log('Added a newproperty!'),
4387
+
get: () => console.log('Accessed a property!'),
4388
+
};
4389
+
4390
+
const person = new Proxy({}, handler);
4391
+
4392
+
person.name = 'Lydia';
4393
+
person.name;
4394
+
```
4395
+
4396
+
- A: `Added a new property!`
4397
+
- B: `Accessed a property!`
4398
+
- C: `Added a new property!` `Accessed a property!`
4399
+
- D: Nothing gets logged
4400
+
4401
+
<details><summary><b>답</b></summary>
4402
+
<p>
4403
+
4404
+
#### 답: C
4405
+
4406
+
Proxy 객체를 사용하면, 두번째 인수로 전달 한 객체에 사용자 지정 동작을 추가 할 수 있어요. 이 경우엔, 두 개의 속성을 가진 `handler` 객체를 전달 했어요: `set` 과 `get` 속성 값을 _설정_ 할 때마다 `set`은 호출되고, `get`은 속성 값을 _얻을_ (접근)때 마다 호출되어요.
4407
+
4408
+
첫 번째 인수는 빈 객체 `{}`고, `person`의 값이에요. 이 객체에 객체 `handler`의 사용자 지정 동작을 추가했어요. `person` 객체에 속성을 추가하면, `set` 이 호출 돼요. `person` 객체의 속성에 접근하면, `get` 이 호출 돼요.
4409
+
4410
+
우선, 프록시 객체에 새로운 속성 `name`을 추가했어요(`person.name = "Lydia"`). `set`이 호출되고, `"Added a new property!"`을 출력 해요.
4411
+
4412
+
그리고서, 프록시 객체의 속성 값에 접근하고, handler 객체의 속성 `get` 이 호출 돼요. `"Accessed a property!"`을 출력 해요.
4413
+
4414
+
</p>
4415
+
</details>
4416
+
4417
+
---
4418
+
4419
+
###### 136. 다음 중 어느 것이 `person` 객체를 수정 할 수 있을까요?
4420
+
4421
+
```javascript
4422
+
const person = { name: 'Lydia Hallie' };
4423
+
4424
+
Object.seal(person);
4425
+
```
4426
+
4427
+
- A: `person.name = "Evan Bacon"`
4428
+
- B: `person.age = 21`
4429
+
- C: `delete person.name`
4430
+
- D: `Object.assign(person, { age: 21 })`
4431
+
4432
+
<details><summary><b>답</b></summary>
4433
+
<p>
4434
+
4435
+
#### 답: A
4436
+
4437
+
`Object.seal`을 사용하면, 새로운 속성이 _추가_ 되거나, 혹은 존재하는 속성이 _제거_ 되는 것을 막을 수 있어요.
0 commit comments