javascript / jquery Reference v1.0 </doc>
http://jeongah2651.dothome.co.kr/
http://jeongah2651.dothome.co.kr/
avaScript는 웹페이지를 동적으로, 프로그래밍적으로 제어하기 위해서 고안된 언어다.
자바스크립트는 원래 웹브라우저에서 HTML, CSS를 동적으로 제어하기 위해서 만들어진 언어다. 하지만 오늘날 자바스크립트가 웹브라우저를 벗어나서 매우 다양한 용도로 사용되고 있다. 이런 이유로 자바스크립트의 실행환경은 다양하다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
alert('Hello world');
</script>
</body>
</html>
크롬을 사용한다면 다음과 같은 방법으로 자바스크립트를 간단하게 실행해 볼 수 있다.
1. Ctrl+Shift+J (윈도우), 커멘트+Alt+J (OSX) 키를 누른다. 콘솔 탭이 선택된 상태로 개발자 도구가 실행된다.
2. alert('hello world')를 실행한다. 실행 결과 아래와 같이 경고창이 실행된다.
자바스크립트에서는 큰따옴표나 작은따옴표가 붙지 않은 숫자는 숫자로 인식한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
alert(1+1); //결과 : 2(더하기)
alert(1.2 + 1.3); //결과 : 2.5 (더하기)
alert(2 * 5); //결과 : 10 (곱하기)
alert(6 / 2) //결과 : 3 (나누기)
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
Math.pow(3,2); // 9, 3의 2승
Math.round(10.6); // 11, 10.6을 반올림
Math.ceil(10.2); // 11, 10.2를 올림
Math.floor(10.6); // 10, 10.6을 내림
Math.sqrt(9); // 3, 3의 제곱근
Math.random(); // 0부터 1.0 사이의 랜덤한 숫자
</script>
</body>
</html>
문자는 "(큰 따옴표) 혹은 '(작은 따옴표) 중의 하나로 감싸야 한다. 큰 따옴표로 시작하면 큰 따옴표로 끝나야하고, 작은 따옴표로 시작하면 작은 따옴표로 끝나야 한다. String이라고 한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
alert("coding everybody"); //문자
alert('coding everybody'); //문자
alert(typeof "1"); //문자, 숫자를 따옴표로 감싸면 문자가 된다.
alert(typeof 1); //숫자, 아래와 같이 따옴표 없는 숫자는 number가 출력된다
alert('egoing\'s javascript') //작은따옴표를 문자열 안에 포함시킬 수 있는 방법
alert("안녕하세요.\n생활코딩의 세계에 오신 것을 환영합니다");
// 여러줄의 표시 : \n는 줄바꿈을 의미하는 특수한 문자다.
alert("coding"+" everybody"); //결과 : coding everybody (문자와 문자를 더할 때)
alert("coding everybody".length) //결과 : 16 (문자의 길이를 구할 때는 문자 뒤에 .length를 붙인다.)
</script>
</body>
</html>
JavaScript에서 변수는 var로 시작한다. var은 변수를 선언하겠다는 것을 의미한다. var을 생략 할수도 있지만 이것은 유효범위라는 것에 영향을 미친다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
var a = 1;
alert(a+1); //2
var a = 2;
alert(a+1); //3
var first = "coding"; //변수의 값이 꼭 숫자만 올 수 있는 것은 아니라는 것을 보여주기 위해서 만든 예제다.
alert(first+" everybody");
var a = 'coding', b = 'everybody'; //변수 a에 coding ,변수 b에 everybody를 활당하는 방법
alert(a);
alert(b);
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
alert(100+10);
alert((100+10)/10);
alert(((100+10)/10)-10);
alert((((100+10)/10)-10)*10); // 100에 10을 더하고, 10을 나눈 후에 다시 10을 빼고 거기에 10을 곱해야 한다고 치자.
// 그리고 각 단계마다 그 결과를 출력
a = 100; //그런데 계산해야 할 값을 100이 아니라 1000으로 바꿔야 한다면 위의 코드를 모두 수정해야 할 것이다.
//변수를 적용해보자.
a = a + 10;
alert(a);
a = a / 10;
alert(a);
a = a - 10;
alert(a);
a = a * 10;
alert(a); //위의 코드에서 첫번째 줄의 100을 다른 숫자로 바꾸면 나머지 로직에 대입되는 변수의 값이 모두 바뀐다.
//수정해야 할 코드가 적다는 것은 그만큼 해야 할 일이 줄어든다는 의미고,
//그 과정에서 버그가 발생할 가능성을 낮출 수 있다. 변수의 효용은 뒤에서 배우게 될
//반복문, 조건문, 함수와 결합되면 더욱 더 중요해진다.
</script>
</body>
</html>
주석은 자바스크립트 코드 내에 있지만 자바스크립트로 해석되지 않는 일련의 기호를 의미합니다.
자바스크립트 코드는 줄바꿈을 행할 시 해당 코드의 명령이 끝났다고 간주하기 때문입니다.
하지만 한 줄 안에 2가지 이상의 명령을 할 경우에는 반드시 세미콜론을 붙여야합니다.
' ; '세미콜론은 어디서부터 어디까지가 하나의 명령어의 단위를 명확하게 알려주는 역활로 쓰입니다.
자바스크립트 코드 간의 띄어쓰기(여백)는 가독성 또는 코드의 구성 요소로서 역할을 합니다
값과 값이 있을때 이 두개의 값이 같은지 어느쪽의 값이 큰지를 나타내는 것
연산자란 값에 대해서 어떤 작업을 컴퓨터에게 지시하기 위한 기호
a=1 // 변수 = 값 : 대입연산자
프로그래밍에서 비교란 주어진 값들이 같은지, 다른지, 큰지, 작은지를 구분하는 것을 의미한다.
//동등 연산자
alert(1==2) //false
alert(1==1) //true
alert("one"=="two") //false
alert("one"=="one") //true
//일치 연산자
alert(1=='1'); //true
alert(1==='1'); //false
결론부터 말하면 == 연산자 대신 === 연산자를 쓰는 것을 강력하게 권한다. ===는 서로 같은 수를 표현하고 있더라도 데이터 형이 같은 경우에만 같다고 판단하기 때문이다. (==과 ===의 차이점)
alert(null == undefined); //true
alert(null === undefined); //false : 값이없는것을 의도적으로 부여 === 값이없다.(프로그래머가 의도하지 않은 상황)
alert(true == 1); //true
alert(true === 1); //false
alert(true == '1'); //true
alert(true === '1'); //false
alert(0 === -0); //true
alert(NaN === NaN); //false
/* null과 undefined는 값이 없다는 의미의 데이터 형이다.
null은 값이 없음을 명시적으로 표시한 것이고, undefined는 그냥 값이 없는 상태라고 생각하자.
NaN은 0/0과 같은 연산의 결과로 만들어지는 특수한 데이터 형인데 숫자가 아니라는 뜻이다.*/
alert(1!=2); //true
alert(1!=1); //false
alert("one"!="two"); //true
alert("one"!="one"); //false
alert(10>20); //false
alert(10>1); //true
alert(10>10); //false
alert(10>=20); //false
alert(10>=1); //true
alert(10>=10); //true
조건문이란 주어진 조건에 따라서 에플리케이션을 다르게 동작하도록 하는 것이다.
if : 조건문은 if로 시작한다. if 뒤의 괄호에 조건이 오고, 조건이 될 수 있는 값는 Boolean이다. Boolean의 값이 true라면 조건이 담겨진 괄호 다음의 중괄호 구문이 실행된다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
if(true){ // 실행결과는 'result : true'다. if 뒤에 true가 왔기 때문이다.
alert('result : true');
}
if(false){ //아무것도 출력하지 않을 것이다. if 뒤에 false가 왔기 때문이다.
alert('result : true');
}
if(true){ //결과는 12345를 출력할 것이다.
alert(1);
alert(2);
alert(3);
alert(4);
}
alert(5);
if(false){ //결과는 5만 출력될 것이다.
alert(1);
alert(2);
alert(3);
alert(4);
}
alert(5);
/* 왜 그럴까? if 문의 조건이 참이면 중괄호의 시작({}부터 중괄호의 끝(})까지의 구간이 실행되기 때문이다.
거짓이면 중괄호 구간이 실행되지 않기 때문에 alert(5); 구문만 실행된 것이다. */
</script>
</body>
</html>
else : 주어진 조건이 거짓일 때 실행할 구간을 정의하는 것이다.
else if : else if는 좀 더 다양한 케이스의 조건을 검사할 수 있는 기회를 제공한다. else if의 특징은 if나 else와는 다르게 여러개가 올 수 있다는 점이다. else if의 모든 조건이 false라면 else가 실행된다. else는 생략 가능하다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
if(true){ //결과는 1이다.
alert(1);
} else {
alert(2);
}
if(false){ //결과는 2다.
alert(1);
} else {
alert(2);
}
/* if문의 조건이 true라면 if의 중괄호 구간이 실행되고, false라면 else 이후의 중괄호 구간이 실행된다.
즉 else는 주어진 조건이 거짓일 때 실행할 구간을 정의하는 것이다. */
if(false){ //결과는 2다.
alert(1);
} else if(true){
alert(2);
} else if(true){ //이미 앞에서 실행되어서 건너뛰게된다.
alert(3);
} else {
alert(4);
}
if(false){ //결과는 3이다.
alert(1);
} else if(false){
alert(2);
} else if(true){
alert(3);
} else {
alert(4);
}
if(false){ //결과는 4이다.
alert(1);
alert(1);
} else if(false){
alert(2);
} else if(false){
alert(3);
} else {
alert(4);
}
/* else if의 모든 조건이 false라면 else가 실행된다. else는 생략 가능하다. */
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
//변수와 비교연산자 그리고 조건문을 결합
id = prompt('아이디를 입력해주세요.') //prompt() 구문은 사용자가 입력한 값을 가져와서
//id 변수의 값으로 대입한다.
if(id=='egoing'){
alert('아이디가 일치 합니다.') // 사용자가 입력한 값이 egoing이라면 '아이디가 일치 합니다'를
// 출력하고 그렇지 않다면
//'아이디가 일치하지 않습니다'를 출력한다.
} else {
alert('아이디가 일치하지 않습니다.')
}
//조건문의 중첩
id = prompt('아이디를 입력해주세요.'); /*문 안에 다시 if문이 등장했다.
즉 사용자가 입력한 값과 아이디의 값이 일치하는지를 확인한 후에 일치한다면
비밀번호가 일치하는지 확인한 것이다.
이렇게 조건문은 조건문 안에 중첩해서 사용될 수 있다.*/
if(id=='egoing'){
password = prompt('비밀번호를 입력해주세요.');
if(password==='111111'){
alert('인증 했습니다.');
} else {
alert('인증에 실패 했습니다.');
}
} else {
alert('인증에 실패 했습니다.');
}
</script>
</body>
</html>
조건문을 좀 더 간결하고 다양한 방법으로 구사할 수 있도록 도와준다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
//&&
/* 결과는 1이다. &&의 좌우항이 모두 true인 것은 첫번째 조건문 밖에 없기 때문이다.
이러한 논리 연산자를 and 연산자라고 한다.*/
if(true && true){
alert(1);
}
if(true && false){
alert(2);
}
if(false && true){
alert(3);
}
if(false && false){
alert(4);
}lert('인증에 실패 했습니다.');
}
/* 다음 예제는 논리 연산자를 이용해서 이전 예제를 개선한 것이다.
중첩된 if문을 하나로 줄였다. 덕분에 코드의 복잡성도 낮아졌다. &&는 아래와 같은 의미를 만든다.
"id의 값이 egoing이고 password의 값이 111111이면 참이다"
즉 && 연산자의 좌항과 우항이 모두 참일 때 전체가 참이 되는 것이다.*/
id = prompt('아이디를 입력해주세요.');
password = prompt('비밀번호를 입력해주세요.');
if(id=='egoing' && password=='111111'){
alert('인증 했습니다.');
} else {
alert('인증에 실패 했습니다.');
}
// ||
/* 결과는 1,2,3이 출력된다. 마지막 조건문의 '||'는 좌항과 우항이 모두 false이기 때문에 false가 된다. */
if(true || true){
alert(1);
}
if(true || false){
alert(2);
}
if(false || true){
alert(3);
}
if(false || false){
alert(4);
}
/*다음 예제는 id 값으로 egoing, k8805, sorialgi 중의 하나를 입력하면 '인증 했습니다'가 출력되고,
그 외의 값을 입력하면 '인증에 실패 했습니다.'를 출력하는 예제다.*/
id = prompt('아이디를 입력해주세요.');
if(id==='egoing' || id==='k8805' || id==='sorialgi'){
alert('인증 했습니다.');
} else {
alert('인증에 실패 했습니다.');
}
/*다음 예제는 id 값으로 egoing, k8805,
sorialgi 중의 하나를 사용하고 비밀번호는 111111을 입력하면 right 외의 경우에는 wrong를 출력하는 예다.*/
id = prompt('아이디를 입력해주세요.');
password = prompt('비밀번호를 입력해주세요.');
if((id==='egoing' || id==='k8805' || id==='sorialgi') && password==='111111'){
alert('인증 했습니다.');
} else {
alert('인증에 실패 했습니다.');
}
/* 위의 예제에서는 or와 and를 혼합해서 사용하는 방법을 보여준다. id 값을 테스트 하는 구간을 괄호()로 묶었다.
사용자가 id의 값으로 egoing 비밀번호를 111111을 입력했다면 연산의 순서는 아래와 같이 된다.
(id=="egoing" or id=="k8805" or id=="sorialgi") : true가 된다.
password=='111111' : true가 된다.
true(1항) and true(2항) : true가 된다.
id 비교를 할 때 괄호를 사용한 것은 사칙 연산을 할 때 괄호부터 계산하는 것과 같은 원리다. */
// !
/* true를 false로 false를 true로 만든다. not 연산자라고 부른다. 아래의 결과는 4다. */
if(!true && !true){
alert(1);
}
if(!false && !true){
alert(2);
}
if(!true && !false){
alert(3);
}
if(!false && !false){
alert(4);
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script>
//01
if(0){ //2를 출력한다.
alert(1)
}
if(1){ //자바스크립트에서 숫자1은 트루로 간주되기 때문이다.
alert(2)
}
//기타 false로 간주되는 데이터 형
if(!''){ // if문의 조건으로 !(부정) 연산자를 사용했기 때문에
//각 조건문의 첫번째 블록이 실행되는 것은 주어진 값이 false이기 때문이다.
alert('빈 문자열') //빈 문자열은 fulse로 간주되어 진다. : 실행되지 않는다.
}
if(!undefined){
alert('undefined'); //undefined는 자바스립트에서 fulse로 간주된다. : : 실행되지 않는다.
}
var a;
if(!a){
alert('값이 할당되지 않은 변수');
}
if(!null){
alert('null');
}
if(!NaN){
alert('NaN');
}
</script>
</body>
</html>
while문은 while문 뒤에 따라오는 괄호 안의 조건이 참(true)면 중괄호 안의 코드 구간을 반복적으로 실행한다. 조건이 false면 반복문이 실행되지 않는다. 여기서 true와 false는 종료조건이 되는데, 이 값을 변경하는 것을 통해서 반복문을 종료시킬 수 있다. 반복문에서 종료조건을 잘못 지정하면 무한반복이 되거나, 반복문이 실행되지 않는다.
아래의 반복문은 i의 값을 1씩 순차적으로 증가시킴으로서 반복의 지속 여부를 결정하고 있다. 주석으로 첨부한 설명을 주의깊게 살펴보자.
<!DOCTYPE html>
<html lang="ko">
<head>
<title>codingEverybody</title>
<script type="text/javascript">
// document.write("Coding everybody <br/>"); // 결과 : Coding everybody
// while(true){ // 결과: 무한루프가 발생하게 됩니다.
// document.write("Coding everybody <br/>"); //
// }
var i = 0; //결과 : Coding everybody 10번 실행된다.
while(i < 10){ // 반복이 실행될 때마다 coding everybody <br />이 출력된다.
//<br /> 줄바꿈을 의미하는 HTML 태그
document.write("Coding everybody "+i+"<br/>");
i = i +1; // i의 값이 1씩 증가한다.
}
</script>
</head>
<body>
</body>
</html>
for문은 조건식 안에서 (변수 선언 및 초기값 설정; 조건식; 증감식)으로 이루어져 있으며 초기값이 조건식에 참인 동안 명령문을 실행 합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>codingEverybody</title>
<script type="text/javascript">
// for(초기화; 반복조건; 반복이 될 때마다 실행되는 코드){
// 반복해서 실행될 코드
// }
// var i = 0; //결과 : Coding everybody 10번 실행된다.
// while(i < 10){
// document.write("Coding everybody "+i+"<br/>");
// i = i +1;
// }
//for문으로 변환 :while문에 비해 간단하게 출력된다.
for(var i= 0; i < 10; i++){ // i = i + 1 === i++
document.write("Coding Everybody" +i+"</br>") ;
}
/* 위의 예제에서 초기화는 var i = 0;이다. 즉 변수 i의 값을 0으로 설정한 것이다. */
/* 그 다음에는 '반복조건'인 i < 10이 실행된다. 현재 i의 값은 0이다.
//그렇기 때문에 이 조건은 참이다. 반복조건이 참이면 중괄호 안의 내용이 실행된다 */
/* i의 값이 0이기 때문에 'coding everybody0<br />'이라는 텍스트가 출력된다.*/
/* '반복해서 실행될 코드'의 실행이 끝나면 '반복이 될 때마다 실행되는 코드'가 실행된다. */
/* i++는 현재 i의 값에 1을 더하라는 의미다. */
/* 현재 i의 값은 0이다. 따라서 i++의 결과로 i는 1이 되었다. 그리고 '반복조건'이 실행된다. */
/* 이 과정에서 i의 값은 반복 할 때마다 1씩 증가한다.
//결국 i의 값이 10이 되는 순간 i < 10을 충족시키지 못하게 되고 반복문은 종료된다. */
/* i = i + 1 === i++(기존의 값을 사용하고 1을 추가로더한다.)
// == ++i (사용할때 i값을증가시키고 사용한다.): 거의 비슷하다. // i=0; aleart(i++); : 결과 0 */
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>codingEverybody</title>
<script type="text/javascript">
//coding everybody를 10번 반복해서 출력
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
document.write('coding everybody');
//이 정도의 작업은 복사&붙여넣기를 이용해서도 할만하다.
//예를들어서 'coding everybody'를 1천번 출력해야 한다면
//위의 예제와 아래 예제의 코드 분량에 큰 차이가 생길 것이다.
//이처럼 아래같은 간단한 코드의 반복문이 없다면, 1천번 1만번 반복해야하는
//소스에서는 적는데에 큰 어려움이 있었을 것입니다.
//coding everybody 뒤에 붙는 숫자를 2의 배수
var i = 0;
while(i < 10){
document.write('coding everybody '+(i*2)+'<br />');
i++;
}
</script>
</head>
<body>
</body>
</html>
반복작업을 중간에 중단시키고 싶다면 어떻게 해야할까? break를 사용하면 된다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>codingEverybody</title>
<script type="text/javascript">
for(var i = 0; i < 10; i++){
if(i === 5) {
break;
}
document.write('coding everybody'+i+'<br />');
}
// 결과 :
// coding everybody 0
// coding everybody 1
// coding everybody 2
// coding everybody 3
// coding everybody 4
/* 종료조건에 따르면 10행이 출력돼야 하는데 5행만 출력되었다. 2행의 if(i === 5) 에 의해서
i의 값이 5일 때 break 문이 실행되면서 반복문이 완전히 종료된 것이다.
반복문 안에서 break가 실행되면 반복문을 즉시 종료시키는 것이다 */
</script>
</head>
<body>
</body>
</html>
실행을 즉시 중단 하면서 반복은 지속되게 하려면 어떻게 해야 할까?
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>codingEverybody</title>
<script type="text/javascript">
//이전 예제의 break를 continue로 변경했을 뿐이지만 결과는 전혀 다르다.
for(var i = 0; i < 10; i++){
if(i === 5) {
continue;
}
document.write('coding everybody'+i+'<br />');
}
//결과 :
//coding everybody 0
//coding everybody 1
//coding everybody 2
//coding everybody 3
//coding everybody 4
//coding everybody 6
//coding everybody 7
//coding everybody 8
//coding everybody 9
//숫자 5가 보이지 않는다. 왜 그럴까? i의 값이 5가 되었을 때 실행이 중단 됐기 때문에
//continue 이후의 구문이 실행되지 않은 것이다.
//하지만 반복문은 중단되지 않았기 때문에 나머지 결과가 출력된 것이다.
</script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>codingEverybody</title>
<script type="text/javascript">
// 0부터 9까지 변수 i에 순차적으로 값을 할당
for(var i = 0; i < 10; i++){
// 0부터 9까지의 변수를 j의 값에 순차적으로 할당
for(var j = 0; j < 10; j++){
// i와 j의 값을 더한 후에 출력
// String은 숫자인 i와 j의 데이터 타입을 문자로 형태를 변환하는 명령이다.
// String()을 제거하고 실행해보면 의미가 좀 더 분명하게 드러날 것이다.
document.write(String(i)+String(j)+'<br />');
}
} //문자와 문자를 더해주면서 안에있는 숫자도 문자화가 됩니다.
//결과 :
//00
//01
//...
//99
</script>
</head>
<body>
</body>
</html>
]
"함수"는 하나의 로직을 재실행할 수 있도록 하는 것으로 코드의 재사용성을 높여줍니다.
function 함수명([인자...[,인자]]){
코드
return 반환값
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
/*
function 함수명([인자...[,인자]]){
코드
return 반환값
}
*/
// // 함수 정의
// function numbering(){
// document.write(1);
// }
// numbering(); //numbering에 "()"가 없을 경우 numbering을 변수로 판단함. 즉 "()"는 함수를 호출
// //document.write(1);과 같은 효과
function numbering(){
i = 0;
while(i < 10){
document.write(i);
i += 1; //1 씩 증가
}
}
numbering(); //결과값 : 0~9
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//0~9까지의 숫자 배열을 5번 반복할 때
// var i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
// var i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
// var i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
// var i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
// var i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
//함수 사용 시
function numbering(){
var i = 0;
while(i < 10){
document.write(i + "<br>");
i += 1;
}
}
// numbering();
// numbering();
// numbering();
// numbering();
// numbering();
//for 문을 사용하여 5번 호출하기
for(var i = 0; i < 5; i++){
numbering();
}
</script>
</body>
</html>
함수의 기본적인 역할은 입력된 값을 연산해서 출력하는 것으로 이를 통해 함수의 핵심은 입력과 출력이라는 것을 알 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function get_member1(){
return 'egoing';
}
function get_member2(){
return 'k8805';
}
//return을 반복해서 쓴 경우
function get_member3(){
return 'egoing';
return 'leezche';
return 'graphite';
} //해당 함수는 첫 번째 return 값인 'egoing'을 반환하고 종료됨.
//return '값' 이후의 값들은 동작하지 않음
alert(get_member1());
alert(get_member2());
alert(get_member3()); //결과값 : egoing
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// function get_argument(arg){ //소가로"()"안의 값은 입력 값,
// return arg; //return은 출력 값
// }
// alert(get_argument(1)); //해당 소가로의 값 "1"은 함수의 소가로의 값으로 대체됨
// //var arg = 1
// alert(get_argument(2)); //해당 소가로의 값 "2"은 함수의 소가로의 값으로 대체됨
// //var arg = 2
function get_argument(arg){
return arg*1000;
}
alert(get_argument(1)); //결과 값은 1000
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function get_arguments(arg1, arg2){
return arg1 + arg2 // 입력값은 여러개를 받을 수 있으나 return 값, 즉 출력값은 하나만 받을 수 있음.
}
alert(get_arguments(10, 20)); // arg1 : 10, arg2 : 20, 결과값: 30
alert(get_arguments(20, 30)); // 결과값: 50
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//변수(var..)에 함수(function)가 대입된 경우
var numbering = function (){
i = 0;
while(i < 10){
document.write(i);
i += 1;
}
}
//함수 : 위의 값과 동일함
// function numbering(){
// i = 0;
// while(i < 10){
// document.write(i);
// i += 1;
// }
// }
numbering();
//익명 함수 : 함수에 지정된 이름이 없는 경우, 1회성 호출을 할 경우
(function(){
i = 0;
while(i < 10){
document.write(i);
i += 1;
}
})();// (정의된 함수) ():함수 호출을 위한 소가로 - 정의된 함수와 함수의 호출을 한 문장에 사용 가능
</script>
</body>
</html>
배열(array)이란 연관된 데이터를 모아서 통으로 관리하기 위해서 사용하는 데이터 타입을 의미합니다.
대괄호([])는 배열을 만드는 기호로서 대괄화 안에 데이터를 콤마(,)로 구분해서 나열하는 것으로 배열을 생성할 수 있습니다.
var member = ['egoing', 'k8805', 'sorialgi']
대괄호 안에 담긴 각각의 데이터를 통칭 '원소(Element)"라고 부릅니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// var member = 'egoing';
// var member = 'k8805';
// var member = 'sorialgi';
var member = ['egoing', 'k8805', 'sorialgi'] // "대괄호([])"는 배열을 의미함, 하나의 변수 안에 3 개의 데이터(3개의 원소)가 존재
alert(member[0]);
alert(member[1]);
alert(member[2]); //[index] : 한국어로 색인, 영어로는 인덱스(index)
</script>
</body>
</html>
함수는 여러 개의 값을 입력할 수 있으나 반환할 수 있는 값는 오직 하나의 값입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// 함수로 하나의 값만을 반환할 경우
// function get_member1(){
// return 'egoing'; //함수는 하나의 return 값만을 가질 수 있음
// }
// document.write(get_member1());
// function get_member2(){
// return 'k8805';
// }
// document.write(get_member2());
// function get_member3(){
// return 'sorialgi'
// }
// document.write(get_member3());
//함수를 배열로 표기할 경우
function get_members(){
return ['egoing', 'k8805', 'sorialgi'];
}
var members = get_members();
document.write(members[0] + '<br>');
document.write(members[1] + '<br>');
document.write(members[2]);
</script>
</body>
</html>
배열 사용의 핵심은 반복문과 결합하였을 때 나타납니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function get_members(){
return ['egoing', 'k8805', 'sorialgi', 'leezche'];
}
members = get_members();
// document.write(member[0].toUpperCase()+"<br>")
// document.write(member[1].toUpperCase()+"<br>")
// document.write(member[2].toUpperCase()+"<br>")
//배열과 반복문의 결합
// members.length는 배열에 담긴 값의 숫자를 알려준다.
for(i = 0; i < members.length; i++){ //.length : 배열 내 원소의 값, 즉 개수를 나타내줌
// members[i].toUpperCase()는 members[i]에 담긴 문자를 대문자로 변환해준다.
document.write(members[i].toUpperCase() + '<br>'); //toUpperCase 류의 함수를 내장 함수라 칭함. <--> function의 값을 사용자가 직접 작성함 : 사용자 정의 함수
}
</script>
</body>
</html>
배열의 주된 목적은 복수의 데이터를 효율적으로 관리, 전달하는 것에 있으며, 배열이란 결과적으로 이를 목적으로 고안된 데이터 타입을 의미합니다.
배열의 크기를 알아내기 위해서는 "length"를 사용해야 합니다.
var arr = [1, 2, 3, 4, 5];
alert(arr.length);
결과값 : 5
"push"와 "concat"는 배열의 끝을 추가하는 명령입니다.
함수 "push"는 인자로 전달된 값을 배열에 추가하는 명령입니다.
var li = [a, b, c, d, e];
li.push('f'); // 배열(li)에 인자 "f" 값을 추가합니다.
결과값 : li[a, b, c, d, e, f]
함수 "concat"은 복수의 원소를 배열에 추가하는 명령입니다.
var li = [a, b, c, d, e];
li = li.concat(['f', 'g']); // 배열(li)에 인자 "f"와 "g" 값을 추가합니다.
결과값 : li[a, b, c, d, e, f, g]
"unshift"는 배열의 시작점에 원소를 추가하는 명령입니다.
var li = [a, b, c, d, e];
li.unshift('z'); / 배열의 시작점에 원소 'z'를 추가합니다.
결과값 : li[z, a, b, c, d, e] / 'z'로 시작됩니다.
함수 "splice"의 사용방법은 아래의 예시와 같습니다.
array.splice(index, howmany, element1, ... , elementN);
1) index - 배열의 순번(0, 1, 2, 3 ...) / 배열에 추가할 특정 배열의 위치를 가르킴
2) howmany - index에서부터 제거될 원소들의 수
var a =['a', 'b', 'c']; //변수 a의 결과값 : a ["a", "b", "c"]
a.splice(1, 1, 'x', 'y'); // 원소 b(index : 1)를 삭제하고(howmany : 1) 그 자리에 'x', 'y'를 순서대로 넘어줍니다.
결과값 : a['a', 'x', 'y', 'c']
예시 설명 - "splice"는 첫번째 인자에 해당하는 원소부터 두번째 인자에 해당하는 원소의 숫자만큼의 값을 배열로부터 제거한 후 리턴, 그리고 세번째 인자부터 전달된 인자들을 첫번째 인자의 원소 뒤에 추가합니다.
"shift"는 배열의 첫번째 원소를 제거하는 방법입니다.
var li = ['a', 'b', 'c', 'd', 'e'];
li.shift(); // 배열(li)의 첫번째 원소 "a"를 제거합니다.
결과값 : li['b', 'c', 'd', 'e'];
함수"pop"은 배열 끝점의 원소를 제거합니다.
var li = ['a', 'b', 'c', 'd', 'e'];
li.pop(); // 배열(li)의 끝점의 원소 "e"를 제거합니다.
결과값 : li['a', 'b', 'c', 'd'];
"sort"는 배열의 원소를 정렬해주며, "reverse"는 정렬을 하되 역순으로 정렬합니다.
var li = ['c', 'e', 'a', 'b', 'd'];
// 배열의 정렬
li.sort();
결과값 : li['a', 'b', 'c', 'd', 'e']
// 배열의 정렬(역순)
li.reverse();
결과값 : li['e', 'd', 'c', 'b', 'a']
array.sort(sortfune)
1) sortfune : 원소들 간에 우선인자를 감별해내는 조건
객체(object)는 연관된 데이터를 받아내는 그릇의 역할을 한다는 점에서 배열과 유사하나, 객체의 경우 배열과 달리 식별자로 문자를 이용한다는 점에서 차이점을 보입니다.
var grades = {'egoing' : 10, 'k8805' : 6, 'sorialgi; : 80};
1) 객체는 배열과 달리 대가로([])가 아닌 중가로({})를 사용함
2) 객체는 'egoing' 등과 같이 문자열을 인덱스(index)로 사용함
var grades = {};
grades['egoing'] = 10;
//egoing은 key, 10은 value
grades['k8805'] = 6;
//1) grades['k8805']는 grades.k8805와 동일한 값을 낼 수 있다.
//2) ['k8805']는 숫자열이 아닌 문자열로 취급받기 때문에 ['k88'+'05']의 값도 동일합니다.
//3)grades['k88'+'05']와 grades.'k88'+'05'는 동일하지 않다.
grades['sorialgi'] = 80;
배열은 저장된 데이터들이 순서를 가지고 있으나 ,객체의 경우 순서가 없는 대신 'key'와 'value'로 데이터를 구분할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<!-- <script type="text/javascript">
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
for(key in grades) {
// document.write(key); //결과값 : egoing, k8805, sorialgi
// document.write(grades[key] + "<br>"); //결과값 : 10, 6, 80, 객체에 저장된 값을 가져옴
document.write("<li>key : " + key + " value : " + grades[key] + "</li>");
}
//결과값
// key : egoing value : 10
// key : k8805 value : 6
// key : sorialgi value : 80
</script> -->
<!-- 자바스크립트를 이용해 목록 만들기 -->
<ul>
<script type="text/javascript">
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
for(key in grades) {
// document.write(key); //결과값 : egoing, k8805, sorialgi
// document.write(grades[key] + "<br>"); //결과값 : 10, 6, 80, 객체에 저장된 값을 가져옴
document.write("<li>key : " + key + " value : " + grades[key] + "</li>");
}
//결과값
// key : egoing value : 10
// key : k8805 value : 6
// key : sorialgi value : 80
</script>
</ul>
</body>
</html>
var arr = ['a', 'b', 'c'];
for(var name in arr){
document.write(name); // 결과값 : 0 1 2
document.write(arr[name]); // 결과값 : a b c
}
객체에는 객체를 담는 것 뿐만 아니라 함수도 담을 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var grades = {
'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80},
'show' : function(){
for(var name in this.list){
document.write(name+':'+this.list[name]+"<br />");
}
}
};
grades.show();
</script>
</body>
</html>
모듈화를 이루는 방법 중 하나는 코드를 여러개의 파일로 분리하는 것입니다.
javascript는 모듈이라는 기능을 제공하지 않는 대신에 호스트 환경(브라우저, node.js, google apps script...)을 제공합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="assets/js/greeting.js"></script> <!-- src : 속성 - greeting.js란 파일을 읽어서 script 태그 사이에 집어 넣는 것과 같은 효과를 줍니다. -->
</head>
<body>
<script>
//모듈이 없는 경우 : 본 함수를 이용한 반복 사용 - 유지보수 어려움, 유지보수비용 낭비
// function welcome(){
// return 'Hello world'
// }
// alert(welcome());
//head에 속성값 "greeting.js를 삽입한 경우 : 모듈이 있는 경우
alert(welcome()); // 함수는 js 값에 넣어진 상태
</script>
</body>
</html>
모듈을 로드하는 방법은 호스트 환경에 따라서 달라집니다.
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
var circle = require('./node.circle.js');
console.log( 'The area of a circle of radius 4 is '
+ circle.area(4));
F:\BitNami\wampstack-5.4.22-0\apache2\htdocs\javascript\module>node node.demo.js The area of a circle of radius 4 is 50.26548245743669
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var grades = {
'list': {'egoing': 10, 'k8805': 6, 'sorialgi': 80},
'show' : function(){
for(var name in this.list){
document.write(name+':'+this.list[name]+"<br />");
}
}
};
grades.show();
</script>
</body>
</html>
라이브러리란 자주 사용되는 로직을 재사용하기 편리하도록 잘 정리한 일련의 코드들의 집합을 의미합니다.
<!DOCTYPE html>
<html>
<head>
<script src="assets/js/jquery-1.12.4.min.js"></script>
</head>
<body>
<ul id="list">
<li>empty</li>
<li>empty</li>
<li>empty</li>
<li>empty</li>
</ul>
<input id="execute_btn" type="button" value="execute" />
<!-- jQuery를 사용하지 않을 경우 -->
<!-- <script type="text/javascript">
function addEvent(target, eventType,eventHandler, useCapture) {
if (target.addEventListener) { // W3C DOM
target.addEventListener(eventType,eventHandler,useCapture?useCapture:false);
} else if (target.attachEvent) { // IE DOM
var r = target.attachEvent("on"+eventType, eventHandler);
}
}
function clickHandler(event) {
var nav = document.getElementById('list');
for(var i = 0; i < nav.childNodes.length; i++) {
var child = nav.childNodes[i];
if(child.nodeType==3)
continue;
child.innerText = 'Coding everybody';
}
}
addEvent(document.getElementById('execute_btn'), 'click', clickHandler);
</script> -->
<!--jQuery을 사용할 경우-->
<script type="text/javascript">
$('#execute_btn').click(function(){
$('#list li').text('coding everybody');
})
</script>
</body>
</html>
Application Programming Interface의 약자로 프로그램이 동작하는 환경을 제어하기 위해서 환경에서 제공되는 조작 장치이며. 이는 프로그래밍 언어를 통해서 조작할 수 있습니다.
자바스크립트 관련 자료는 크게 레퍼런스와 튜토리얼 2가지로 나눌 수 있습니다.
자바스크립트의 API는 크게 자바스크립트 자체의 API와 자바스크립트가 동작하는 호스트 환경의 API로 구분됩니다.
정규표현식(regular expression)은 문자열에서 특정한 문자를 찾아내는 도구이며, 하나의 언어로 판단할 수 있습니다.
정규표현식은 컴파일(compile)과 실행(execution), 두 가지 단계로 이뤄집니다.
var pattern = /a/
var pattern = new RegExp('a');
정규표현식을 통해 행하는 작업은 크게 추출, Test, 치환, 이 3가지로 나눠볼 수 있습니다.
var pattern = /a/;
//정규표현식 리터럴
console.log(pattern.exec('abcdef'));
// 결과값 ["a"]
//실행결과는 문자열 a를 값으로 하는 배열을 리턴함.
console.log(pattern.exec('bcdefg'));
// null
//인자 'bcdef'에는 a가 없기 때문에 null 값을 리턴함.
var pattern = /a./;
pattern.exec('abcde');
//결과값 : ["ab"]
//변수 값에는 a 외에도 마침표(.)과 찍혀있는데 이 또한 "하나의 문자"라는 특수한 의미를 지님.
"test"는 인자 안에 패턴에 해당되는 문자열의 유무에 따라 true/false 값을 리턴하는 함수입니다.
var pattern = /a./;
console.log(pattern.test('abcdef'));
// 결과값 : true
console.log(pattern.test('bcdefg'));
// 결과값 : false
var pattern = /a./;
console.log('abcdef'.match(pattern));
//결과값 : ["a"]
console.log('bcdefg'.match(pattern));
//결과값 : null
var pattern = /a./;
var str = "abcdef"
console.log(str.replace(pattern, 'A')); // 문자열 str : abcdef에서 a를 찾아(pattern) 대문자 A로 바꿈
//결과값 : Abcdef
정규표현식 패턴을 만들 때 옵션을 설정할 수 있으며 옵션에 따라서 검출되는 데이터는 달라집니다.
"i"를 붙이면 대소문자를 구분하지 않습니다.
var xi = /a/;
console.log("Abcde".match(xi));
//결과값 : null, 소문자 "a"를 지정하였기 때문에 Adobe의 대문자 "A"는 결과에 해당되지 않는다.
var oi = /a/i;
console.log("Abcde".match(oi));
//결과값 : ["A"];, 소문자 "a"를 지정했음에도 대문자 "A"를 결과로 내놓는 이유는 "i"의 존재 때문이다.
"g"를 붙이면 검색된 모든 결과를 리턴하는 것으로 "g"란 "global"의 약자입니다.
var xg = /a/;
console.log("abcdea".match(xg));
//결과값 : ["a"], a 값이 두 개있지만, 하나의 값만이 결과값으로 표기됨
var og = /a/g;
console.log("abcdea".match(og));
//결과값 : ["a","a"], "g"가 붙는 것으로 인해 모든 결과값이 리턴되기 때문에 a 값 2개가 모두 결과값으로 표기됨
var ig = /a/ig;
//대소문자 구분하지 않고(i) 모든 결과값을 리턴하겠다(g)는 것을 나타냄
console.log("AabcdAa".match(ig));
//결과값 : ["A", "a", "A", "a"], AabcdAa 내의 모든 a값(ig)를 대소문자 가리지 않고 결과값으로 표기함.
그룹을 지정하고 지정된 그룹을 다시금 가져와 사용하는 개념을 "캡처"라고 합니다.
var pattern = /(\w+)\s(\w+)/;
//"\w+" 란 a~z까지의 대문자가 하나 이상의 값을 지니고 있음을 의미함.
// 역슬래시("\") + 소문자 w는 a ~ z까지의 알파벳 대문자를 의미함.
// "w+"의 "+"는 수량자로 하나 이상의 값을 의미하는 것으로 해당 예시의 경우 "#"의 경우 해당 값에 속하지 않지만, "A"를 비롯해 "AA"까지 해당 값에 속하게 됨
// 역슬래시("\") + 소문자 s는 white-space(공백)를 의미함, coding과 everybody 사이에 공백을 줌으로 하나의 단어가 아닌 두개의 단어로 인식되도록 함.
var str = "coding everybody";
//"coding everybody"의 경우
var result = str.replace(pattern, "$2, $1");
console.log(result);
// 결과값 : everybody, coding
var urlPattern = /\b(?:https?):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*/gim;
var content = '생활코딩 : http://opentutorials.org/course/1 입니다. 네이버 : http://naver.com 입니다. ';
var result = content.replace(urlPattern, function(url){
return ''+url+'';
});
console.log(result);
//결과값 : 생활코딩 : http://opentutorials.org/course/1 입니다.
네이버 : http://naver.com 입니다.
유효범위(Scope)는 변수의 수명을 의미합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// var vscope = 'global';
// function fscope(){
// alert(vscope);
// }
// fscope(); //결과값 : global
//지역변수를 넣어줬을 때
// var vscope = 'global';
// function fscope(){
// var vscope = 'local'; //함수 fscope의 지역변수
// alert(vscope);
// }
// fscope(); //결과값 : local
// var 언급이 있을 때
// var vscope = 'global'; //전역변수
// function fscope(){
// var vscope = 'local'; //지역변수
// }
// fscope();
// alert(vscope); //결과값 : global
// var 언급이 없을 때
// var vscope = 'global';
// function fscope(){
// vscope = 'local'; //전역변수
// }
// fscope();
// alert(vscope); //결과값 : local
var vscope = 'global';
function fscope(){
var vscope = 'local';
vscope = 'local'; //지역변수 "vscope"에 엮임
}
fscope();
alert(vscope); //결과값 : local
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// 전역변수의 사용
// function a (){
// i = 0; //var이 기재되지 않았기 때문에 i의 값이 for 문까지 유효하게 작용됨.
// }
// for(var i = 0; i < 5; i++){
// a();
// document.write(i); // 결과값 : 무한 반복
// }
// 지역변수의 사용
function a (){
var i = 0; // 변수 i의 값이 함수 a의 지역변수로 적용됨
}
for(var i = 0; i < 5; i++){
a();
document.write(i); // 결과값 : 01234
}
</script>
</body>
</html>
불가피하게 전역변수를 사용해야 하는 경우는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용합니다.
전역변수를 사용하고 싶지 않을 시에는 익명함수를 호출함으로서 해당 코드의 목적을 달성할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//전역변수의 사용
// var MYAPP = {} //전역변수
// MYAPP.calculator = {
// 'left' : null,
// 'right' : null
// }
// MYAPP.coordinate = {
// 'left' : null,
// 'right' : null
// }
// MYAPP.calculator.left = 10;
// MYAPP.calculator.right = 20;
// function sum(){
// return MYAPP.calculator.left + MYAPP.calculator.right;
// }
// document.write(sum()); // 결과값 : 30
(function(){ //별도의 함수명이 지정되어 있지 않은 경우에는 익명 함수로 불림
var MYAPP = {} //임의의 익명 함수 안에서 선언된 지역변수로 변환됨
MYAPP.calculator = {
'left' : null,
'right' : null
}
MYAPP.coordinate = {
'left' : null,
'right' : null
}
MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum());
}());
</script>
</body>
</html>
여타의 언어들이 블록에 대한 유효범위를 제공하는 것에 반하여 자바스크립트는 함수에 대한 유효범위만을 제공합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//자바스크립트에서 허용되지 않는 코드 : 함수와 함께 사용됨
// for(int i = 0; i < 10; i++){
// String name = "egoing"; //var name = "egoing"
// 변수 "name"은 함수 string과 함께 사용되는 것으로 for문에 속한 지역변수에 위치하게 됨 >>> for 문 밖에서 name 변수는 인식되지 않음
// }
// System.out.println(name); //console.log(name)
//자바스크립트에서 가능한 코드
for(var i = 0; i < 1; i++){
var name = 'coding everybody';
//var로 변수를 선언한 경우, for문 안 쪽 말고도 바깥쪽에서도 해당 변수 "name"을 인식할 수 있음
}
alert(name);
//결과값 : coding everybody
</script>
</body>
</html>
자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var i = 5; // 전역변수
function a(){
var i = 10; // 함수 a의 지역변수
b(); // 함수 b의 값을 불러옴
}
function b(){
document.write(i); //함수 b에는 별개의 지역변수가 존재하지 않기 때문에 전역변수(5)에 영향을 받음
} //함수 b의 값은 함수 a에 호출된 시점에서의 값이 아닌 정의될 때의 값을 가리킴
a();
//결과값: 5
</script>
</body>
</html>
JavaScript에서는 함수도 객체입니다.
function a(){}
a = { b:function(){}};
함수는 값이기 때문에 다른 함수의 인자로 전달될 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function cal(func, num){
return func(num)
}
function increase(num){
return num+1
}
function decrease(num){
return num-1
}
alert(cal(increase, 1));
alert(cal(decrease, 1));
</script>
</body>
</html>
함수는 함수의 리턴 값 혹은 배열 값으로도 사용할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//리턴 값으로 사용할 경우
// function cal(mode){
// var funcs = {
// 'plus' : function(left, right){return left + right},
// 'minus' : function(left, right){return left - right}
// }
// return funcs[mode];
// }
// alert(cal('plus')(2,1));
// alert(cal('minus')(2,1));
//배열의 값으로 사용할 경우
var process = [
function(input){ return input + 10;},
function(input){ return input * input;},
function(input){ return input / 2;}
];
var input = 1;
for(var i = 0; i < process.length; i++){
input = process[i](input);
}
alert(input);
</script>
</body>
</html>
값으로 사용될 수 있는 특성을 이용하면 함수의 인자로 함수로 전달할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function sortNumber(a,b){
// a와 b의 순서를 바꾸면 정렬순서가 반대가 됨.
return b-a;
}
var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
alert(numbers.sort(sortNumber));
// 결과값 :array, [20,10,9,8,7,6,5,4,3,2,1]
</script>
</body>
</html>
시간이 오래걸리는 작업이 있을 때 이 작업이 완료된 후에 처리해야 할 일을 콜백으로 지정하면 해당 작업이 끝났을 때 미리 등록한 작업을 실행하도록 할 수 있습니다.
{"title":"JavaScript","author":"egoing"}
<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
<script type="text/javascript">
$.get('./datasource.json.js', function(result){
console.log(result);
}, 'json');
</script>
</body>
</html>
클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가리킵니다.
자바스크립트는 자바스크립트는 함수 안에서 또 다른 함수를 선언할 수 있습니다. 이를 "내부함수"라고 합니다.
내부함수는 외부함수의 지역변수에 접근 할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// function outter(){ //외부함수
// function inner(){ //내부함수
// var title = 'coding everybody';
// alert(title);
// }
// inner();
// }
// outter();
// 내부함수가 외부함수의 지역변수에 접근할 경우
function outter(){ //외부 함수
var title = 'coding everybody'; //외부 함수 "outter"의 지역변수
function inner(){ //내부 함수
alert(title);
}
inner();
}
outter(); //결과값 : coding everybody
</script>
</body>
</html>
클로저(closure)는 내부함수와 밀접한 관계를 가지고 있는 주제를 의미합니다.
클로저는 내부함수가 외부함수의 지역변수에 접근 할 수 있고, 외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 지니고 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function outter(){
var title = 'coding everybody';
return function(){
alert(title);
}
}
inner = outter();
inner();
</script>
</body>
</html>
Private 속성이란 객체의 외부에서는 접근 할 수 없는 외부에 감춰진 속성이나 메소드를 의미합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function factory_movie(title){
return {
get_title : function (){
return title;
},
set_title : function(_title){
title = _title
}
}
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
alert(ghost.get_title());
alert(matrix.get_title());
ghost.set_title('공각기동대');
alert(ghost.get_title());
alert(matrix.get_title());
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//예시 1
// var arr = []
// for(var i = 0; i < 5; i++){
// arr[i] = function(){
// return i;
// }
// }
// for(var index in arr) {
// console.log(arr[index]()); //결과값 : 5 5 5 5 5
// }
//예시 1의 변경
var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(id) {
return function(){
return id;
}
}(i);
}
for(var index in arr) {
console.log(arr[index]()); //결과값 : 0 1 2 3 4
}
</script>
</body>
</html>
함수에는 arguments라는 변수에 담긴 숨겨진 유사 배열이 있으며, 이 배열에는 함수를 호출할 때 입력한 인자가 담겨있습니다
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function sum(){
var i, _sum = 0;
for(i = 0; i < arguments.length; i++){
document.write(i+' : '+arguments[i]+'<br />');
_sum += arguments[i];
}
return _sum;
}
document.write('result : ' + sum(1,2,3,4));
</script>
</body>
</html>
본 내용은 위의 예시 코드에 대한 부가 설명입니다.
매개변수와 관련된 두가지 수로는 함수.length와 arguments.length가 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function zero(){
console.log(
'zero.length', zero.length,
'arguments', arguments.length
);
}
function one(arg1){
console.log(
'one.length', one.length,
'arguments', arguments.length
;
}
function two(arg1, arg2){
console.log(
'two.length', two.length,
'arguments', arguments.length
);
}
zero(); // zero.length 0 arguments 0
one('val1', 'val2'); // one.length 1 arguments 2
two('val1'); // two.length 2 arguments 1
</script>
</body>
</html>
//함수를 호출하는 가장 기본적인 방법
function func(){
}
func();
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function sum(arg1, arg2){
return arg1+arg2;
}
alert(sum.apply(null, [1,2])) //결과값 : 3
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
o1 = {val1:1, val2:2, val3:3}
o2 = {v1:10, v2:50, v3:100, v4:25}
function sum(){
var _sum = 0;
for(name in this){
_sum += this[name];
}
return _sum;
}
alert(sum.apply(o1)) // 6
//sum.apply(o1)의 풀이/해석
// o1.sum = sum;
// alert(o1.sum());
// delete o1.sum();
alert(sum.apply(o2)) // 185
</script>
</body>
</html>
객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것을 의미합니다.
객체지향 프로그래밍 교육은 크게 문법과 설계, 두 가지로 구분됩니다.
프로그래밍은 정신적인 활동으로 때때로 무한하고, 유연하다는 장점을 지니기는 하나 오해나 모순 같은 문제점도 유발합니다.
객체 지향은 부품화의 정점으로 핵심은 연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑하는 것입니다.
정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)란 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것을 뜻합니다.
인터페이스는 부품들 간의 약속입니다.
객체란 서로 연관된 변수와 함수를 그룹핑한 그릇입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//객체의 생성
// var person = {}
// person.name = 'egoing';
// person.introduce = function(){
// return 'My name is '+this.name;
// }
// document.write(person.introduce());
//코드 변경
var person = {
'name' : 'egoing',
'introduce' : function(){
return 'My name is '+this.name;
}
}
document.write(person.introduce());
//이 경우 다른사람의 이름을 담을 객체가 필요하다면 객체의 정의를 반복해야 하기 때문에 "생성자"를 필요로 합니다.
</script>
</body>
</html>
생성자(constructor)는 객체를 만드는 역할을 하는 함수입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//기본 함수
// function Person(){}
// var p = new Person();
// p.name = 'egoing';
// p.introduce = function(){
// return 'My name is '+this.name;
// }
// document.write(p.introduce());
// //여러 사람을 대상으로 한 객체
// function Person(){}
// var p1 = new Person();
// p1.name = 'egoing';
// p1.introduce = function(){
// return 'My name is '+this.name;
// }
// document.write(p1.introduce()+"<br />");
// var p2 = new Person();
// p2.name = 'leezche';
// p2.introduce = function(){
// return 'My name is '+this.name;
// }
// document.write(p2.introduce());
//초기화
function Person(name){
this.name = name;
this.introduce = function(){
return 'My name is '+this.name;
}
}
var p1 = new Person('egoing');
document.write(p1.introduce()+"<br />");
var p2 = new Person('leezche');
document.write(p2.introduce());
</script>
</body>
</html>
전역객체(Global object)는 특수한 객체로 모든 객체는 전역객체의 프로퍼티입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// 객체가 명시될 경우
// function func(){
// alert('Hello?');
// }
// func();
// window.func();
//객체가 명시되지 않았을 경우
var o = {'func':function(){
alert('Hello?');
}}
o.func();
window.o.func();
</script>
</body>
</html>
ECMAScript에서는 전역객체의 API를 정의하였으며 그 외의 API는 호스트 환경에서 필요에 따라서 추가로 정의하고 있습니다.
this는 함수 내에서 함수 호출 맥락(context)를 의미합니다.
this는 전역객체인 window와 같습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function func(){
if(window === this){
document.write("window === this");
}
}
func(); //결과값 : window === this
</script>
</body>
</html>
객체의 소속인 메소드의 this는 그 객체를 가리킵니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var o = {
func : function(){
if(o === this){
document.write("o === this");
}
}
}
o.func(); //결과 값: o === this
</script>
</body>
</html>
생성자는 빈 객체를 만들며, this는 이렇게 만들어진 객체를 가리킵니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//this 활용 X
// function Func(){
// document.write(o);
// }
// var o = new Func(); //결과값: undefined
//this 활용
var funcThis = null;
function Func(){
funcThis = this;
}
var o1 = Func();
if(funcThis === window){
document.write('window <br />');
}
var o2 = new Func();
if(funcThis === o2){
document.write('o2 <br />');
} //결과값: window o2
</script>
</body>
</html>
함수의 메소드인 apply, call을 이용하면 this의 값을 제어할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var o = {}
var p = {}
function func(){
switch(this){
case o:
document.write('o<br />');
break;
case p:
document.write('p<br />');
break;
case window:
document.write('window<br />');
break;
}
}
func();
func.apply(o);
func.apply(p); //결과값 : window o p
</script>
</body>
</html>
상속(inheritance)이란 객체의 로직을 그대로 물려 받는 또 다른 객체를 만들 수 있는 기능입니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
// 상속 X
// function Person(name){
// this.name = name;
// }
// Person.prototype.name=null;
// Person.prototype.introduce = function(){
// return 'My name is '+this.name;
// }
// var p1 = new Person('egoing');
// document.write(p1.introduce()+"<br />");
// // 상속 O : programmer란 생성자 추가 + 위의 것을 그대로 상속
// function Person(name){
// this.name = name;
// }
// Person.prototype.name=null;
// Person.prototype.introduce = function(){
// return 'My name is '+this.name;
// }
// function Programmer(name){
// this.name = name;
// }
// Programmer.prototype = new Person(); //prototype과 Person의 객체를 연결함.
// var p1 = new Programmer('egoing');
// document.write(p1.introduce()+"<br />");
//상속 O : 부모의 기능을 계승/발전
function Person(name){
this.name = name;
}
Person.prototype.name=null;
Person.prototype.introduce = function(){
return 'My name is '+this.name;
}
function Programmer(name){
this.name = name;
}
Programmer.prototype = new Person();
Programmer.prototype.coding = function(){
return "hello world";
} // Programmer는 Person의 기능을 가지고 있으면서 Person이 가지고 있지 않은 기능인 메소드 coding을 추가하고 있습니다.
var p1 = new Programmer('egoing');
document.write(p1.introduce()+"<br />");
document.write(p1.coding()+"<br />");
//결과값 :
// My name is egoing
// hello world
</script>
</body>
</html>
prototype이란 상속의 구체적인 수단을 주요하게 사용됩니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
function Ultra(){}
Ultra.prototype.ultraProp = true;
function Super(){}
Super.prototype = new Ultra();
function Sub(){}
Sub.prototype = new Super();
var o = new Sub();
console.log(o.ultraProp); //결과값 : true
</script>
</body>
</html>
본 코드에서는 아래와 같은 일이 진행됩니다.
1) 객체 o에서 ultraProp를 찾는다.
2) 없다면 Sub.prototype.ultraProp를 찾는다.
3) 없다면 Super.prototype.ultraProp를 찾는다.
4) 없다면 Ultra.prototype.ultraProp를 찾는다.
표준 내장 객체는 자바스크립트가 기본적으로 가지고 있는 객체들을 의미합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//배열에서 특정한 값을 랜덤하게 추출(배열 확장X)
// var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');
// function getRandomValueFromArray(haystack){
// var index = Math.floor(haystack.length*Math.random());
// return haystack[index];
// }
// console.log(getRandomValueFromArray(arr));
//배열 확장 / 배열 객체 포함O
Array.prototype.rand = function(){
var index = Math.floor(this.length*Math.random());
return this[index];
}
var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');
console.log(arr.rand());
</script>
</body>
</html>
Object 객체는 객체의 가장 기본적인 형태의 객체로 아무것도 상속받지 않는 순수한 객체입니다.
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//object 확장
Object.prototype.contain = function(neddle) {
for(var name in this){
if(this[name] === neddle){
return true;
}
}
return false;
}
var o = {'name':'egoing', 'city':'seoul'}
console.log(o.contain('egoing'));
var a = ['egoing','leezche','grapittie'];
console.log(a.contain('leezche'));
//object 확장을 할 경우 모든 객체의 값이 변경
// for(var name in o){
// console.log(name);
// //결과값 : name contain : 기존 객체 이외에도 다른 객체 "contain"을 포함하고 있음
// }
//해결방법
for(var name in o){
if(o.hasOwnProperty(name)) //hasOwnProperty : 프로퍼티의 해당 객체의 소속인지를 체크
console.log(name);
}
</script>
</body>
</html>
hasOwnProperty : 인자로 전달된 속성의 이름이 객체의 속성인지 여부를 판단합니다.
(prototype으로 상속 받은 객체라면 false가 됩니다.)
데이터 타입이란 데이터의 형태를 의미하며, 이를 두 가지로 구분하면 객체와 객체가 아닌 것으로 나눌 수 있습니다.
객체가 아닌 데이터 타입을 원시 데이터 타입(primitive type)이라고 합니다.
레퍼객체로는 String, Number, Boolean이 있으며 null과 undefined는 레퍼 객체가 존재하지 않습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var a = 1;
var b = a;
b = 2;
console.log(a); //결과값 : 1
</script>
</body>
</html>
참조는 심볼릭 링크(symbolic link) 혹은 바로가기(윈도우)를 만드는 것과 비슷합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var a = {'id':1};
var b = a;
b.id = 2;
System.out.println(a.id);
console.log(a.id); // 2
</script>
</body>
</html>
함수 func의 파라미터 b로 전달된 값은 객체 a입니다. (b = a) b를 새로운 객체로 대체하는 것은 (b = {'id':2}) b가 가르키는 객체를 변경하는 것이기 때문에 객체 a에 영향을 주지 않습니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
//원시 데이터 타입을 인자로 넘겼을 때
// var a = 1;
// function func(b){
// b = 2;
// }
// func(a);
// console.log(a); // 결과 값 : 1
// 참조 데이터 타입을 인자로 넘겼을 때\
var a = {'id':1};
function func(b){
b = {'id':2};
func(a);
console.log(a.id); // 결과 값 : 1
</script>
</body>
</html>
본 코드는 위와 달리 파라미터 b는 객체 a의 레퍼런스입니다. 이 값의 속성을 바꾸면 그 속성이 소속된 객체를 대상으로 수정작업을 한 것이 되기 때문에 b의 변경은 a에도 영향을 미치게 됩니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<script type="text/javascript">
var a = {'id':1};
function func(b){
b.id = 2;
}
func(a);
console.log(a.id); // 결과값 : 2
</script>
</body>
</html>
패턴은 자주 사용하는 로직들의 구현방법과 그것에 대한 이름을 의미합니다.
재귀함수는 함수 자신을 호출하는 프로그래밍 기법입니다.
<!DOCTYPE html>
<html>
<body id="start">
<ul>
<li><a href="./532">html</a></li>
<li><a href="./533">css</a></li>
<li><a href="./534">JavaScript</a>
<ul>
<li><a href="./535">JavaScript Core</a></li>
<li><a href="./536">DOM</a></li>
<li><a href="./537">BOM</a></li>
</ul>
</li>
</ul>
<script>
function traverse(target, callback){
if(target.nodeType === 1){
//if(target.nodeName === 'A')
callback(target);
var c = target.childNodes;
for(var i=0; i<c.length; i++){
traverse(c[i], callback);
}
}
}
traverse(document.getElementById('start'), function(elem){
console.log(elem);
});
</script>
</body>
</html>