본문 바로가기

개발 언어

(30)
자바스크립트에서 호이스팅이란 a = 2; var a; console.log(a); 다음의 결과값은 undefined가 아니라 놀랍게도 2입니다. console.log(a); var a = 2; 이 코드의 결과값은 undefined입니다. 이런 결과가 나오는 이유는 호이스팅 때문입니다. 호이스팅은 선언문을 끌어올리는 동작입니다. var a;는 선언문이고 a = 2는 대입문입니다. 따라서, 맨 위의 코드는 var a;가 호이스팅에 의해서 가장 위로 끌어올려지므로 2가 출력됩니다. 하지만, var a = 2;는 다릅니다. var a = 2;를 자바스크립트 (이하 JS) 엔진은 var a;와 a = 2;로 나누어서 처리합니다. 여기서, 선언문인 var a;만 맨 위로 끌어올려지므로 var a; console.log(a); a = 2; JS..
자바스크립트에서 함수, 블록 스코프란 직전 게시물에서 언급한 것처럼 스코프는 컨테이너 또는 바구니 역할을 하는 일종의 '버블'이며 변수나 함수가 그 안에서 선언됩니다. 이 컨테이너는 경계가 분명하게 중첩되고, 그 경계는 개발자가 코드를 작성할 때 결정됩니다. 함수 기반 스코프 스코프 안에 있는 모든 변수와 함수는 그 스코프에 속합니다. function foo(a) { let b = 2; function bar() { ... } let c = 3; } foo()의 스코프 버블은 변수 a, b, c와 함수 bar를 포함합니다. 즉, 스코프 안에 있는 모든 변수와 함수는 그 스코프 버블에 속합니다. 함수 스코프는 모든 변수가 함수에 속하고 함수 전체에 걸쳐 사용되며 재사용됩니다. 일반 스코프에 숨기 스코프를 이용해 변수와 함수를 숨기는 방식을 사..
자바스크립트에서 스코프란 스코프란 특정 장소에 변수를 저장하고 나중에 그 변수를 찾는 데는 잘 정의된 규칙이 필요한데, 바로 이런 규칙을 일컫습니다. 컴파일러 이론 자바스크립트 (이하 JS)는 일반적으로 동적 언어 또는 인터프리터 언어로 분류하나 사실은 컴파일러 언어입니다. JS 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 것보다 세련된 방식을 처리해줍니다. 전통적인 컴파일러 언어의 처리 과정에서는 소스코드가 실행되기 전에 보통 3단계를 거치는데, 이 과정을 컴파일레이션이라고 합니다. 여기서 컴파일의 자세한 과정은 배보다 배꼽이 더 클 수 있으므로 생략하도록 하겠습니다. JS 엔진이 기존 컴파일러와 다른 점은 JS 컴파일레이션을 미리 수행하지 않아서 최적화할 시간이 많지 않다는 것입니다. 보통..
자바스크립트에서 특징적인 문법 정리 문과 표현식 문 (statement)과 표현식(expression)을 같은 의미라고 넘겨버리는 개발자가 많습니다. 하지만, 자바스크립트 (이하 JS)에서 두 용어는 다릅니다. 문은 문장, 표현식은 어구, 연산자는 구두점/접속사로 비유할 수 있습니다. let a = 3 * 6; let b = a; b; 여기서 3 * 6은 표현식입니다. 2, 3번째 줄 역시 표현식입니다. 또한, 이 세 줄은 각각의 표현식이 포함된 문입니다. 1, 2번째 줄은 변수를 선언하는 문이므로 선언문이라고 합니다. 만약, let과 같이 변수를 선언하는 부분이 빠졌다면 할당 표현식이라고 합니다. 3번째 줄 같은 경우는 표현식 문이라고 합니다. 모든 문은 완료 값을 가집니다. 이를 확인할 확실한 방법은 브라우저 개발자 콘솔 창에 타이핑해..
자바스크립트에서 타입 강제변환이란 값 변환 어떤 값을 다른 타입의 값으로 바꾸는 과정이 명시적이면 타입 캐스팅이라 부르고 암시적이면 강제변환이라고 합니다. 자바스크립트 (이하 JS)에서는 대부분 모든 유형의 타입변환을 강제변환으로 일컫는 경향이 있으므로 '암시적 강제변환'과 '명시적 강제변환' 두 가지로 구별하려고 합니다. 명시적 강제변환은 코드만 봐도 의도적으로 타입변환을 일으킨다는 것이 명백합니다. 암시적 강제변환은 다른 작업 도중 불분명한 side effect로부터 발생하는 타입변환입니다. let a = 24; let b = a + ''; // 암시적 강제변환 let c = String(a); // 명시적 강제변환 추상 연산 ToString 문자열이 아닌 값을 문자열로 변환 작업은 ToString 추상 연산 로직이 담당합니다. 숫자..
자바스크립트에서 네이티브란 네이티브 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol() 네이티브는 내장 함수입니다. 생성자처럼 사용할 수 있지만 생성되는 결과물은 예상과는 조금 다를 수 있습니다. const a = "abc"; const b = new String("abc"); typeof a; // string typeof b; // object b instanceof String; // true new String("abc") 생성자의 결과는 원시 값 "abc"를 감싼 객체 래퍼(Wrapper)입니다. 어떠한 객체가 어떤 네이티브에 속하는지는 Object.prototype.toString()이라는 메서드에 값을 넣어 호출..
자바스크립트에서 값이란 배열 자바스크립트 (이하 JS) 배열은 타입이 엄격한 다른 언어와 달리 어떤 타입의 값도 담을 수 있는 상자입니다. let arr = [1, '2', [3]]; // no error 여기서 주의할 점은 슬롯을 건너뛸 수 있다는 점입니다. let arr = []; arr[0] = 0; arr[2] = 2; arr[1]; // undefined arr.length; // 3 1번째 인덱스에 값을 넣지 않고 2번째 인덱스에 값을 넣는 경우에는 a[1]은 undefined면서 arr 배열의 길이는 3이 됩니다. 여기서 arr의 인덱스가 건너뛰더라도 값을 삽입한 마지막 인덱스에 따라 배열의 길이가 설정된다는 점을 알 수 있습니다. 배열 자체는 하나의 객체이기 때문에 배열 인덱스는 숫자이지만 key - value ..
자바스크립트에서 타입이란 타입이란 자바스크립트 (이하 JS) 에서 타입이란 JS 엔진, 개발자 모두에게 어떤 값을 다른 값과 분별할 수 있는, 고유한 내부 특성의 집합으로 정의할 수 있습니다. 예를 들면, 24와 "24" 라는 값은 다르게 취급됩니다. 24는 수학 연산 같이 계산을 하려는 의도가 있지만 "24"는 특정 페이지에 출력할 문자열과 같은 의도로 만든 값입니다. 이렇듯 다른 값과 분류되는 특성을 지닌 것이 타입의 필수조건이 됩니다. 내장 타입 자바스크립트에는 7가지의 내장 타입이 존재합니다. null undefined boolean number string object symbol object를 제외한 나머지 6가지 타입을 primitive (원시) 타입이라고 합니다. 값 타입은 typeof 연산자로 확인할 수 있습니다..