식별자 : 변수, 배열, 함수 등에 지정된 이름(ex - var str = "hi")
변수 : 값이 저장된 메모리 공간의 주소를 가리키는 식별자
데이터 타입
- 데이터 타입은 프로그래밍 언어에서 사용할 수 있는 데이터(숫자, 문자열, 객체)의 종류를 말한다.
- 데이터 타입은 크게 기본형(원시타입)과 참조형(객체타입)이 있다.
- 자바스크립트는 동적 타입 언어이다. 값이 할당되는 과정에서 자동으로 변수의 타입이 결정 된다.
원시 타입
- boolean, null, undefined, number, string, symbol이 있다.
- 원시 타입은 변경 불가능한 값이다.
- pass-by-value(값에 의한 전달)
변경 불가능한 값(메모리 영역에서 값 변경이 불가능하다는 뜻)
var str = "hi";
str = "bye";
첫번째 줄에서 문자열 hi가 생성되고 str은 hi 메모리 주소를 가리킨다.
두번째 줄에서 문자열 bye가 생성되고 str은 bye 메모리 주소를 가리킨다.
즉
첫번째 줄에서 hi 문자열이 생성된 메모리의 값이 bye로 바뀌는것이 아니라
str이 hi 메모리 주소에서 bye 메모리 주소로 가리키는 주소가 바뀌는 것이다.
객체 타입
- 원시 타입을 제외한 나머지 값들(배열, 함수, 정규표현식)은 모두 객체(object)이다.
- 객체 타입은 변경 가능한 값이다.
- pass-by-reference(참조에 의한 전달)
call by value vs call by reference
평가전략
프로그래밍 언어에서 함수 호출의 인자(Argument)의 순서를 언제 결정하고
함수에 어떤 종류의 값을 보낼지 결정하는 것
ex) Call by- , Pass-by-
"Call"은 함수를 "호출"할 때 사용하는 동사
"Pass"는 인자를 "전달"한다는 의미를 나타내는 동사
call by value
1. 함수에 인자(Argument)로 값이 넘어온다.
2. 값이 넘어올 때 복사된 값이 넘어온다.
2. 넘어온 인자 값을 재할당, 연산 등을 하더라도 인자는 영향을 받지 않는다.
var num = 1
function value(a) {
a += 1;
return a
}
console.log(value(num)) // 2
console.log(num) // 1
- 원시 타입의 값을 Argument로 넘겨주게되면 call by value의 형태로 작동한다.
함수에 인자로 값을 넘겨줄 때 복사된 값을 넘겨주고
이때 (인자:num, 인수:a)는 다른 메모리 공간을 차지하게 되어 변수 num에는 아무런 영향이 없다.
call by reference
1. 인자(Argument)로 참조(값에 대한 참조 주소, 메모리 주소를 담고있는 변수)를 넘겨준다.
2. 참조 주소를 넘기다 보니 해당 참조값을 복사하지는 않는다.
3. 참조값을 복사해서 넘기지 않고 참조 주소를 넘기기 때문에 인자(Argument)는 연산 및 재할당에 영향을 받는다.
var person = { name:"Kim" };
function reference(str) {
str.name = "Lee";
return str
}
console.log(person); // { name: 'Kim' }
reference(person);
console.log(person); // { name: 'Lee' }
- 참조값을 Argument로 넘겨주게되면 call by reference의 형태로 작동한다.
함수에 인자로 값을 넘겨줄 때 복사된 값이 아닌 참조 주소를 넘겨주고
이때 (인자:person, 인수:str)는 같은 메모리 공간을 가리키게 되어 변수 person에 값이 함수의 동작에 의해 변한다.
undefined vs null
공통점
- 둘다 '없음'을 나타내는 값
차이점
undefined : 개발자가 의도적으로 할당한 값이 아닌 자바스크립트 엔진에 의해 초기화된 값
null : 개발자가 의도적으로 변수에 값이 없다는 것을 명시한 값
동적 타이핑(Dynamic Typing)
- 자바스크립트는 동적 타입 언어이다.
- 변수의 타입을 지정하지 않고 값을 할당하는 과정에서 값의 타입이 자동으로 결정된다는 의미로 이를 동적 타이핑이라 한다.
var a;
console.log(typeof a); // undefined
a = 5;
console.log(typeof a); // number
a = 'str'
console.log(typeof a); // string
a = [1,2,3];
console.log(typeof a); // object
a = true;
console.log(typeof a); // boolean
var 키워드의 문제점
1. 함수 레벨 스코프
- 전역 변수로 남발될 수 있다.
- 반복문 내부 초기화식에서 사용된 변수를 반복문 외부 또는 전역에서 사용할 수 있다.
2. 중복 선언 가능
- 위에서 할당한 변수값을 실수로 밑에서 값을 변경할 수 있다.
3. 변수 호이스팅
- 변수를 선언하기 이전에 상단에서 사용할 수 있다.
'Javascript' 카테고리의 다른 글
[Javascript] 객체와 변경불가성(Immutability) (0) | 2021.06.22 |
---|---|
[Javascript] 객체 (0) | 2021.06.21 |
자잘한 용어 정리 (0) | 2021.06.09 |
[Javascript] var, let, const 차이점 (0) | 2021.02.15 |
클로저(개념정리X) (0) | 2020.06.30 |