
๐ javascript์์ key : value ํํ๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ด ์๋ค.
1. ๊ฐ์ฒด์ ํํ
key์ value ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐํ์
๋ก
{...}์์ key : value ํํ๋ก ์ง์ด๋ฃ์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ key์ value๋ฅผ ํ๋กํผํฐ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
let user = { // ๊ฐ์ฒด
name: "John", // ํค: "name", ๊ฐ: "John"
age: 30 // ํค: "age", ๊ฐ: 30
};
name๊ณผ Johnage์ 30๊ฐ์ฒด๋ ์๋์ฅ๊ณผ ๊ฐ์ต๋๋ค. ๋ด ํ์ผ์ ์ด๋ฉด ๋์ ์ด๋ฆ, ๋์ด๊ฐ ๋์์๊ณ , ๊ทธ๋ ๊ฒ ์๋ฐฑ๊ฐ ํน์ ์๋ง๊ฐ์ ์๋ฃ๋ค์ ์์ ์ ์์ต๋๋ค. key๊ฐ๊ณผ value๊ฐ์ ์ ์ ์์ด ๊ฐ๋ ์ฑ ๋ํ ์ข์ต๋๋ค.
์ํ๋ ํ๋กํผํฐ ๊ฐ ์ป๊ธฐ
// ํ๋กํผํฐ ๊ฐ ์ป๊ธฐ
alert( user.name ); // John
alert( user.age ); // 30
์ํ๋ ํ๋กํผํฐ ์ญ์
delete user.age;
์ฌ๋ฌ ๋จ์ด๋ฅผ ์กฐํฉํด ๋ง๋ ํ๋กํผํฐ๋ ๋ฐ์ดํ ์ฒ๋ฆฌ
likes + birds ๋ "likes birds"๋ก ์ฒ๋ฆฌํ๋ค.
let user = {
name: "John",
age: 30,
"likes birds": true // ๋ณต์์ ๋จ์ด๋ ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํฉ๋๋ค.
};
๋ฐ์ดํ ์ฒ๋ฆฌํ ๊ฐ์ฒด์ ๋ณ์๋ []๋๊ดํธ ํ๊ธฐ๋ฒ
'๋๊ดํธ ํ๊ธฐ๋ฒ(square bracket notation)'
let user = {};
// set
user["likes birds"] = true;
// get
alert(user["likes birds"]); // true
// delete
delete user["likes birds"];
key๋ฅผ ํ์ฉํ์ฌ ์ํ๋ ํ๋กํผํฐ๋ฅผ ์ถ์ถํ ์ ์๊ฒ๋ ๊ตฌํํ ์ ์๋ค.
let user = {
name: "John",
age: 30
};
let key = prompt("์ฌ์ฉ์์ ์ด๋ค ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ์ผ์ ๊ฐ์?", "name");
// ๋ณ์๋ก ์ ๊ทผ
alert( user[key] ); // John (ํ๋กฌํํธ ์ฐฝ์ "name"์ ์
๋ ฅํ ๊ฒฝ์ฐ)
๊ณ์ฐ๋ ํ๋กํผํฐ(computed property)
ํ๋กํผํฐ ํค๊ฐ ๋๊ดํธ๋ก ๋๋ฌ์ธ์ฌ ์๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ๊ณ์ฐ๋ ํ๋กํผํฐ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
let fruit = prompt("์ด๋ค ๊ณผ์ผ์ ๊ตฌ๋งคํ์๊ฒ ์ต๋๊น?", "apple");
let bag = {
[fruit]: 5, // ๋ณ์ fruit์์ ํ๋กํผํฐ ์ด๋ฆ์ ๋์ ์ผ๋ก ๋ฐ์ ์ต๋๋ค.
};
alert( bag.apple ); // fruit์ "apple"์ด ํ ๋น๋์๋ค๋ฉด, 5๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
let fruit = prompt("์ด๋ค ๊ณผ์ผ์ ๊ตฌ๋งคํ์๊ฒ ์ต๋๊น?", "apple");
let bag = {};
// ๋ณ์ fruit์ ์ฌ์ฉํด ํ๋กํผํฐ ์ด๋ฆ์ ๋ง๋ค์์ต๋๋ค.
bag[fruit] = 5;
ํ๋กํผํฐ ํจ์ถํ๊ธฐ
ํ๋กํผํฐ์ ์ด๋ฆ๊ณผ ๊ฐ์ด ๋์ผํ๋ฉด ํจ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฅผ ํ๋กํผํฐ ๊ฐ ๋จ์ถ ๊ตฌ๋ฌธ(propery value shorthand)๋ผ๊ณ ํฉ๋๋ค.
function makeUser(name, age) {
return {
name, // name: name ๊ณผ ๊ฐ์
age, // age: age ์ ๊ฐ์
// ...
};
}
ํ๋กํผํฐ ์ด๋ฆ์ ์ ์ฝ์ฌํญ
๋ณ์์๋ ์์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ง๋ง, ํ๋กํผํฐ๋ ๊ฐ๋ฅํ๋ค.
// ์์ฝ์ด๋ฅผ ํค๋ก ์ฌ์ฉํด๋ ๊ด์ฐฎ์ต๋๋ค.
let obj = {
for: 1,
let: 2,
return: 3
};
alert( obj.for + obj.let + obj.return ); // 6
in ์ฐ์ฐ์๋ก ํ๋กํผํฐ ์กด์ฌ ์ฌ๋ถ ํ์
ํ๊ธฐ
javascript์์๋ ์กด์ฌํ์ง ์๋ ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค ํด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๋ชจ๋ undefined ๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
let user = {};
alert( user.noSuchProperty === undefined ); // true๋ 'ํ๋กํผํฐ๊ฐ ์กด์ฌํ์ง ์์'์ ์๋ฏธํฉ๋๋ค.
"key" in object
let obj = {
test: undefined
};
alert( obj.test ); // ๊ฐ์ด `undefined`์ด๋ฏ๋ก, ์ผ๋ฟ ์ฐฝ์ undefined๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋กํผํฐ test๋ ์กด์ฌํฉ๋๋ค.
alert( "test" in obj ); // `in`์ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ์ ๋ฌด๋ฅผ ์ ๋๋ก ํ์ธํ ์ ์์ต๋๋ค(true๊ฐ ์ถ๋ ฅ๋จ).
for in ๋ฐ๋ณต๋ฌธ
์๋์ฒ๋ผ for..in ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ๊ฐ์ฒด์ ๋ชจ๋ ํค๋ฅผ ์ํํ ์ ์ใ
๋ธ๋๋ค.
์๋ ์์๋ฅผ ์คํํ๋ฉด ๊ฐ์ฒด user์ ๋ชจ๋ ํ๋กํผํฐ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
let user = {
name: "John",
age: 30,
isAdmin: true
};
for (let key in user) {
// ํค
alert( key ); // name, age, isAdmin
// ํค์ ํด๋นํ๋ ๊ฐ
alert( user[key] ); // John, 30, true
}
ํ๋กํผํฐ์๋ ์์๊ฐ ์์๊น?
๋ฐ๋ณต๋ฌธ์ ์คํํ๋ฉด ์ด๋ค ์์๋ก ์ํํ ๊น?
๊ฐ์ฒด๋ 'ํน๋ณํ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ'๋ฉ๋๋ค.
let codes = {
"49": "๋
์ผ",
"41": "์ค์์ค",
"44": "์๊ตญ",
// ..,
"1": "๋ฏธ๊ตญ"
};
for (let code in codes) {
alert(code); // 1, 41, 44, 49
}
์์ ์์๋ก for..in ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ฉด
1๋ฒ์ธ ๋ฏธ๊ตญ๋ถํฐ 41,44,49 ์ฐจ๋ก๋๋ก ์ ๋ ฌ๋ฉ๋๋ค.๊ฐ์ฒด์ ์์ ํ์ ์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด ์ค ํ๋๋ ๊ฐ์ฒด๋ โ์ฐธ์กฐ์ ์ํด(by reference)โ ์ ์ฅ๋๊ณ ๋ณต์ฌ๋๋ค๋ ๊ฒ์ ๋๋ค.
let message = "Hello!";
let phrase = message;
์๋ฅผ ๋ค๋ฉด) ๋๊ฐ์ ๋
๋ฆฝ๋ ๋ณ์์ ๊ฐ๊ฐ ๋ฌธ์์ด Hello!๊ฐ ์ ์ฅ์ด ๋ฉ๋๋ค.
๊ฐ์ฒด์ ๋์๋ฐฉ์์ ์ด์ ๋ค๋ฆ
๋๋ค.
๋ณ์์ ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋, ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋ '๋ฉ๋ชจ๋ฆฌ ์ฃผ์'์ธ ๊ฐ์ฒด์ ๋ํ '์ฐธ์กฐ๊ฐ' ์ด ์ ์ฅ๋ฉ๋๋ค.
์ด ๋ง์ด ๋ฌด์จ ๋ง์ด๋๋ฉด
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // 'admin' ์ฐธ์กฐ ๊ฐ์ ์ํด ๋ณ๊ฒฝ๋จ
alert(user.name); // 'Pete'๊ฐ ์ถ๋ ฅ๋จ. 'user' ์ฐธ์กฐ ๊ฐ์ ์ด์ฉํด ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํจ
admin์ name์ ์์ ํ๋๋ผ๋ user์ name์ด ์์ ๋ ์ฑ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์ฒด๊ฐ ํ ๋น๋ ๋ณ์๋ฅผ ๋ณต์ฌํ๋ฉด ๋์ผํ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ๊ฐ์ด ํ๋ ๋ ๋ง๋ค์ด์ง๋ค๋ ๊ฑธ ๋ฐฐ์ ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
let user = {
name: "John",
age: 30
};
let clone = {}; // ์๋ก์ด ๋น ๊ฐ์ฒด
// ๋น ๊ฐ์ฒด์ user ํ๋กํผํฐ ์ ๋ถ๋ฅผ ๋ณต์ฌํด ๋ฃ์ต๋๋ค.
for (let key in user) {
clone[key] = user[key];
}
// ์ด์ clone์ ์์ ํ ๋
๋ฆฝ์ ์ธ ๋ณต์ ๋ณธ์ด ๋์์ต๋๋ค.
clone.name = "Pete"; // clone์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
alert( user.name ); // ๊ธฐ์กด ๊ฐ์ฒด์๋ ์ฌ์ ํ John์ด ์์ต๋๋ค.
dest๊ฐ์ฒด๋ฅผ ๋ชฉํ๋กํ์ฌ src1, src2, scr3์ dest๊ฐ์ฒด์ ๋ชจ๋ ๋ณํฉ์์ผ ์ค๋๋ค.
Object.assign(dest, [src1, src2, src3...])
์์๋ ์๋์ ๊ฐ์ต๋๋ค.
let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
// permissions1๊ณผ permissions2์ ํ๋กํผํฐ๋ฅผ user๋ก ๋ณต์ฌํฉ๋๋ค.
Object.assign(user, permissions1, permissions2);
// now user = { name: "John", canView: true, canEdit: true }
์ค์ฒฉ ์์ ์ค์ฒฉ์ด ์๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ด๋ฅผ ์ค์ฒฉ ๊ฐ์ฒด๋ผ๊ณ ํฉ๋๋ค.
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
alert( user.sizes.height ); // 182
์๋์ ๊ฐ์ด ๊ฐ์ฒด ์์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋
๊ฐ์ฒด.key.key ๊ฐ์ ํตํด ๊น์ ๋ณต์ฌ(deep cloning)๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
let clone = Object.assign({}, user);
alert( user.sizes === clone.sizes ); // true, ๊ฐ์ ๊ฐ์ฒด์
๋๋ค.
// user์ clone๋ sizes๋ฅผ ๊ณต์ ํฉ๋๋ค.
user.sizes.width++; // ํ ๊ฐ์ฒด์์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
alert(clone.sizes.width); // 51, ๋ค๋ฅธ ๊ฐ์ฒด์์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค.