자바스크립트 : 느스한 타입 체크 언어
기본 타입 : 숫자, 문자열, 불린값 ,null, undefined
2-1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript" src="hello_javascript.js"></script>
</body>
</html>
2-2
var i = 0;
for (i=0; i<=10; i++) {
document.write("Hello javascript!");
document.write("<br/>");
}
3-1
// 숫자 타입
var intNum = 10;
var floatNum = 0.1;
// 문자열 타입
var singleQuoteStr = 'single quote string';
var doubleQuoteStr = "double quote string";
var singleChar = 'a';
// 불린 타입
var boolVar = true;
// undefined 타입
var emptyVar;
// null 타입
var nullVar = null;
console.log(
typeof intNum,
typeof floatNum,
typeof singleQuoteStr,
typeof doubleQuoteStr,
typeof singleChar,
typeof boolVar,
typeof emptyVar,
typeof nullVar
);
number number string string string boolean undefined object
3-2
var num = 5 / 2;
console.log(num); // 2.5
console.log(Math.floor(num)); // 2
3-3
// str 문자열 생성
var str = 'test';
console.log(str[0], str[1], str[2], str[3]); // t e s t
// 문자열의 첫 글자를 대문자로?
str[0] = 'T';
console.log(str); // test
자바스크립트는 한 번 생성된 문자열은 읽기만 가능, 수정은 불가능
3-4
자바스크립트에서 기본적으로 할당 되지 않은 변수는 undefined 타입, undefined 타입의 변수는 변수 자체의 값 또한 undefined이다.
따라서 undefined는 타입이자 값을 나타낸다.
// null 타입 변수 생성
var nullVar = null;
console.log(typeof nullVar === null ); // false
console.log(nullVar === null ); // true
typeof를 하면 null이 아닌 object라서 false가 나온다.
3-5
숫자, 문자열, 불린값, null, undefined 같은 기본 타입 제외 모든 값은 객체
// object()를 이용해서 foo 빈 객체 생성
var foo = new Object();
// foo 객체 프로퍼티 생성
foo.name = 'foo';
foo.age = 30;
foo.gender = 'male';
console.log(typeof foo); // object
console.log(foo); // name: 'foo', age: 30, gender: 'male'
3-6
// 객체 리터럴 방식으로 foo 객체 생성
var foo = {
name : 'foo',
age : 30,
gender : 'male'
};
console.log(typeof foo);
console.log(foo);
객체 리터럴 방식으로 작성한 경우
3-7
객체의 프로퍼티에 접근하는 방법 대괄호 [ ], 마침표 .
// 객체 리터럴 방식으로 foo 객체 생성
var foo = {
name : 'foo',
major : 'computer science'
};
// 객체 프로퍼티 읽기
console.log(foo.name); // foo
console.log(foo['name']); // foo
// 객체 프로퍼티 갱신
foo.major = 'electronics engineering';
console.log(foo.major); //electronics engineering
console.log(foo['major']); //electronics engineering
// 객체 프로퍼티 동적 생성
foo.age = 30;
console.log(foo.age); // 30
// 대괄호 표기법만 사용해야 하는 경우
foo['full-name'] = 'foo bar';
console.log(foo['full-name']); // foo bar
console.log(foo.full-name); // NaN
프로퍼티가 표현식 혹은 예약어일 경우 대괄호 표기법만 사용 가능.
full-name 에서 -(하이픈) 연산자가 있으므로 표현식
3-8
for in 문을 사용하면 객체에 포함된 모든 프로퍼티에 루프를 수행할 수 있다.
예제는 foo 객체의 모든 프로퍼티 이름과 프로퍼티 값을 출력한 것
var foo = {
name : 'foo',
age : 30,
major : 'computer science'
};
// for in 문을 이용한 객체 프로퍼티 출력
var prop;
for (prop in foo) {
console.log(prop, foo[prop]);
}
name foo
age 30
major computer science
3-8(2)
delete 연산자를 이용해 프로퍼티를 삭제 가능하다. 단 객체 자체를 삭제하지는 못한다.
var foo = {
name : 'foo',
age : 30,
major : 'computer science'
};
console.log(foo.name); // foo
delete foo.name;
console.log(foo.name);
delete foo;
console.log(foo.age);
foo
undefined
30
3-9
var objA = {
val : 40
};
var objB = objA;
console.log(objA.val); // 40
console.log(objB.val); // 40
objB.val = 50;
console.log(objA.val); // 50
console.log(objB.val); // 50
objA 변수는 객체 자체를 저장하고 있는 것이 아닌 생성된 객체를 가리키는 참조값을 저장하고 있음
objA와 objB는 동일한 객체를 바라보고 있으므로 똑같이 변한다.
3-10
var a = 100;
var b = 100;
var objA = { value: 100};
var objB = { value: 100};
var objC = objB;
console.log(a == b); // true
console.log(objA == objB); //false
console.log(objB == objC); //true
objB와 C는 같은 객체를 참조하지만 A는 값만 같을 뿐 같은 객체를 바라보는게 아니다.
3-11
기본 타입과 참조 타입의 호출 방식 차이
기본 타입은 함수 내부에서 값을 변경해도 실제로 호출된 변수의 값이 변하진 않고, 객체와 같은 참조 타입은 실제 값이 변한다.
var a = 100;
var objA = { value: 100};
function changeArg(num, obj) {
num = 200;
obj.value = 200;
console.log(num); // 200
console.log(obj); // { value: 200 }
}
changeArg(a, objA);
console.log(a); // 100
console.log(objA); // { value: 200 }
3-12
var foo = {
name : 'foo',
age : 30
}
console.log(foo.toString());
console.dir(foo);
[object Object]
{ name: 'foo', age: 30 }
toString() 매서드가 없어 에러가 발생해야 하지만, foo 객체의 프로토타입에 toString() 매서드가 이미 정의되어 있어 정상적으로 겨로가가 출력된다.