var myVar = "Hello";
var myVar = "World"; // 재선언 가능
myVar = "!" // 재할당 가능
console.log(myVar); // "!"
let myLet = "Hello";
let myVar = "World";// 오류 발생, 재선언 불가능
myLet = "!"; // 재할당 가능
console.log(myLet);
const myConst = "Hello";
const myConst = "Worle"; // 오류 발생
myConst = "!"; // 오류 발생
console.log(myConst);
console.log(1 + "2"); // "12"
console.log("1" + true); // "1true"
console.log("1" + {}); // "1[object Object]"
console.log("1" + null); // "1null"
console.log("1" + undefined); // "1undefined"
console.log(1 - "2"); // -1
console.log("2" * "3"); // 6
console.log(4 + +"5"); // 9
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean("false")); // true
console.log(Boolean({})); // true
객체 메소드
a. Object.keys()
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let keys = Object.keys(person);
console.log(keys); // ["name", "age", "gender"]
b. Object.values()
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let values = Object.values(person);
console.log(values); // ["홍길동", 30, "남자"]
c. Object.entries()
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let entries = Object.entries(person);
console.log(entries);
d. Object.assign()
let person = {
name: "홍길동",
age: 30,
gender: "남자"
};
let newPerson = Object.assign({}, person, { age: 35 });
console.log(newPerson); // { name: "홍길동", age: 35, gender: "남자" }
객체비교
let person1 = {
name: "홍길동",
age: 30,
gender: "남자"
};
let person2 = {
name: "홍길동",
age: 30,
gender: "남자"
};
console.log(person1 === person2); // false
console.log(JSON.stringify(person1) === JSON.stringify(person2)); // true
데이터 타입
기본형과 참조형을 나누는 기준: "불변성"
(이미지 출처: https://velog.io/@imjkim49/자바스크립트-데이터-타입-정리)
기본형 데이터의 변수 선언과 데이터 할당
/** 선언과 할당을 풀어 쓴 방식 */
var str;
str = 'test!';
/** 선언과 할당을 붙여 쓴 방식 */
var str = 'test!';
(이미지 출처: 스파르타 코딩 클럽, JavaScript 문법 종합반)
자유로운 데이터 변환
메모리의 효율적 관리
메모리 주소 공간의 데이터는 자료형 중 작은 편인다.
etc. 변수 vs 상수
변수 영역에서 변경 가능 여부에따라
변수 | 상수 |
---|---|
변경 가능 | 변경 불가능 |
etc. 불변하다 vs 불변하지 않다
데이터 영역에서 변경가능 여부에 따라
불변하지 않다 | 불변하다 |
---|---|
변경 가능 | 변경 불가능 |
// 참조형 데이터는 별도 저장공간(obj1을 위한 별도 공간)이 필요합니다!
var obj1 = {
a: 1,
b: 'bbb,
};
(이미지 출처: 스파르타 코딩 클럽, JavaScript 문법 종합반)
// 데이터를 변경!
obj.1.a = 2;
var obj = {
x: 3,
arr: [3, 4, 5],
}
// STEP01. 선언
var a = 10; //기본형
var obj1 = { c: 10, d: 'ddd' }; //참조형
// STEP02. 복사
var b = a; //기본형
var obj2 = obj1; //참조형
// STEP03. 복사 이후 값 변경
b = 15;
obj2.c = 20;
영향 없음
obj1까지 변경이 됨
// 기본형 변수 복사의 결과는 다른 값!
a !== b;
// 참조형 변수 복사의 결과는 같은 값!(원하지 않았던 결과😭)
obj1 === obj2;
// user 객체를 생성
var user = {
name: 'wonjang',
gender: 'male',
};
// 이름을 변경하는 함수, 'changeName'을 정의
// 입력값 : 변경대상 user 객체, 변경하고자 하는 이름
// 출력값 : 새로운 user 객체
// 특징 : 객체의 프로퍼티(속성)에 접근해서 이름을 변경했다 -> 가변
var changeName = function (user, newName) {
var newUser = user;
newUser.name = newName;
return newUser;
};
// 변경한 user정보를 user2 변수에 할당
// 가변이기 때문에 user1도 영향을 받게 된다
var user2 = changeName(user, 'twojang');
// 결국 아래 로직은 skip하게 된다
if (user !== user2) {
console.log('유저 정보가 변경되었습니다.');
}
console.log(user.name, user2.name); // twojang twojang
console.log(user === user2); // true
var copyObject = function (target) {
var result = {};
// for ~ in 구문을 이용하여, 객체의 모든 프로퍼티에 접근할 수 있습니다.
// 하드코딩을 하지 않아도 괜찮아요.
// 이 copyObject로 복사를 한 다음, 복사를 완료한 객체의 프로퍼티를 변경하면
// 되겠죠!?
for (var prop in target) {
result[prop] = target[prop];
}
return result;
}
var user = {
name: 'wonjang',
gender: 'male',
};
//
var user2 = copyObject(user);
user2.name = 'twojang';
//
if (user !== user2) {
console.log('유저 정보가 변경되었습니다.');
}
//
console.log(user.name, user2.name);
console.log(user === user2);
var copyObjectDeep = function(target) {
var result = {};
if (typeof target === 'object' && target !== null) {
for (var prop in target) {
result[prop] = copyObjectDeep(target[prop]);
}
} else {
result = target;
}
return result;
}
//결과 확인
var obj = {
a: 1,
b: {
c: null,
d: [1, 2],
}
};
var obj2 = copyObjectDeep(obj);
//
obj2.a = 3;
obj2.b.c = 4;
obj2.b.d[1] = 3;
//
console.log(obj);
console.log(obj2);
일반적으로는 자바스크립트 엔진에서 값이 있어야 할 것 같은데 없는 경우, 자동으로 부여한다
var a;
console.log(a); // (1) 값을 대입하지 않은 변수에 접근
//
var obj = { a: 1 };
console.log(obj.a); // 1
console.log(obj.b); // (2) 존재하지 않는 property에 접근
// console.log(b); // 오류 발생
var func = function() { };
var c = func(); // (3) 반환 값이 없는 function
console.log(c); // undefined
용도 : ‘없다’를 명시적으로 표현할 때
주의 : typeof null object인 것은 유명한 javascript 자체 버그이다
var n = null;
console.log(typeof n); // object
//동등연산자(equality operator)
console.log(n == undefined); // true
console.log(n == null); // true
//일치연산자(identity operator)
console.log(n === undefined);
console.log(n === null);
let i = 0;
do {
console.log(i);
i++;
} while (i < 10);
let, const
화살표 함수
삼항 연산자
구조분해 할당
단축 속성명
const name = "nbc"
const age = "30"
const obj = {
name,
age: newAge
}
const obj = {
name,
age
}
spreadOperator
나머지 매개 변수
템플릿 리터럴