웹/JavaScript

데이터 타입

 - Number

자바스크립트는 하나의 숫자 타입만 존재한다. (int, long long 이런거 없음)

모든 수를 실수로 처리한다. 

 

 - string

 문자열은 0개 이상의 16bit 유니코드 문자(UTF-16) 들의 집합으로 대부분의 전세계의 문자를 표현할 수 있다. 문자열은  작은 따옴표 또는 큰 따옴표 안에 텍스트를 넣어 생성한다. 가장 일반적인 표기법은 작은 따옴표를 사용하는 것이다.

자바스크립트의 문자열은 원시 타입이며 변경 불가능하다. 이것은 한 번 문자열이 생성되면, 그 문자열을 변경할 수 없다는 것을 의미한다.

var str = 'Hello';
str = 'world';

이때 문자열 'Hello'와 'world'는 모두 메모리에 존재하고 있다. 변수 str은 문자열 'Hello'를 가리키고 있다가 문자열 'world'를 가리키도록 변경되었을 뿐이다.

var str = 'string';
// 문자열은 유사배열이다.
for (var i = 0; i < str.length; i++) {
  console.log(str[i]);
}

// 문자열을 변경할 수 없다.
str[0] = 'S';
console.log(str); // string

 이미 생성된 문자열의 일부 문자를 변경해도 반영되지 않는다.(이때 에러가 발생하지 않는다.) 한번 생성된 문자열은 read only로서 변경할 수 없다. 이것을 변경 불가능(immutable)이라 한다.

 새로운 문자열을 재할당 하는것은 가능하다.

var str = 'string';
console.log(str); // string

str = 'String';
console.log(str); // String

str += ' test';
console.log(str); // String test

str = str.substring(0, 3);
console.log(str); // Str

str = str.toUpperCase();
console.log(str); // STR

 

 - boolean

 비어있는 문자열과 null, undefined, 숫자 0 은 false 로 간주된다.

 

 - undefiend

 undefined 타입의 값은 undefined 가 유일하다. 선언 이후 값을 할당하지 않은 변수는 undefined 값을 가진다. 즉, 선언은 되었지만 값을 할당하지 않은 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 undefined가 반환된다.

 

 이는 변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이루어질 때까지 빈 상태(garbage value)로 내버려두지 않고 자바스크립트 엔진이 undefiend로 초기화하기 때문이다.

 

- null

 null 타입의 값은 null 이 유일하다. 자바스크립트는 대소문자를 구별하므로 null 은 Null, NULL 과 다르다.

이는 변수가 기억하는 메모리 어드레스의 참조 정보를 제거하는 것을 의미하며 자바스크립트 엔진은 누구도 참조하지 않는 메모리 영역에 대해 가비지 콜렉션을 수행할 것이다.

 

https://ko.javascript.info/garbage-collection

 

가비지 컬렉션

 

ko.javascript.info

var foo = 'Lee';
foo = null;  // 참조 정보가 제거됨

 

함수가 호출되었으나 유요한 값을 반환할 수 없는 경우, 명시적으로 null을 반환하기도 한다.

var element = document.querySelector('.myElem');
// HTML 문서에 myElem 클래스를 갖는 요소가 없다면 null을 반환한다.
console.log(element); // null

 

타입을 나타내는 문자열을 반환하는 typeof 연산자로 null 값을 연산해 보면 null이 아닌 object가 나온다. 이는 자바스크립트 설계상의 오류이다. (이스터에그 느낌..)

var foo = null;
console.log(typeof foo); // object

 

따라서 null 타입을 확인할때  typeof 연산자를 사용하면 안되고 일치 연산자(===)를 사용하여야 한다.

var foo = null;
console.log(typeof foo === null); // false
console.log(foo === null);        // true

 

 - symbol

 심볼은 ES6에서 새롭게 추가된 7번째 타입으로 변경 불가능한 원시 타입의 값이다. 심볼은 주로 이름의 충돌이 위험이 없는 유일한 객체의 프로퍼티 키를 만들기 위해 사용된다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol

 

Symbol - JavaScript | MDN

Symbol() 함수는 심볼(symbol) 형식의 값을 반환하는데, 이 심볼은 내장 객체(built-in objects)의 여러 멤버를 가리키는 정적 프로퍼티와 전역 심볼 레지스트리(global symbol registry)를 가리키는 정적 메서드

developer.mozilla.org

 

 - 변수

 변수명은 식별자로 불리기도 하며 명명 규칙이 존재한다.

 - 반드시 영문자(특수문자 제외), underscore( _ ), 또는 달러 기호($)로 시작하여야 한다. 이어지는 문자에는 숫자(0~9)도 사용할 수 있다.

 - 자바스크립트는 대/소문자를 구별하므로 사용할 수 있는 문자는  A~Z와 a~z 이다.

var name;     // 선언
name = 'Lee'; // 할당

var age = 30; // 선언과 할당

var person = 'Lee',
    address = 'Seoul',
    price = 200;

var price = 10;
var tax   = 1;
var total = price + tax;

 선언하지 않은 변수에 접근하면 ReferenceError 가 발생한다.

 

변수를 동일한 이름으로 중복선언할 수 있다. 중복 선언하면 에러없이 이전 변수의 값을 덮어쓴다.

 

동적 타이핑

자바스크립트는 동적타이핑 언어이다. 변수의 타입 지정 없이 값이 할당되는 과정에서 값의 타입에 의해 자동으로 타입이 결정될 것이라는 뜻이다. 따라서 같은 변수에 여러 타입의 값을 할당할 수 있다.

var foo;

console.log(typeof foo);  // undefined

foo = null;
console.log(typeof foo);  // object

foo = {};
console.log(typeof foo);  // object

foo = 3;
console.log(typeof foo);  // number

foo = 3.14;
console.log(typeof foo);  // number

foo = 'Hi';
console.log(typeof foo);  // string

foo = true;
console.log(typeof foo);  // boolean

 

변수 호이스팅

console.log(foo); // ① undefined
var foo = 123;
console.log(foo); // ② 123
{
  var foo = 456;
}
console.log(foo); // ③ 456

 1번 에서는 ReferenceError가 발생할 것 같지만 undefined가 출력된다.

이것은 자바스크립트의 호이스팅(Hoisting) 때문이다.

 호이스팅이란 var 선언문이나 function 선언문 등 모든 선언문이 해당 Scope의 선두로 옮겨진 것처럼 동작하는 특성을 말한다. 즉, 자바스크립트는 모든 선언문(var, let ,const, function, class)이 선언되기 이전에 참조 가능하다. (와......!)

 

https://poiemaweb.com/js-data-type-variable

 

Data type & Variable | PoiemaWeb

변수는 값의 위치(주소)를 기억하는 저장소이다. 값의 위치란 값이 위치하고 있는 메모리 상의 주소(address)를 의미한다. 즉, 변수란 값이 위치하고 있는 메모리 주소(Memory address)에 접근하기 위해

poiemaweb.com

 

' > JavaScript' 카테고리의 다른 글

타입 변환  (0) 2021.07.28
제어문  (0) 2021.07.28
기본 문법  (0) 2021.07.27
브라우저 동작 원리  (0) 2021.07.27
3. JS시작을 위한 준비  (0) 2021.07.22