원시 타입 자료형
과 1가지의 객체 타입 자료형
으로 구성console.log(typeof undefined); // output: undefined
console.log(typeof 123); //output: number
console.log(typeof 456n); //output: bigint
console.log(typeof true); //output: boolean
console.log(typeof "hello"); //output: string
console.log(typeof Symbol("id")); //output: symbol
console.log(typeof Math); //output: object
console.log(typeof null); //output: object
console.log(typeof console.log); //output: function
let name_check = true; // 네, name 입력이 확인되었습니다.
let age_check = false; // 아니오, age 입력이 확인되지 않았습니다.
let value_check = 10 > 3; // 비교 결과: 참 > true
console.log(value_check); // output: true
console.log(typeof null); //output: object < 하위 버전 호환성으로 object로 표기
const null_check = null;
console.log(null_check === null); //output: true
let name; //할당 후 초기화 하지 않음
console.log(name); //output: undefined
let num_1= 123.0;
let num_2= 123.456;
let num_3= 1 / 0;
let num_4= 123456n; // BigInt("123456")
console.log(num_1 - num_2); //output: -0.45600000000000307
console.log(num_1 - num_2).toFixed(3); //output: -0.456
console.log(num_3); //Infinity
console.log(num_1 / "hello"); // NaN
console.log(typeof num_4); // bigint
let str_1 = "hello_1";
let str_2 = 'hello_2';
let num = 3;
let str_3 = 'hello_${num}';
console.log(str_1); // output: hello_1
console.log(str_2); // output: hello_2
console.log(str_3); // output: hello_3
↓ 객체 예제 코드(1)
let user = {
name: "john", //key: name, value:"john"
age: 27, //key: age, value: 27
};
console.log(typeof user); //output: object
console.log(typeof user.name); //output: string
console.log(typeof user.age); //output: number
console.log(user.name); //output: "john"
console.log(user.age); //output: 27
user.age = 30;
console.log(user.age); //output: 30
↓ 객체 예제 코드(2)
-객체(object)에 개체(entity) 추가는 obj.key = value, 삭제는 delete 명령어를 통해 수행
let user = {
name: "john",
age: 27,
};
console.log(user); //output: {name: 'john', age:27}
user.weight = 72, //or user ["weight"] = 72;
console.log(user); //output: {name: 'john', age:27, weight: 72}
delete user.age;
console.log(user); //output: {name: 'john', weight: 72}
let user = {
name: "john",
age: 27,
};
let admin = user;
admin.name = "park";
console.log(admin.name); //output: "park"
console.log(user.name); //output: "park"
user.age = 30;
console.log(user.age); //output: 30
console.log(admin.age); //output: 30
위의 코드를 보면 admin의 name을 바꿨는데 건들지도 않았던 user의 name도 바뀌었고, 마찬가지로 admin의 age를 바꿨더니 user의 age도 같이 바뀌었다. 문제가 무엇일까.
얕은 복사
(shallow copy), 깊은 복사
(deep copy)를 통해 가능let user = {
name: "john",
age: 23,
};
let admin = {};
//shallow copy
for (let key in user) {
admin[key] = user[key];
}
admin.name = "park";
console.log(admin.name); // output: "park"
console.log(user.name); // output: "john"
let user = {
name: "john",
age: 23,
};
let admin_obj = Object.assign({}, user);
admin_obj.name = "park";
user.age = 30;
console.log(admin_obj.name); //output: "park"
console.log(user.name); //output: "john"
console.log(admin_obj.age); //output: "23"
console.log(user.age); //output: "30"
let user = {
name: "john",
age: 23,
};
let admin_spread = { ...user };
admin_spread.name = "park";
user.age = 30;
console.log(admin_spread.name); //output: "park"
console.log(user.name); //output: "john"
console.log(admin_spread.age); //output: "23"
console.log(user.age); //output: "30"
let user = {
name: "john",
age: 23,
sizes. {
height: 180,
weight: 72,
},
};
let admin_obj = Object.assign({},user);
admin_obj.sizes.weight++;
--admin_obj.sizes.height;
console.log(admin_obj.sizes.weight); //output: "73"
console.log(admin_obj.sizes.height); //output: "179"
console.log(user.sizes.weight); //output: "73"
console.log(user.sizes.height); //output: "179"
위 예제코드를 보면 객체 복사를 할 때와 마찬가지로 admin의 객체만 바꿨는데 user의 객체도 바뀌는 문제가 발생한다.
이런 문제를 해결하기 위해 나온 방법이 깊은 복사
이다.
let user = {
name: "john",
age: 23,
sizes: {height: 180, weight:72},
};
function copyObj(obj) {
let result = {};
for (let key in obj) {
if (typeof obj[key] === "object") result[key] = copyObj(obj[key]);
else result[key] = obj[key];
}
return result;
}
let admin = copyObj(user);
admin.sizes.weight++;
console.log(admin.sizes.weight); //output: 73
console.log(admin.sizes.height); //output: 72
let user = {
name: "john",
age: 23,
sizes: {height: 180, weight:72},
};
//stringify: js object > string, parse: string > js object
let admin_json = JSON.parse(JSON.stringify(user));
admin_json.sizes.weight++;
--admin_json.sizes.height;
console.log(admin_json.sizes.weight); //output: 73
console.log(admin_json.sizes.height); //output: 179
console.log(user.sizes.weight); //output: 72
console.log(user.sizes.height); //output: 180
위 예제코드를 보면 user의 객체를 string으로 변환하면서 참조가 끊기기 때문에 이후에 admin의 객체를 수정해도 user에는 영향을 끼치지 않는다.
정리하자면 얕은 복사는 "주소 값"을 복사한다는 의미이고, 깊은 복사는 "실제 값"을 새로운 메모리 공간에 복사한다는 의미이다.