<script>
// 자바스크립트 코드
</script>
개념 | 설명 |
---|---|
표현식 | 값을 만들어내는 간단한 코드 |
문장 | 하나 이상의 표현식이 모여 구성되는 코드를 읽어 들이는 단위가 되는 것 |
키워드 | 예약어,프로그래밍 언어가 처음 만들어질 때 정해진 특별한 의미가 있는 단어 |
식별자 | 이름을 붙일 때 사용하는 단어 |
주석 | 프로그램 코드를 설명하며, 프로그램의 진행에 전혀 영향을 주지 않는 문장 |
문자열 | 문자를 표현할 때 사용하는 자료형 |
숫자 | 숫자를 표현할 때 사용하는 자료형 |
불리언 | 참과 거짓을 표현할 때 사용하는 자료형 |
변수 | 값을 저장할 때 사용하는 식별자 |
자료형 종류 | 설명 |
---|---|
숫자형 | 정수, 실수 데이터 |
문자형 | 문자 데이터,큰따옴표("")나 작은따옴표('')로 감싼다. |
boolean형 | true/false 데이터 |
함수형 | function(){실행구문;} 형태의 데이터 1. 함수 전체를 데이터의 한 종류로 취급 ( 변수에 저장 가능) 2. 이름이 없을 수 있음(익명함수) |
객체형 | 프로퍼티와 메소드로 구성된 단위 프로그램을 객체화했을 때 메모리 공간의 위치 주소값 ex) var a = new Student(); |
undefined | 알 수 없는 데이터. 프로그램에서 사용할 수 없는 데이터를 말한다. (null이 아님) |
var 변수명 = 데이터;
호이스팅
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것
var a= "hello"
function newA(){
var b ="hi";
}
console.log(b); //Uncaught ReferenceError: b is not defined
var a = "hello"
var condition = 2;
if(condition > 1){
var a = "bye";
}
console.log(a); //"bye"
condition 조건이 참이므로 a는 bye로 재선언된다. a변수가 이미 정의되었다는 것을 몰랐다면 문제가 될 수 있다.a변수를 다른 부분에서 사용한다면 원치 않은 결과를 볼 수 있으며 버그 유발가능.
전역변수의 문제점
-암묵적 결합 (유효 범위 커짐, 가독성 저하)
-긴 생명주기
let condition = 2;
if(condition > 1){
let a = "bye";
console.log(a); //"bye"
}
console.log(a);//Uncaught ReferenceError : a is not defined
let을 사용하면 중복된 이름의 변수를 사용하더라도 범위가 다른 경우에는 명확하게 구분하여 사용할 수 있다.
1.if
2.else if
3.switch
switch (변수명){
case 값A :
값이 A일 때 실행할 명령문;
break;
case 값B :
값이 B일 때 실행할 명령문;
break;
case 값C :
값이 C일 때 실행할 명령문;
break;
default :
위의 값 A ~ C 모두 아닐때 실행할 명령문;
}
1.while
2.do / while
3.for
for(var i = 0; i < 10; i++){
console.log(i);
} // i가 0부터 1씩 증가하며 콘솔창에 i(수)를 출력
4.for / in
for(var i = 0; i < array.length; i++){}
for(i in array){}
// 동일한 반복문
1.with
with(document){
write("반복 사용할 객체가<br>");
write("필요없음<br>");
}
함수 리터럴로 하나의 함수를 만들고, 여기서 생성된 함수를 변수에 할당하여 함수를 생성하는 것을 함수 표현식이라 한다.
1.(정적)함수
var f = function sum(x,y){ //이름 있는 함수 형태 =>기명 함수
return x+y;
}
console.log(f(3,4)); //7
console.log(sum(3,4))//Uncaught ReferenceError : sum is not defined
함수 표현식에서 사용된 함수 이름이 외부 코드에서 접근 불가능하기 때문에 오류 발생.
2.익명함수
var f = function(x,y){ //이름 없는 함수 형태 => 익명 함수
return x+y;
}
console.log(f(3,4)); //7
3.내장함수
4.내부함수
5.콜백함수
function add(a,b,callback){
callback(a+b);
};
function printResult(value){
console.log(value);
};
add(3,4,printResult);
6.가변인자 함수
Argument 객체
-함수가 호출될 때 넘긴 인자들이 배열 형태로 저장되는 객체를 의미한다.
-매개변수 개수가 정해지지 않은 함수를 구현하거나, 전달된 인자의 개수에 따라 서로 다른 처리를 해줘야하는 함수를 구현할 수 있다.
-ECMASCript 5의 엄격한 모드에서는 매개변수나 지역변수 이름으로 사용할 수 없다.
function sumAll(){
var result = 0;
for(i in arguments){
result+= arguments[i];
}
return result;
}
sumAll(10,10,10) // return 30
함수가 정의되는 순간의 환경을 기억하는 함수, 즉 함수 외부에 선언된 변수를 참조하는 함수
클로저는 변수 자신들이 바인드 되는 환경에 한정되지 않는 변수를 가지는 표현식
-> 자신이 생성된 함수의 context에 직접 접근(참조)할 수 있는 함수
클로저는 함수,상황,유효범위(scope)라고도 한다.
자바스크립트 언어의 단점 중 하나인 '전역변수'로 인한 문제를 해결 할 수 있음
전역변수를 사용하지 않고, 지역변수를 함수 외부에서 사용
function func(){
var x = 1;
return {
func1 : function(){ console.log(++x); },
func2 : function(){ console.log(-x); }
};
}
var exam = func();
exam.func1();
exam.func2();
결과
var obj1 = new Object(); // new 연산자를 이용한 객체 생성
var obj2 = {}; // 객체 리터럴로 객체를 생성
var user = {
name: "yoojin",
gender: "female"
};
자바스크립트 엔진이 구동되는 시점에서 바로 제공되며 자바스크립트 코드 어디에서든 사용이 가능하다.
브라우저 내장 객체 또한 자바스크립트 구동되는 시점에서 바로 사용이 가능한 객체들이며 내장 객체이다. 하지만 브라우저마다 브라우저 내장 객체를 사용함에 있어 구성을 달리하는 경우가 있기 때문에 자바스크립트 내장 객체와 분류함. 자바스크립트 내장객체가 구성된 후에 구성이 된다.
말 그대로 사용자가 생성한 객체들로 생성자 함수 또는 객체 리터럴을 통해 사용자가 객체를 정의하고 확장시킨 객체들이기 때문에 내장 객체들이 구성된 이후에 구성되어 진다.
1.prototype
function Foo(){
}
Prototype Object는 기본속성으로 constructor와 proto를 가지고 있다. (따라서 정확히 말하자면 Foo.prototype 객체가 프로토타입을 의미하는것은 아니다. constructor도 가지고 있으니! )
constructor는 내가 선언한 생성자 함수(Foo)를 가리킨다. new 키워드와 함께 함수를 호출할 경우 constructor함수를 실행하고 부수효과로 객체가 생성된다.
생성자 함수가 아니라 함수를 생성하는 호출이라고 생각하는것이 맞다
prototype은 생성자 함수에 정의한 모든 객체가 공유할 원형이다.
proto는 [[Prototype]]링크이다. 생성자 함수에 정의해두었던 prototype을 참조한다.
Prototype 사용 이유
메모리 낭비를 막기 위함.
->prototype은 모든 객체가 공유하고 있어서 한 번만 만들어지지만, this에 넣은 것은 객체 하나를 만들 때마다 메소드도 하나씩 만들어지기 때문에 불필요한 메모리 낭비가 발생한다.
2.class
3.extensible
25 == '25' // return true
true == 1 // return true
undefined == null // return true
25 === '25' // return false
true === 1 // return false
undefined === null // return false
"a" + "b" = "ab" // 문자끼리 더하면 문자.
"a" + 1 = "a1" // 문자+숫자는 문자화된다.
3.삼항 조건 연산자
condition > 3 ? "a" : "b";
if문과 삼항 연산자의 차이
1. 할당
- 삼항 연산자는 조건에 대한 결과값을 바로 변수에 할당할 수 있다.
- if문의 경우에는 변수에 바로 할당할 수 없고 조건식 안에서 할당 처리를 해줘야 한다.
2.유효 범위(scope)
- if문은 중괄호로 감싸진 블록문으로 이루어져 있고, 삼항 연산자는 블록문을 만들 수 없다. 그렇기 때문에 자연스럽게 전역변수는 참조할 수 있지만, 지역변수를 생성할 수는 없다.
- if문이 삼항 연산자보다 조금 더 다양한 제어를 할 수 있다.
** 1.할당 **
//삼항 연산자 사용
greeting = "hello" + (username ? username : "there")
//if문 사용
greeting = "hello";
if(username)
greeting += username;
else
greeting += "there";
** 2.유효 범위 **
let firstName = yoojin";
let needFullName = true;
//삼항 연산자 사용
needFullName? (
let lastName = 'jeong'; //Uncaught SyntaxError; Unexpected identifier
console.log(lastName + fristName);
): (
console.log(firstName)
)
//if문 사용
if(needFullName){
let lastName = "jeong";
console.log(lastName + firstName); // jeongyoojin
}else{
console.log(firstName);
}
특수기호 (메타문자)
플래그 | 의미 | 설명 |
---|---|---|
i | ignore case | 대소문자를 구별하지 않고 검색한다. |
g | Global | 문자열 내의 모든 패턴을 검색한다. |
m | Multi Line | 문자열의 행이 바뀌더라도 검색을 계속한다. |
const targetStr = 'AA BB Aa Bb';
// 임의의 문자 3개
const regexr = /.../;
.은 임의의 문자 한 개를 의미한다. 문장의 내용은 무엇이든지 상관없다. 위 예제의 경우 .를 3개 연속하여 패턴을 생성하였으므로 3자리 문자를 추출한다.
특정 단어로 시작하는지 검사한다.
const url = 'http://example.com';
// 'http'로 시작하는지 검사
// ^ : 문자열의 처음을 의미한다.
const regexr = /^http/;
console.log(regexr.test(url)); // true
숫자인지 검사한다.
const targetStr = '12345';
// 모두 숫자인지 검사
// [^]: 부정(not)을 의미한다. 얘를 들어 [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
// [] 바깥의 ^는 문자열의 처음을 의미한다.
const regexr = /^\d+$/;
console.log(regexr.test(targetStr)); // true