운영체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램.
명령 프롬프트는 윈도우의 CLI 셸이다. (출처 - 위키백과 https://ko.wikipedia.org/wiki/%EC%85%B8)
이름이 셸(shell)인 이유는 사용자와 운영체제의 내부(커널) 사이의 인터페이스를 감싸는 층이기 때문이다.
셸은 일반적으로 명령 줄과 그래픽 형 두 종류로 분류된다.
명령 줄 셸은 CLI(command-line interface, 명령 줄 인터페이스)를 제공하는 반면,
그래픽 셸은 GUI(graphical user interface, 그래픽 사용자 인터페이스)를 제공한다.
옵셔널 체이닝이 있기 전에 한 사례를 보면 없는 정보를 변수에 할당하려할 때
let user = {};
alert(user.address.street); // TypeError: Cannot read property 'street' of undefined
TypeError가 발생하여 코드가 동작하지 않는다.
과거엔 AND연산자를 사용해서 에러를 피했다.
let user = {};
alert(user && user.address && user.address.street) // undefined
undefined 을 반환하더라도 코드가 작동되는 모습이다.
하지만 코드가 너무 길다는 단점이 있다.
옵셔널 체이닝의 등장으로 이를 해결했다.
?.
은 ?.
'앞'의 평가 대상이 'undefined'나 'null'이면 평가를 멈추고 undefined를 반환한다. (단락 평가)
그리하여 옵셔널 체이닝을 이용해보면
let user = {};
alert(user?.address?.street) // undefined
으로 변경해볼 수 있다.
성능
eval()에 전달되는 매개변수는 동적이다. 따라서 자바스크립트가 이 매개변수에 대해 알 수 있는 방법은 없다. 그렇기 때문에 자바스크립트가 eval을 실행하려면 런타임에 해당 매개변수를 해석/컴파일 해야한다. 매개변수가 복잡하다면 성능을 많이 잡아먹는다.
보안
eval()을 사용하면 다른 제3자가 악성 코드를 실행할 수 있는 위험이 생긴다. eval() 함수는 임의의 문자열을 받아 자바스크립트 코드로 실행하기 때문이다. 제3자의 코드가 eval()이 호출된 위치의 스코프를 볼 수 있다.
임의의 문자열을 알 수 있다면 eval()을 쓸 필요가 없다.
그리고 동적으로, 사전에 임의의 문자열을 알 수 없더라도 대개 eval() 없이 목표를 달성할 수 있다.
caller: 호출하는 쪽
callee: 호출 당하는 쪽
인터프리트: 코드를 읽어나가며 해석하여 실행하는 것.
컴파일: 어떤 언어로 작성된 코드를 다른 언어로 바꾸는 것.