๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

200302

ยท ์•ฝ 7๋ถ„

์ด ๊ธ€์€ ๊ณ ํ˜„์ค€, ์†กํ˜•์ฃผ ๋‹˜์˜ ์ธ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ์ฐธ์กฐํ•˜์—ฌ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

JavaScript ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ž (๊ณ„์†)#

์ฐธ์กฐ ํƒ€์ž…(๊ฐ์ฒด ํƒ€์ž…)#

for in ๋ฌธ๊ณผ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ถœ๋ ฅ#

for in ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ์ฒด์— ํฌํ•จ๋œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค .

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ†ตํ•œ foo ๊ฐ์ฒด ์ƒ์„ฑvar foo = {    name: 'foo',    age: 30,    major: 'computer science',};
// for in ๋ฌธ์„ ์ด์šฉํ•œ ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์ถœ๋ ฅfor (var prop in foo) {    console.log(prop, foo[prop]);}

[์ถœ๋ ฅ ๊ฒฐ๊ณผ]

name fooage 30major computer science

for in ๋ฌธ์ด ์ˆ˜ํ–‰๋˜๋ฉด์„œ prop ๋ณ€์ˆ˜์— foo ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•˜๋‚˜์”ฉ ํ• ๋‹น๋˜๊ณ , prop ์— ํ• ๋‹น๋œ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ foo[prop] ์™€ ๊ฐ™์ด ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์‚ญ์ œ#

JS ์—์„œ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ delete ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์ฆ‰์‹œ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ delete ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ญ์ œํ•  ๋ฟ, ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ํ†ตํ•œ foo ๊ฐ์ฒด ์ƒ์„ฑvar foo = {    name: 'foo',    nickname: 'babo',};
console.log(foo.nickname); // (์ถœ๋ ฅ๊ฐ’) babodelete foo.nickname; // (์ถœ๋ ฅ๊ฐ’) nickname ํ”„๋กœํผํ‹ฐ ์‚ญ์ œconsole.log(foo.nickname); // (์ถœ๋ ฅ๊ฐ’) undefined
delete foo; // (์ถœ๋ ฅ๊ฐ’) foo ๊ฐ์ฒด ์‚ญ์ œ ์‹œ๋„console.log(foo.name); // (์ถœ๋ ฅ๊ฐ’) foo

์ฐธ์กฐ ํƒ€์ž…์˜ ํŠน์„ฑ#

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์ธ ์ˆซ์ž, ๋ฌธ์ž์—ด, boolean, null, undefined 5๊ฐ€์ง€๋ฅผ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฐ’์€ ๊ฐ์ฒด๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ ํ•จ์ˆ˜ ๋˜ํ•œ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š”์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ฐ์ฒด์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ด ์‹ค์ œ ๊ฐ’์ด ์•„๋‹Œ ์ฐธ์กฐ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

var objA = {    value: 40,};var objB = objA;
console.log(objA.value); // 40console.log(objB.value); // 40
objB.value = 50;
console.log(objA.value); // 50console.log(objB.value); // 50
var a = 40;var b = a;
console.log(a);console.log(b);
b = 50;
console.log(a);console.log(b);

objA ๋Š” ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ’์„์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

objB ์— objA ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์ฐธ์กฐ๊ฐ’์ด objB ์— ์ „๋‹ฌ๋˜๊ณ , objB ์™€ objA ๊ฐ€๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์–ด objB.value ์˜ ๊ฐ’์„ 50์œผ๋กœ ๊ฐฑ์‹ ํ•˜์ž objA.value ์˜๊ฐ’๋„ 50์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋ฐ˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ธฐ๋ณธ ํƒ€์ž…์ธ a , b ์˜ ๊ฒฝ์šฐ๋Š” b ์— a ๋ฅผ ํ• ๋‹นํ•  ๋•Œ, ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ b ๋ฅผ 50์œผ๋กœ ๊ฐฑ์‹ ํ•ด๋„ a ์˜ ๊ฐ’์€ 40์œผ๋กœ ์œ ์ง€๋œ๋‹ค.


Call by value vs Call by reference


๊ฐ์ฒด ๋น„๊ต ( == )#

๋™๋“ฑ ์—ฐ์‚ฐ์ž( == )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๋•Œ๋„ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’์ด ์•„๋‹Œ ์ฐธ์กฐ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

var objA = {    value: 100,};
var objB = {    value: 100,};
var objC = objB;
console.log(objA.value == objB.value); // trueconsole.log(objA == objB); // falseconsole.log(objB == objC); // true

objA.value ์™€ objB.value ๋ฅผ ๋™๋“ฑ ์—ฐ์‚ฐ์ž( == )๋กœ ๋น„๊ตํ•˜๋ฉด, true ๊ฐ€ ๋˜๋Š”๋ฐ์ด ๋‘˜์€ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ๊ฐ’ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด objA ์™€ objB ๋Š” ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์˜ ์ฐธ์กฐ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— false ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

objC ๋Š” objB ์˜ ์ฐธ์กฐ๊ฐ’์„ ๋ณต์‚ฌํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์—, true ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.


ํ‘œ์ค€ ๋™์น˜ ( == ) vs ์—„๊ฒฉ ๋™์น˜ ( === )

== : ๋‘ ํ”ผ์—ฐ์‚ฐ์ž์˜ ์ž๋ฃŒํ˜•์ด ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ™์•„์ง€๋„๋ก ๋ณ€ํ™˜ํ•œ ํ›„, ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋ชจ๋‘ ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค. - ์ˆซ์ž์™€ ๋ฌธ์ž์—ด ๋น„๊ต์‹œ์—” ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Number *์ž๋ฃŒํ˜• ๊ฐ’์œผ๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค.

  • ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ž๊ฐ€* Boolean ์ธ ๊ฒฝ์šฐ true ๋Š” 1, false ๋Š” 0์œผ๋กœ๋ณ€ํ™˜ํ•œ๋‹ค. - ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž์™€ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ, ์—ฐ์‚ฐ์ž๋Š” ์šฐ์„  ๊ฐ์ฒด์˜ valueOf() ๋˜๋Š” toString() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ํ˜น์€ ์ˆซ์ž ๊ฐ’์„ ๋ฐ›์œผ๋ ค ์‹œ๋„ํ•œ๋‹ค.

=== : ์ž๋ฃŒํ˜• ๋ณ€ํ™˜ ์—†์ด ๋‘ ์—ฐ์‚ฐ์ž๊ฐ€ ์—„๊ฒฉํžˆ ๊ฐ™์€์ง€ ํŒ๋ณ„ํ•œ๋‹ค. ๋ชจ๋‘ ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ๊ฐ’ ๋น„๊ตํ•œ๋‹ค.

- ๐Ÿ”— MDN web docs - ๋น„๊ต ์—ฐ์‚ฐ์ž ์—์„œ


์ฐธ์กฐ์— ์˜ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹#

๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ์‹๋„ ๋‹ค๋ฅด๋‹ค.

๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ณต์‚ฌ๋œ ๊ฐ’์ด์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ ์ธ์ž๋กœ ์ฐธ์กฐ ํƒ€์ž…์ธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ• ๊ฒฝ์šฐ, ์ธ์ž๋กœ ๋„˜๊ธด ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์‹ค์ œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

var a = 10;var objA = {    value: 10,};
function changeArg(num, obj) {    num = 20;    obj.value = 20;
    console.log(num); // 20    console.log(obj.value); // 20}
changeArg(a, objA);
console.log(a); // 10 (๋ฐ”๋€Œ์ง€ ์•Š์Œ)console.log(objA.value); // 20 (๋ฐ”๋€œ)