Skip to content

Commit 736210a

Browse files
committed
ADD : [Performance] 분석 툴 소개 글 추가
1 parent c4b73be commit 736210a

File tree

12 files changed

+322
-0
lines changed

12 files changed

+322
-0
lines changed

.DS_Store

10 KB
Binary file not shown.

_posts/CS/.DS_Store

6 KB
Binary file not shown.

_posts/CS/Database/.DS_Store

6 KB
Binary file not shown.

_posts/CleanCode/.DS_Store

6 KB
Binary file not shown.

_posts/CodingTest/.DS_Store

6 KB
Binary file not shown.
8 KB
Binary file not shown.
6 KB
Binary file not shown.

_posts/Git/.DS_Store

8 KB
Binary file not shown.
Lines changed: 322 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
---
2+
title: "Javscript : 알쓸신잡(알아두면 쓸모있는 신기한 잡아스크립트) - Javascript"
3+
excerpt_separator: <!--more-->
4+
categories:
5+
- Javscript
6+
tags:
7+
- Javscript
8+
toc: true
9+
toc_sticky: true
10+
toc_label: 목차
11+
---
12+
13+
# 알쓸신잡(알아두면 쓸모있는 신기한 잡아스크립트) - Javascript
14+
15+
저는 기존에 백 엔드 개발자를 목표로 Java와 Spring 공부를 했었는데, 회사에 입사 후 프론트 관련 개발을 진행하면서 프론트 엔드 개발자로 직무 전환을 생각하고 있습니다.
16+
17+
그 과정 중에서 다양한 자바스크립트 글을 보고 문제를 직면하면서 생소한 부분들을 정리해논 글 입니다.
18+
19+
> 단순히 제 주관으로 판단하고 작성하는 글이기 때문에 가이드가 될 수는 없으니 주의해주시면 감사하겠습니다 :star2:
20+
21+
22+
23+
24+
25+
# REPL(Read Eval Print Loop)
26+
27+
기본적으로 Javascript는 컴퓨터가 한줄 씩 읽는 인터프리터 방식의 언어입니다.
28+
29+
이 Javascript는 브라우저의 콘솔에서도 사용할 수 있습니다. 이 때, 브라우저의 콘솔에서 **한 줄씩 입력(Read)**받고 받은 **입력을 평가(Eval)**한 후 **결과를 출력(Print)**합니다. 그 후 다시 프롬프트가 나타나 **새로운 입력을 기다립니다.(Loop)**
30+
31+
이 과정을 `REPL(Read-Eval-Print-Loop)`라고 합니다.
32+
33+
34+
35+
36+
37+
# Number와 parseInt/parseFloat의 차이
38+
39+
아래의 예시와 같이 `Number`는 안에 들어있는 값이 전부 숫자가 아니라면 `Nan(Not a Number)`를 반환하고 `parseInt/parseFloat`**Int와 Float으로 인식할 수 있는 위치까지 읽어 해당 타입**으로 반환합니다.
40+
41+
```javascript
42+
Number('234오오오테스트324'); // Nan(Not a Number)
43+
44+
parseInt('234오오오테스트324'); // 234
45+
parseInt('234.23423오오오테스트324'); //234
46+
47+
parseFloat('234오오오테스트324'); // 234
48+
parseFloat('234.23423오오오테스트324'); // 234.23423
49+
```
50+
51+
> 참고로 `Nan``typeof`로 체크해보면 숫자라고 나옵니다.
52+
53+
54+
55+
56+
57+
# prompt()
58+
59+
값을 입력할 수 있는 시스템 창을 출력합니다.
60+
61+
62+
63+
64+
65+
# 빼기(-) 연산자
66+
67+
`1 + '0'` 처럼 더하기 연산자는 숫자가 문자열로 변환 후, 더하기 연산을 진행하는것은 대부분이 다 아는 사실일 겁니다.
68+
69+
하지만, 빼기 연산자는 문자열이 숫자로 바뀐 후 연산합니다. 때문에 **문자열에 숫자가 아닌 다른 문자가 들어올 경우 Nan을 반환**합니다.
70+
71+
즉, 위에서 말한 것 처럼 문자열이 `parseInt`보다는 `Number`가 적용되는 것이라고 볼 수 있습니다.
72+
73+
74+
75+
76+
77+
# NaN끼리 비교하기
78+
79+
값 중에서 NaN은 비교할 때 독특한 성질을 가집니다. 바로 NaN끼리 비교할 때 false 값을 가진다는 것입니다.
80+
81+
```javascript
82+
> NaN == NaN;
83+
< false
84+
```
85+
86+
87+
88+
89+
90+
# 문자열 코드 보기
91+
92+
`charCodeAt()`이라는 메서드를 사용하면 해당 문자가 어떤 코드 번호를 가지고 있는지 알 수 있습니다.'
93+
94+
```javascript
95+
> '&'.charCodeAt();
96+
< 65286
97+
> 'a'.charCodeAt();
98+
< 97
99+
> 'b'.charCodeAt();
100+
< 98
101+
```
102+
103+
104+
105+
106+
107+
# 문자와 숫자 비교
108+
109+
Javascript에서 문자와 숫자를 비교할 때, **문자를 숫자로 변환 후 비교**하게 됩니다. 이 때, 숫자로 변환할 수 없는 문자는 `NaN`이 됩니다.
110+
111+
```javascript
112+
> '1' < 5
113+
< true
114+
> 'abc' < 5
115+
< false
116+
```
117+
118+
119+
120+
121+
122+
# !!연산자
123+
124+
`!`가 true를 false로 false를 true로 바꿔주는 연산자이기 때문에 `!!`를 사용하면 해당 연산자를 붙인 코드가 true인지 false인지를 판단할 수 있다.
125+
126+
```javascript
127+
> !!false // false -> true -> false
128+
< false
129+
130+
> !!'' // false(''은 false) -> true -> false
131+
< false
132+
133+
> !!0 // false(0은 false) -> true -> false
134+
< false
135+
136+
> !!NaN // false(NaN은 false) -> true -> false
137+
< false
138+
139+
> !!undefined // false(undefined은 false) -> true -> false
140+
< false
141+
142+
> !!null // false(null은 false) -> true -> false
143+
< false
144+
145+
> !!document.all // false(document.all은 false, 잘 사용하지 않음) -> true -> false
146+
false
147+
```
148+
149+
위의 경우를 제외하고 대부분이 true이기 때문에 **!!를 이용해서 해당 코드가 있는지 없는지를 판단**할 수 있습니다.
150+
151+
152+
153+
154+
155+
# typeof null
156+
157+
`typeof null`은 원래 null이 나와야 하지만 **결과값은 object**가 나옵니다. 이 현상은 **자바스크립트의 유명한 버그**입니다. 언어가 만들어진 초창기에 object가 되었는데, 기존에 typeof null을 사용하는 모든 곳에 영향을 끼치기 때문에 버그를 수정할 수가 없었다고 합니다.
158+
159+
이 버그를 보고 초반 설계의 중요성에 대해 생각해볼 수 있습니다.
160+
161+
162+
163+
164+
165+
# let let = '1' 선언했을 때 오류 메시지가 다른 이유
166+
167+
`var var = 3;` 처럼 예약어를 변수의 이름으로 사용했을 때, `Unexpected token 'var'`라는 에러 메시지가 나옵니다.
168+
169+
하지만 `let let = '1'`로 선언하게 된다면 `let is disallowed as a lexically bound name`라는 에러메시지가 나옵니다.
170+
171+
그 이유는 ES2015 표준 이전에는 let 선언이 없었으므로 let을 변수 이름으로 자유롭게 사용할 수 있었습니다. 변수 이름 허용을 중지하도록 언어를 변경하면 let이 완벽한 변수 이름이었던 ES2015 이전에 작성된 애플리케이션이 손상될 수 있습니다. (1995년부터 2015년까지 20년 동안!)
172+
173+
let은 ES2015의 새로운 기능이었기 때문에 기존 코드를 끊을 수 없었습니다. 때문에 let을 사용할 때, let을 변수 이름으로 허용하지 않음으로써 잠재적인 구문 혼란의 원인을 피할 수 있었습니다.
174+
175+
> 때문에 ES2015전에 사용했던 var를 **var let = 3; 같은 형식으로 사용하는 것은 올바른 문법**이 됩니다.
176+
177+
178+
179+
180+
181+
# 변수의 값을 변경하면 반환값이 undefined가 아니다?!
182+
183+
```javascript
184+
> let test = 1; // 처음 test를 초기화할 때는 undefined를 반환하지만
185+
< undefined
186+
> test = 2; // 해당 변수의 값을 바꾼다면, 바꾼 값을 반환합니다.
187+
< 2
188+
```
189+
190+
191+
192+
193+
194+
# 빈 값을 넣을 때는 null을 사용하자!
195+
196+
undefined는 빈 값이기 때문에 특정 변수에 빈 값을 넣을 때는 null을 사용함으로써, **의도적으로 null을 넣었다는 것을 표현**해주는 것이 좋습니다.
197+
198+
만약, undefined를 넣었다면, 다른 개발자나 내가 추후에 다시 해당 변수를 사용해야할 때, 기본값이라고 생각하여 상의하지 않고 값을 변경할 수도 있기 때문입니다.
199+
200+
201+
202+
203+
204+
# 배열 메서드
205+
206+
아래와 같은 배열이 있다고 가정합니다.
207+
208+
```javascript
209+
const arr = ['', '', '', '', ''];
210+
```
211+
212+
213+
214+
## 추가 및 제거
215+
216+
- `shift` : 배열 맨 앞에 값을 제거함 :arrow_right: arr.shift();
217+
- `unshift` : 배열 맨 앞에 값을 추가함 :arrow_right: arr.unshift('가');
218+
- `push` : 배열 맨 뒤에 값을 추가함 :arrow_right: arr.push('다');
219+
- `pop` : 배열 맨 뒤 값을 제거함 :arrow_right: arr.pop();
220+
- `splice` : 다양하게 배열의 값을 제거하거나 추가할 수 있음
221+
- arr.splice(1,2) :arrow_right: 배열의 1번 째 인덱스부터 2개의 값을 지움
222+
- arr.splice(1) :arrow_right: 배열의 1번 째 인덱스 뒤의 값을 모두 지움
223+
- arr.splice(1, 3, "타", "파") :arrow_right: 배열의 1번 째 인덱스부터 3개의 값을 지운 후, 타, 파를 끼워넣음
224+
- arr.splice(1, 0, "타", "파") :arrow_right: 배열의 1번 째 인덱스 앞에 타, 파를 끼워넣음
225+
226+
227+
228+
## 요소 찾기
229+
230+
- `includes` : 배열 안에 값이 있는지 체크(true/false) :arrow_right: arr.includes('가'); // **true**
231+
- `indexOf` : 배열의 앞에서부터 해당 값의 인덱스 번호를 찾아줌 없으면 -1 :arrow_right: arr.indexOf('라'); // **3**
232+
- `lastIndexOf` : 배열의 뒤에서부터 해당 값의 인덱스 번호를 찾아줌 없으면 -1 :arrow_right: arr.lastIndexOf('하'); // **-1**
233+
234+
235+
236+
237+
238+
# 함수
239+
240+
## 함수에 이름을 붙이는 방법 3가지
241+
242+
1. `함수 선언문(function declaration statement)` : function예약어 다음에 이름을 붙이는 방법 :arrow_right: function a() {}
243+
2. `함수 표현식(function expression)` : 변수를 만들어 함수를 넣는 방법 :arrow_right:const a = function() {}
244+
3. `화살표 함수(익명 함수)` : 변수를 만들어 함수를 넣는 방법(화살표 함수는 해당 방식만 가능) :arrow_right: const a = () => {}
245+
246+
247+
248+
## 함수의 parameter와 argument
249+
250+
가끔 parameter와 argument를 헷갈리곤 하는데, 정확히 정의하자면 아래와 같습니다.
251+
252+
- `parameter` : 함수를 선언할 때 받는 매개변수
253+
- `argument` : 함수를 호출할 때 넣어주는 인수
254+
255+
만약 함수의 parameter(매개변수)와 argument(인수)가 일치하지 않는다면, **짝지어지지 않은 매개변수는 undefined**가 되고 **짝지어지지 않은 인수는 무시**됩니다.
256+
257+
258+
259+
260+
261+
# 객체
262+
263+
## 객체 속성의 접근방법
264+
265+
```javascript
266+
const obj = {
267+
bc : 'hello',
268+
ab : 'hi',
269+
dc : 'world',
270+
// 아래는 특수한 이름을 가진 속성(문자열로 묶어주어야 함)
271+
'2bc' : 'unique',
272+
'a b' : 'space',
273+
}
274+
```
275+
276+
위와 같은 객체가 있을 때, 자바스크립트에서 2가지 방법으로 접근할 수 있습니다.
277+
278+
1. 온점으로 구분하는 방법 :arrow_right: obj.bc
279+
2. 대괄호로 구분하는 방법(이 때, 속성명을 문자열로 묶어주어야 한다는 것을 유의) :arrow_right: obj['bc']
280+
281+
이렇게 **객체에 접근하는 방법이 나뉘어져 있는 이유는 '2bc', 'a b'와 같은 특수한 경우 때문**입니다.
282+
283+
속성명 앞에 숫자가 오거나 공백이 있는 경우는 **obj.2bc 처럼 온점으로 구별할 수 없기 때문에 대괄호로 구분**하는 방법이 있는 것입니다.
284+
285+
286+
287+
288+
289+
## 배열과 함수도 객체다?!
290+
291+
자바스크립트에서 배열과 함수도 객체이기 때문에 객체와 같이 속성을 정의할 수 있습니다.
292+
293+
```javascript
294+
function hello() {}
295+
hello.a = 'really?';
296+
297+
const array = [];
298+
array.b = 'wow';
299+
300+
console.log(hello.a);
301+
console.log(array.b);
302+
```
303+
304+
즉, 배열과 함수는 객체를 각각 배열과 함수모양으로 만들어 놓은 것이라고 생각하면 됩니다.
305+
306+
> 하지만, 목적에 맞게 사용하는 것이 중요합니다.
307+
308+
309+
310+
311+
312+
# call(), apply(), bind()
313+
314+
call, apply, bind는 함수 호출과 관련된 메서드 입니다. 해당 내용에 대한 설명은 아래의 링크를 참고하는 게 좋을 것 같습니다.
315+
316+
- [함수 호출 call, apply, bind의 차이](https://velog.io/@josworks27/%ED%95%A8%EC%88%98%ED%98%B8%EC%B6%9C-call-apply-bind-%EC%B0%A8%EC%9D%B4)
317+
318+
319+
320+
---
321+
322+
참고 : [[리뉴얼] 렛츠기릿 자바스크립트](https://www.inflearn.com/course/%EB%A0%88%EC%B8%A0%EA%B8%B0%EB%A6%BF-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8/dashboard)

_posts/Vue/.DS_Store

6 KB
Binary file not shown.

0 commit comments

Comments
 (0)