= JavaScript =
{{tag>JavaScript}}
= 기초 =
== 관례 ==
* **생성자 함수** 이름은 **대**문자로 시작
* Variable, Instance, Function, Method 이름은 소문자로 시작
* 작명은 CamelCase 이용.
* 문자열은 작은 따옴표('')를 이용한다.
== 자료형 ==
* string
* number
* 정수, 소수 모두 포함.
* boolean
* function
* object
* 배열도 포함.
* undefined
=== string ===
* **__더하기 연산자를 제외한__ 사칙 연산자는 __숫자__가 우선된다!**
* '23' + 12 = '2312'
* '23' - 13 = 10
=== bool ===
* true : 1 (2 이상도 true로 인식), false : 0
* bool 끼리 비교가 가능
=== undefined ===
선언하지 않거나 초기화 하지 않은 변수
=== 배열 ===
* **대괄호**를 이용하거나 Array() Method 이용.
* 배열 요소의 type 상관 없이 전부 담을 수 있음.
var arr = [123, 'Hello', true, function () { }, {}, [111, 222]];
// var arr = Array(123, 'Hello', true, function () { }, {}, [111, 222]);
arr.push(arr.length); // 배열 길이 값을 배열 끝에 추가
== 입력 ==
=== 문자열 ===
var input = prompt(String message, String defaultValue);
=== bool ===
var input = confirm();
== 자료형 변환 ==
=== string to number ===
Number('number');
=== type to bool ===
Boolean();
아래의 경우를 제외하고 모두 true
Boolean(0);
Boolean(NaN);
Boolean('');
Boolean(null);
Boolean(undefined);
== 연산자 ==
=== 일치 ===
* == : value 비교
* === : type 비교
//모두 true
'' == false
'' == 0
0 == false
'111' == 111
== 제어문 ==
=== 짧은 조건문 ===
좌변이 참이면 우변을 실행하지 않음.
// 실행되지 않음.
10 % 2 == 0 || alert("ok?");
=== for in ===
**요소 접근이 아닌 index 접근!!!**
var arr = ['Hello', 273, 253.23, false];
/* 요소 접근이 아닌 index 접근이기 때문에 indexing 필요! */
for (var i in arr) {
alert(typeof (arr[i]));
}
= 함수 =
== 익명함수와 선언적함수 ==
익명함수는 아래와 같이 선언적함수와 의미가 같다. **단, 함수명이 같을 때 실행순서가 달라진다.**
var func = function () { }
function func () { }
* Case 1
f();
// 마지막 함수가 실행되어 2 출력
/*
function f() { alert('1') };
function f() { alert('2') };
*/
// 실행되지 않는다.
/*
var f = function () { alert('1') };
var f = function () { alert('2') };
*/
* Case 2
var f = function () { alert('1') };
function f() { alert('2') };
//첫 번째 함수가 실행되므로 '1' 출력.
f();
=== 가변 인자 ===
모든 함수는 내부에 **arguments**라는 배열 변수가 있고, parameter 유무에 상관없이 지원.
function sumAll () {
var sum = 0;
for (var i in arguments)
sum += arguments[i];
return sum;
}
var result = sumAll(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 55 출력
alert(result);
== 내부 함수 ==
모든 함수의 [[#가변 인자|arguments]]로 인해 method override 불가능. 때문에 같은 이름의 함수 호출시 충돌 발생 가능.\\ ☞ 함수 안에 함수를 사용.
== 콜백 함수 ==
함수형 프로그래밍. parameter로 함수 사용.
function fx(callback) {
for (var i = 0 ; i < 3 ; i++)
callback();
}
// Case 1
var c = function () { alert('!'); }
fx(c);
// Case 2
fx(function () {
alert("?");
});
== 함수를 반환하는 함수 ==
== Closure ==
자신의 Scope 밖에 있는 변수에 접근할 수 있는 함수
function fx(text) {
var output = "안녕하세요. " + text
return function () {
alert(output);
}
}
fx('Jake')(); //함수의 함수 호출
= 객체 =
* Method : 객체의 속성 중 함수 자료형인 속성(Property)
* 객체 내부에서 "**this**" keyword를 생략할 수 없다!
== Prototype ==
생성자 함수로 생성된 객체가 공통으로 가지는 공간. (static과 비슷한 개념.)
* 왜 사용하는가? 이점?
* Memory Lick 방지!
* 생성자 함수에 Property와 Method가 공존할 때, Property는 값이 다르지만 **Method의 Logic은 항상 같음**!
* 여러개의 객체 생성시 같은 Logic의 Method를 계속 생성하므로 **메모리 낭비**!
* 그러므로 생성자 함수 생성시에는 Property만 넣는다.
* 동적 Method를 추가할 수 있음.
function Person (name, age) {
this.name = name;
this.age = age;
/*
this.showInfo = function () {
var str = '';
for (var key in this) {
if (key == 'showInfo')
break;
str += key + '\t' + this[key] + '\n';
}
return str;
};
*/
}
Person.prototype.showInfo = function () {
var str = '';
for (var key in this) {
if (key == 'showInfo')
break;
str += key + '\t' + this[key] + '\n';
}
return str;
};
var person = new Person('Luke', 29);
alert(person.showInfo());
== Capsulation ==
function Person (name, age) {
this.name = name;
var age1 = age;
this.getAge = function () { return age1; }
this.setAge = function (age)
{
if (age < 0)
throw '나이가 음수일 수 없습니다!';
age1 = age;
}
}
Person.prototype.showInfo = function () {
return this.name + ' / ' + this.getAge();
};
var person = new Person('Luke', 29);
person.setAge(-1);
alert(person.showInfo());
== Inheritance ==
= AJAX =
== 생성 ==
* [[http://thomasfrank.se/downloadableJS/xml2json.js|XML2JSON]]
XMLHttpRequest