-
javascript를 쓰지만 내가 잘 몰랐던 것들javascript 2020. 10. 20. 01:30
1. null과 undefined
- 어떤 변수의 값이 undefined(primitive type)이라면, 그 변수의 값이 아직 할당되지 않았음을 의미한다.
- null == undefined // true
- null === undefined // false
- 아직 선언하지 않은 변수이름에 대해
typeof x === 'undefined' // true - null은 "어떤 값이 의도적으로 비어있음을 표현"한다.
- 즉 null은 undefined와 달리, 존재하는 변수의 값을 나타내는데에 쓰며
값이 없음(변수가 가리키고 있는 객체가 없음)을 나타낼 때 쓴다. - typeof null === 'object'
Object는 null의 상속객체이기 때문에, 하위호환을 위해 typeof null은 'object'이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/null
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/undefined2. javascript의 일급함수 (first class function)
- javascript에서는 함수를 변수에 할당할 수 있다. (변수가 가리키고 있는 객체가 함수일 수 있다)
- 이때 function을 first class(일급 시민)의 특성을 가진다고 한다고 한다고 한다.
- 어떤 변수가 함수를 가리키고 있을때, 변수이름에 ()을 붙이면 함수가 호출된다.
3. prototype
- "Javascript는 Prototype-based language이다."
모든 객체(Object)들이 prototype object를 가지는데,
이 prototype object은 "메소드와 속성을 상속받기위한 템플릿"의 역할을 합니다. - Object A (- prototype A)
extends Object B (- prototype B)
A가 B를 상속받으면, prototype A는 prototype B의 메소드와 속성을 상속받는다.
이런 prototype들의 상속 관계를 prototype chain으로 부른다.
prototype chaining으로 인해 javascript에서는 상속받은 Object들의 메소드와 속성을 사용할 수 있게 된다. - 어떤 Object를 상속받는다는 것은, 그 Object의 prototype을 상속받기 위함이다.
왜냐, 상속을 통해 받을 수 있는 메소드와 속성은 Object의 prototype에 있는 것들만이기 때문 - 객체 생성자에는 prototype 속성이 있고, 생성자를 통해 만들어진 객체 인스턴스는
prototype 속성을 통해 prototype chain에 접근할 수 있습니다. - Object.getPrototypeOf(obj) 혹은
(deprecated)obj.__proto__ 를 통해 접근하는 것은
obj, 즉 생성자를 통해 생성된 개별 객체의 속성이며, ex) var obj = new Object()
객체 생성자의 속성을 지칭하지는 않는다. 다만 그 둘의 반환값이 동일할 뿐.
Object.getPrototypeOf(new Foobar()) == Foobar.prototype
developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Object_prototypes
4. function
- 모든 javascript 함수는 Function 객체입니다.
모든 객체는 Object의 자손입니다
5. this (추가 필요)
- this는 strict모드와 비엄격모드에서 다르게 적용된다.
- 보통 함수를 호출한 방법에 따라 다르게 결정된다.
6. javascript에서 callback의 의미
- javascript에서 callback function의 의미란?
- javascript가 돌아가는 브라우저의 엔진은 single thread로 돌아간다.
- 따라서 비동기 작업을 처리하기위해서 어떻게 할까?
- javascript 엔진은 실행하고자 예약된 비동기 함수들을 저장하고 실행하는 구조를 가지고 있다.
- CallBack Queue를 갖고 있는데, 비동기로 처리해야할 함수들(callback 함수들)은 우선 Queue에 저장되고,
지금 thread가 처리해야할 것들이 없으면(call stack이 비어있는 상태) Callback Queue에 있는 비동기로 처리하고자 약속한 함수들을 하나하나 꺼내 실행한다. - 이렇게 동기로 처리해야할 프로세스와 비동기로 처리해야할 프로세스를 꺼내고 실행하고 저장하는것을 javascrtip엔진의 EventLoop으로 부른다.
- callback이란 프로그래밍하는 입장에서는 비동기로 나중에 처리하고자 예약해 놓는 함수으로 생각할 수 있지만
javascript 입장에서는 비동기 그 자체(?) 일것이다.
7. Promise와 async await
- Promise는 뭐일까?
- Promise는 비동기의 결과를 성공이든 실패든 상관없이 저장하고 있는, 감싸고 있는 객체이다.
- 비동기 프로세스의 결과가 성공일지, 실패일지는 이 비동기의 결과물인 Promise를 까봐야 알 수 있다.
- 어떻게 보면, 비동기 작업의 결과를 Wrapping? 하는 것으로도 생각할 수 있을듯.
- Promise 객체는 Executor 함수를 담고 있는데, 이 Executor 함수의 구조는 어떤 실행과, 그 실행이 성공했을 때 호출할 함수, 실패했을 때 호출할 함수를 담고있다.
'javascript' 카테고리의 다른 글
Chrome Extension 개발 이제 여기에 react를 끼얹은... (0) 2021.02.12 Chrome Extension 개발 해보기 - Getting Started 따라하기 (0) 2021.02.11 [typescript] nodejs 서버 구축하기 - 1 (0) 2020.12.07 Javascript class의 내부 함수, method (0) 2020.11.26 Javascript Import에 대하여 - import React from 'react' (0) 2020.11.23