[JavaScript] Web 개발을 위한 JavaScript (7) - Object + Literal and properties + Object 생성법 + Computed properties + Property value shorthand +Constructor + in operator + for in vs for of + Object.assign
Object + Literal and properties + Object 생성법 + Computed properties + Property value shorthand +Constructor + in operator + for in vs for of + Object.assign
Object
1. Literal and properties
하나의 'primitive type'은 하나의 데이터만 담을 수 있다.
아래처럼 2개의 변수를 출력하는 함수를 만든다면, 2개의 파라미터를 전달해야 한다.
const name = 'ellie';
const age = 4;
print(name, age);
function print(name, age){
console.log(`name : ${name} , age : ${age}`);
}
하지만, 이렇게 작성하면 문제는 무엇일까?
인자가 많아지면 많아질수록 추가해야 하는 것들이 많아진다. 그리고 관리도 힘들어진다.
그래서 이것을 개선하고자 'Object'를 사용한다.
const ellie = {name: 'ellie', age:4};
print2(ellie);
function print2(person){
console.log(`Name : ${person.name}, Age : ${person.age}`);
}
Object를 만드는 방법
1) 퀄리 브래킷{} 사용 : object literal
2) 클래스 이용 : object constructor
const obj = {};
const obj2 = new Object();
ellie.hasJob = true; // 새로운 'Property' 추가,
console.log(ellie.hasJob);

delete ellie.hasJob;
console.log(ellie.hasJob);
※ 중요 Point!
'Object'는 'key'와 'value'의 집합체이다. => object = { key : value }
key : 우리가 접근할 수 있는 변수, Property
value : 'key'가 가지고 있는 값
2. Computed properties : 계산된 Peroperties
접근 방법
1) '.' 사용
2) 배열처럼 접근
console.log(ellie.name);
console.log(ellie['name']);
주의사항 : 배열처럼 접근할 때는, 'Key : Property'에 'String'으로 접근해야 한다.
아래처럼 접근하면 에러가 발생한다. 꼭 ' '을 붙여서 사용하자.
console.log(ellie[name]);
배열처럼 사용해도 'property'를 추가할 수 있다.
ellie['hasJob'] = true;
console.log(ellie.hasJob);
★☆그럼 어떤 걸 언제 써야 할까?!★☆
2번에 대해서 자세하게 설명하면 이렇다.
코딩하는 순간에는 'key'값이 뭐가 들어올지 모른다. 어떤 'key'가 필요한지 모르기 때문에, 배열처럼 사용해야 한다.
function printValue(obj, key){
//console.log(obj.key); // 이렇게 사용하면 'undefined'가 뜬다
console.log(obj[key])
}
printValue(ellie, 'name');
console.log(obj.key);처럼 사용한다면, 'obj'에 'key'라는 'property'가 있는 확인하는 것이다.
당연히 'key'라는 'property'는 존재하지 않으니까 '결과'는 'Undefined'가 나온다.
나중에 동적으로 key에 관련된 'value'를 받아올 때 유용하게 사용된다.
3. Property value shorthand
만약, 아래처럼 객체를 추가하고자 할 때, 또 계속 작성을 반복을 해야 할까?
const person1 = {name : 'bob', age:2};
const person2 = {name : 'steve', age:3};
const person3 = {name : 'dave', age:4};
기존에 배웠던 함수를 이용한다면 쉽게 만들 수 있다.
function makePerson(name, age){
return{
name : name,
age : age,
};
}
여기서 'JavaScript'에서는 'Property value shorthand'라는 특징 때문에,
'key'값과 'value'가 동일하다면, 1개는 생략이 가능하다.
function makePerson(name, age){
return{
name,
age,
};
}
const person4 = makePerson('ellie', 30);
console.log(person4);
4. Constructor function
'JavaScript'에서 '계산'을 하지 않고 순수하게 'Object'만 생성하는 함수들은
함수명을 대문자로 시작하는 명사 형태로 만든다. 위에서 작성한 함수를 아래처럼 변경할 수 있다.
function Person(name, age){
// this = {}; -> 생략된 코드
this.name = name;
this.age = age;
// return을 사용하지않고 'this'를 사용해서 작성한다.
// return = {}; -> 생략된 코드
}
const person5 = new Person('Son' , 29);
console.log(person5);
5. in operator : property existence check (key in obj)
해당하는 'Object'안에 'key'가 있는지 없는지 확인하는 기능이다.
존재한다면 'True', 존재하지 않는다면 'Fasle'를 리턴한다.
console.log('name' in ellie );
6. for...in vs for... of
6-1) for (key in obj)
'ellie'객체가 블록을 돌 때마다 'key'에 'ellie의 key'가 할당이 된다.
for ( key in ellie){
console.log(key);
}
6-2) for (value of obj)
const array = [1,2,3,4];
for (let i = 0; i<array.length; i++){
console.log(array[i]);
// 아주 일반적인 방법
// 하지만 소스코드가 길어지는 단점이 있다.
}
for(value of array){
console.log(value);
}
7. Fun cloning
객체를 복사하는 방법이다. 아래 코드를 보자.
const user = { name: 'ellie', age: 20};
const user2 = user;
그렇다면, 'user2'의 'name' 값을 바꾼다면?? 당연히 'user'의 'name'값도 변경될 것이다.
user2.name = 'coder';
console.log(user);
그렇다면, 이런 방법 말고 'Object'를 복사하는 방법은 없을까?
1) Old way : 임시 배열을 만들어서 for문을 사용해 옮겨 넣는 방법
const user3 = {};
for (key in user){
user3[key] = user[key];
}
console.log(user3);
2) New Way : Object.assign 사용
const user4 = {}; // 비어있는 'Target'을 정의
Object.assign(user4, user);
// Or const user4 = Object.assign({}, user);
console.log(user4);
++ New Way - another example
여러 개를 전달하는 경우에는 동일한 'Property'인 경우에는 뒤에 나오는 인자가, 앞에 나오는 인자의 값을 덮어 버린다.
fruit1이 fruit2의 'color' 값을 덮어 버렸기 때문에, 'red'가 출력되는 것이다.
// 여러개를 전달 할 경우
const fruit1 = {color : 'red'};
const fruit2 = {color : 'blue', size:'big'};
const mixed = Object.assign({}, fruit2, fruit1);
console.log(mixed.color);
console.log(mixed.size);
//새로운 함수를 공부할때는 어떤 'Parameter'를 취하고 'Retrun'은 뭐로하는지 파악하는 습관을 들이자!
/**
* Copy the values of all of the enumerable own properties from one or more source objects to a
* target object. Returns the target object.
* @param target The target object to copy to.
* @param source The source object from which to copy properties.
*/
assign<T, U>(target: T, source: U): T & U;